tex4ht ne gère pas \ ifdefined \ HCode en mode mathjax
C'est un problème avec tex4ht uniquement.
C'est la première fois que je trouve où tex4ht ne traite pas \ifdefined\HCode.
J'ai mis \ifdefined\HCodeune équation, car j'ai besoin d'un code différent pour le mode HTML et pdf.
tex4htne traite pas le ifdefinedet le laisse là. Quand le mathjaxvoit, il se plaint puisque mathjax offcourse ne sait rien ifdefined\HCode.
Lorsque le code est compilé sans utiliser, mathjaxcela fonctionne bien. Mais j'ai besoin d'utiliser mathjax.
Voici 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}
Ce qui précède compilé OK en utilisant lualatex foo3.texet donne
Mais compiler en l'utilisant make4ht -ulm default -a debug foo3.tex "mathjax,htm"donne
C'est le HTML brut. il montre que le \ifdefined\HCoden'a pas été traité et laissé là-dedans
<!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>
Compilé avec make4ht -ulm default -a debug foo3.tex "htm"fonctionne sans problème et donne
Le problème semble que tex4ht ne regarde pas à l'intérieur de l'équation pour voir qu'il y a quelque chose à faire, et passe simplement le tout mathjax.
METTRE À JOUR
J'ai trouvé une solution de contournement. Ce qui est de tout mettre en \ifdefined\HCodedehors de tout, et de dupliquer le code entier deux fois, y compris le arraycode. J'espérais éviter cela. Mais cela fonctionne pour le moment. Pour une raison quelconque, \ifdefined\HCodeinsérer une équation dans une équation ne fonctionne pas avec tex4ht en mathjaxmode.
\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
Réponses
TeX4ht ne peut bien sûr pas interpréter votre code dans des environnements mathématiques, car ils sont transmis textuellement au code HTML. Ils sont interprétés par MathJax lorsque vous affichez le code HTML et MathJax ne sait bien sûr rien \ifdefined\HCode, donc il l'ignore. Vous devez soit dupliquer votre code et laisser LaTeX interpréter votre code, soit essayer d'utiliser un environnement personnalisé et transmettre une définition alternative à MathJax. Ce qui peut ou non fonctionner.
Par exemple, cela semble fonctionner:
\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}
J'ai défini la \mathjaxaltmacro, qui prend deux paramètres, la première contient du code pour MathJax, la seconde contient du code pour LaTeX standard. Vous devez fournir une définition de cette macro pour MathJax dans un fichier de configuration:
\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
Voici la définition:
macros: {
mathjaxalt: ["\#1",2],
}
Il utilise le premier paramètre, par opposition à la définition d'origine, qui utilise le deuxième paramètre.
Voici comment il est rendu en HTML: