tex4ht не обрабатывает \ ifdefined \ HCode в режиме mathjax
Это проблема только с tex4ht.
Я впервые обнаружил, что tex4ht не обрабатывается \ifdefined\HCode.
Я \ifdefined\HCodeввожу уравнение, так как мне нужен другой код для режима HTML и PDF.
tex4htне обрабатывает ifdefinedи оставляет его там. Когда mathjaxего видит, он жалуется, так как mathjax оффкурс ничего не знает ifdefined\HCode.
Когда код скомпилирован без использования, mathjaxон работает нормально. Но мне нужно пользоваться mathjax.
Вот 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}
Приведенное выше скомпилировано с использованием lualatex foo3.texи дает
Но компиляция с make4ht -ulm default -a debug foo3.tex "mathjax,htm"его использованием дает
Это необработанный HTML. он показывает, что \ifdefined\HCodeне был обработан и оставлен там
<!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>
Скомпилировано с использованием make4ht -ulm default -a debug foo3.tex "htm"работает без проблем и дает
Проблема заключается в том, что tex4ht не заглядывает внутрь уравнения, чтобы увидеть, что есть чем заняться, а просто передает все это целиком mathjax.
ОБНОВИТЬ
Я нашел обходной путь. То есть поместить \ifdefined\HCodeза пределы всего и дважды продублировать весь код, включая arrayкод. Я надеялся избежать этого. Но пока это работает. По какой-то причине включение \ifdefined\HCodeлюбого уравнения не работает с tex4ht в mathjaxрежиме.
\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
Ответы
TeX4ht, конечно, не может интерпретировать ваш код в математических средах, потому что они дословно передаются в HTML-код. Они интерпретируются MathJax, когда вы показываете HTML-код, а MathJax, конечно, ничего не знает \ifdefined\HCode, поэтому игнорирует его. Вам нужно либо продублировать ваш код и позволить LaTeX интерпретировать ваш код, либо вы можете попробовать использовать настраиваемую среду и передать альтернативное определение MathJax. Что может работать, а может и не работать.
Например, похоже, что это работает:
\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}
Я определил \mathjaxaltмакрос, который принимает два параметра, первый содержит код для MathJax, второй содержит код для обычного LaTeX. Вам необходимо предоставить определение этого макроса для MathJax в файле конфигурации:
\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
Это определение:
macros: {
mathjaxalt: ["\#1",2],
}
Он использует первый параметр, в отличие от исходного определения, в котором используется второй параметр.
Вот как это отображается в HTML: