分析

分析

当我编译这个MWE时:

\documentclass[a4paper,12pt]{article}
\begin{document}
Test $x_\mathit{in}$
\end{document}

latex...它与和完美配合pdflatex。如果我尝试使用htlatex它,它会阻塞:

! Argument of \new:mfont has an extra }.
<inserted text> 
                \par 
l.7 Test $x_\mathit{
                    in}$

我究竟做错了什么?

(顺便说一句:如果有人可以给我提供一份关于的综合文档htlatex,请告诉我...我今天的谷歌功力很低)。

编辑我发现如果我写:

...$x_{\mathit{in}}$ 

(加上额外的括号)就可以了。但我仍然想知道为什么……

这是 Ubuntu 14.04 中的标准(发行版提供的)完整 LaTeX 安装。

答案1

分析

tex4ht.sty被加载时,也就是在使用 进行处理时htlatex,该字符_在 TeX 中并不像平常一样具有类别代码 8,而是类别代码 12,并且它变为“数学活动”,因此,当在数学模式下扫描它时,TeX 会将其视为活动字符,其定义如下

_=macro:
->\ifmmode \expandafter \pr:sb \else \expandafter \sys:sb \fi .

所以现在\pr:sb还剩下,因为我们处于数学模式(保留的宏tex4ht.sty名称中有冒号)。这是定义:

\pr:sb ->\ifx \EndPicture \:UnDef \expandafter \Protect \expandafter \S:b \else
 \expandafter \s:b \fi 

在您的例子中,\EndPicture(我忽略了函数)没有定义,所以替换的是,\Protect\S:b问题就在这里开始。宏\Protect在这种情况下无关紧要(它类似于通常的\protect),并且\S:b

\S:b #1->\def \SuB: {#1}\futurelet \:temp \sub:sup 

好的,#1所以\mathit我们有

\def\SuB:{\mathit}\futurelet\:temp\sub:sup

我不会再关注处理过程了:我们的想法是,存储在中的\SuB就是要加下标的内容,因此你得到的等价于

x_{\mathit}

这绝对是错误的。

如果\EndPicture定义了,\s:b将被使用,这将产生一个正常的_8 个` 字符,并且编译将继续进行而不会出现错误;但是,输出将不正确:“”以较小的字体出现,但不是下标。

结论

总是使用$x_{\mathit{in}}$。正如我在回答中解释的那样为什么 `x_\text y` 有效?,事实上,$x_\mathit{in}$这依赖于假设_是通常的下标字符。

相关内容