tex4ht 在 mathjax 模式下不处理 \ifdefined\HCode

tex4ht 在 mathjax 模式下不处理 \ifdefined\HCode

这仅是 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&amp;-3 &amp;0\\ 3 &amp;3 i &amp;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

答案1

TeX4ht 当然无法在数学环境中解释您的代码,因为它们是逐字传递给 HTML 代码的。当您显示 HTML 代码时,它们由 MathJax 解释,而 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 中的呈现方式如下:

在此处输入图片描述

相关内容