当我编译这个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}$
这依赖于假设_
是通常的下标字符。