tex4ht não manipula \ ifdefined \ HCode no modo mathjax
Este é um problema apenas com tex4ht.
Esta é a primeira vez que descobri onde tex4ht não processa \ifdefined\HCode.
Eu coloquei \ifdefined\HCodedentro de uma equação, já que preciso de um código diferente para o modo HTML vs. PDF.
tex4htnão processa o ifdefinede o deixa lá. Quando o mathjaxvê, ele reclama, pois o offcourse de mathjax não sabe de nada ifdefined\HCode.
Quando o código é compilado sem usar, mathjaxele funciona bem. Mas eu preciso usar mathjax.
Aqui 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}
O OK acima compilado usando lualatex foo3.texe dá
Mas compilar usando make4ht -ulm default -a debug foo3.tex "mathjax,htm"isso dá
Este é o HTML bruto. mostra que o \ifdefined\HCodenão foi processado e deixado lá
<!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&-3 &0\\ 3 &3 i &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 sem problemas e dá
O problema parece que tex4ht não olha dentro da equação para ver se há algo a fazer, e apenas passa a coisa toda mathjax.
ATUALIZAR
Eu encontrei uma solução alternativa. Que é colocar \ifdefined\HCodefora de tudo e duplicar o código inteiro duas vezes, incluindo o arraycódigo. Eu esperava evitar isso. Mas isso funciona por enquanto. Por alguma razão, colocar \ifdefined\HCodedentro de qualquer equação não funciona com tex4ht no 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
Respostas
É claro que o TeX4ht não pode interpretar seu código dentro de ambientes matemáticos, porque eles são passados para o código HTML literalmente. Eles são interpretados pelo MathJax quando você exibe o código HTML e o MathJax, claro, não sabe nada sobre ele \ifdefined\HCode, portanto, ele o ignora. Você precisa duplicar seu código e deixar o LaTeX interpretar seu código, ou você pode tentar usar um ambiente personalizado e passar uma definição alternativa para o MathJax. O que pode ou não funcionar.
Por exemplo, isso 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}
Eu defini a \mathjaxaltmacro, que leva dois parâmetros, primeiro contém código para MathJax, segundo contém código para LaTeX regular. Você precisa fornecer uma definição desta macro para MathJax em um arquivo de configuração:
\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 é a definição:
macros: {
mathjaxalt: ["\#1",2],
}
Ele usa o primeiro parâmetro, ao contrário da definição original, que usa o segundo parâmetro.
É assim que ele é renderizado em HTML: