为什么 \renewcommand{\Pr} 在使用 MathJax+htlatex 时会触发“限制控件必须遵循数学运算符”?

为什么 \renewcommand{\Pr} 在使用 MathJax+htlatex 时会触发“限制控件必须遵循数学运算符”?

我已经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.

相关内容