tex4ht no maneja \ ifdefined \ HCode en modo mathjax

Oct 02 2020

Este es un problema solo con tex4ht.

Esta es la primera vez que descubrí que tex4ht no procesa \ifdefined\HCode.

Pongo \ifdefined\HCodedentro de una ecuación, ya que necesito un código diferente para el modo HTML frente al modo pdf.

tex4htno procesa el ifdefinedy lo deja ahí. Cuando lo mathjaxve, se queja ya que Mathjax por supuesto no sabe nada ifdefined\HCode.

Cuando el código se compila sin usarlo mathjax, funciona bien. Pero necesito usar mathjax.

Aquí está MWE

\documentclass[12pt]{article}
\usepackage{array}
\begin{document}
\[
\ifdefined\HCode 
     \left[
     \begin{array}{ccc}
\else 
     \left[
     \begin{array}{@{}cc|c@{}}
\fi 
       3 i&-3 &0\\ 
       3 &3 i &0
    \end{array}
    \right]               
\]
test
\end{document}

Lo anterior compilado OK usando lualatex foo3.texy da

Pero compilar usándolo make4ht -ulm default -a debug foo3.tex "mathjax,htm"da

Este es el HTML sin procesar. muestra que \ifdefined\HCodeno se procesó y se dejó allí

<!DOCTYPE html> 
<html lang="en-US" xml:lang="en-US" > 
<head><title></title> 
<meta  charset="utf-8" /> 
<meta name="generator" content="TeX4ht (https://tug.org/tex4ht/)" /> 
<meta name="viewport" content="width=device-width,initial-scale=1" /> 
<link rel="stylesheet" type="text/css" href="foo3.css" /> 
<meta name="src" content="foo3.tex" /> 
<script>window.MathJax = { tex: { tags: "ams", inlineMath: [ ["\\\(","\\\)"] ], displayMath: [ ['$$','$$'], ["\\[","\\]"] ], processEscapes: true, processEnvironments: true, packages: ['base', 'color', 'ams'] }, loader: { load: ['[tex]/color', '[tex]/ams'] } }; </script> 
 <script type="text/javascript" async="async" id="MathJax-script" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml-full.js"></script>  
</head><body 
>
<!--l. 23--><p class="noindent" >\[ \ifdefined \HCode \left [ \begin{array}{ccc} \else \left [ \begin{array}{@{}cc|c@{}} \fi 3 i&amp;-3 &amp;0\\ 3 &amp;3 i &amp;0 \end{array} \right ] \]
</p><!--l. 25--><p class="indent" >   test
</p>   
 
</body> 
</html>

Compilado usando make4ht -ulm default -a debug foo3.tex "htm"funciona sin problema y da

El problema parece que tex4ht no mira dentro de la ecuación para ver que hay algo que hacer, y simplemente le pasa todo mathjax.

ACTUALIZAR

Encontré una solución. Que es poner \ifdefined\HCodefuera de todo y duplicar el código completo dos veces, incluido el arraycódigo. Esperaba evitar esto. Pero esto funciona por ahora. Por alguna razón, poner \ifdefined\HCodedentro cualquier ecuación no funciona con tex4ht cuando está en mathjaxmodo.

\documentclass[12pt]{article}
\usepackage{array}
\begin{document}
\ifdefined\HCode %tex4ht version
 \[
 \left[
     \begin{array}{ccc}
    3 i&-3&0\\ 
    0  &0 &0
     \end{array}
  \right]               
\]
\else %PDF version
\[
 \left[
     \begin{array}{@{}cc|c@{}}
    3 i&-3&0\\ 
    0  &0 &0
     \end{array}
  \right]               
\]
\fi 

\end{document}

TL 2020

Respuestas

3 michal.h21 Oct 02 2020 at 14:45

Por supuesto, TeX4ht no puede interpretar su código dentro de entornos matemáticos, porque se pasan al código HTML textualmente. MathJax los interpreta cuando muestra el código HTML y MathJax, por supuesto, no sabe nada \ifdefined\HCode, por lo que lo ignora. Necesita duplicar su código y dejar que LaTeX interprete su código, o puede intentar usar un entorno personalizado y pasar una definición alternativa a MathJax. Que puede funcionar o no.

Por ejemplo, esto parece funcionar:

\documentclass[12pt]{article}
\usepackage{array}
\newcommand\mathjaxalt[2]{#2}
\begin{document}
\[
 \mathjaxalt{%
     \left[
     \begin{array}{ccc}
     }{%
     \left[
     \begin{array}{@{}cc|c@{}}
     }%
       3 i&-3 &0\\ 
       3 &3 i &0
    \end{array}
    \right]               
\]
test
\end{document}

Definí la \mathjaxaltmacro, que toma dos parámetros, primero contiene código para MathJax, segundo contiene código para LaTeX normal. Debe proporcionar una definición de esta macro para MathJax en un archivo de configuración:

\Preamble{xhtml}
\Configure{MathJaxConfig}{{
    tex: {
      tags: "ams",
      \detokenize{%
      inlineMath: [ ["\\\(","\\\)"] ],
      displayMath: [ ['$$','$$'], ["\\[","\\]"] ]},
      processEscapes: true,
      processEnvironments: true,
      macros: {
        mathjaxalt: ["\#1",2],
      }
  },
  loader: {
    load: ['[tex]/color', '[tex]/ams']
  }
};
}
\begin{document}
\EndPreamble

Esta es la definición:

macros: {
   mathjaxalt: ["\#1",2],
}

Utiliza el primer parámetro, a diferencia de la definición original, que utiliza el segundo parámetro.

Así es como se representa en HTML: