我已经ht5mjlatex.cfg
定义这里,以及foo.tex
包含:
\documentclass{article}
\renewcommand{\Pr}[1]{P(#1)}
\begin{document}
$\Pr{h}$
\end{document}
正如那篇文章中所述,我尝试将其转换为 MathJax-HTML。当我尝试
htlatex foo.tex ht5mjlatex.cfg
我收到以下错误:
! Limit controls must follow a math operator.
\n:limits: ->\o:limits:
\:l:mits
l.4 $\Pr
{h}$
?
! Emergency stop.
为什么这个问题是怎么发生的?我可以通过避免重新定义等方式解决这个问题\Pr
,但我实在无法理解它到底是怎么发生的。
答案1
您需要延迟\renewcommand
,否则它将被默认定义覆盖。
\documentclass{article}
\AtBeginDocument{%
\renewcommand{\Pr}[1]{P(#1)}%
}
\begin{document}
$\Pr{h}$
\end{document}
使用 的危险\renewcommand
。
答案2
由于这对于评论来说太长了:根据 egreg 的回答,我思考实际情况是,htlatex 在序言中添加了一个钩子,看起来像
\AtBeginDocument{\let\oldPr=\Pr \renewcommand\Pr{\oldPr\nolimits}}
附加代码用于生成 HTML 输出。
标准定义\Pr
是
\newcommand\Pr{\mathop{\operator@font Pr}}
因此,then 的一个示例用法\Pr{h}
将扩展为
\Pr{h}
\oldPr\nolimits{h}
\mathop{\operator@font Pr}\nolimits{h}
它给出了 的正确用法,\nolimits
因为它出现在 之后\mathop
。
现在将您的重新定义添加到序言中:
\renewcommand{\Pr}[1]{\mathop{P(#1)}}
现在的扩展\Pr{h}
看起来像
\Pr{h}
\oldPr\nolimits{h}
\mathop{P(\nolimits)}{h}
如您所见,\nolimits
现在被解析为新\Pr
定义的第一个参数,因此处于错误的位置,尤其是在之后\mathop
,这会给出您收到的错误消息
! Limit controls must follow a math operator.