mtpro2 中的 \widetilde 在 \section 中不起作用

mtpro2 中的 \widetilde 在 \section 中不起作用

我正在使用软件包\widetilde提供的宏mtpro2。该宏在通常的段落中工作正常,但如果在 中使用,则会引发错误\section

平均能量损失

\documentclass{article}

\usepackage[lite]{mtpro2}

\begin{document}
\section{$\widetilde{O}$}
$\widetilde{O}$
\end{document}

错误是:

! Undefined control sequence.
\@widetilde ...extfont 3=\MTEXE@ }\else \def \TD@ 
                                                  {\textfont 3=\MTEXA@ }\fi ...
l.6 \section{$\widetilde{O}$}

宏也会出现类似的错误\widehat

答案1

命令\widecheck\widehat\widetilde根据 定义的\mathpalette;准确地说,\widetilde\mathpalette\@widetilde(其他两个类似),因此它们应该是健壮的。

这本身并不是脆弱的,但是如果文件报告而不是完全扩展,即使它没有引发错误,\mathpalette也会更好。.aux\widetilde\mathpalette\@widetilde

方法很简单

\documentclass{article}

\usepackage[lite]{mtpro2}
\usepackage{etoolbox}

\robustify\widetilde
\robustify\widehat
\robustify\widecheck

\begin{document}

\section{$\widetilde{O}\widehat{O}\widecheck{O}$}

\end{document}

历史

由于内存限制,LaTeX 内核无法使这么多命令变得健壮。因此\protect使用了该机制。近年来,内存开始不再是问题,\MakeRobust并被添加到内核中(而不必通过 来请求fixltx2e)。

LaTeX 健壮命令如何工作?如果执行\DeclareRobustCommand{\foo}[<n>]{...},LaTeX 将同时定义\foo\foo•(其中代表命令名称中的空格)。前者只是 的简写\protect\foo•,而后者才是真正的工作。

直到几年前,\widetilde它还没有被定义为一个强大的命令,因此输入如下命令

\documentclass{article}
\usepackage[lite]{mtpro2}
\MakeRobust\widetilde

是一种\widetilde适合在移动论点中使用的好方法。

直到 LaTeX 内核在增强更多命令方面迈出了一大步,其中包括广泛的数学重音。太好了!不再需要了\MakeRobust

嗯,差不多。不幸的是,mtpro2仍然如此\def\widetilde#1{...},这只会重新定义“表面”命令\widetilde,而\widetilde•不会改变。但现在\widetilde不够强大,在移动参数时会失败。所以我们再次应用\MakeRobust\widetilde,这不是很容易吗?

抱歉,不行:\MakeRobust无法知道命令是如何定义的,它会检查“内部”命令(名称后面带有空格)是否存在。如果找到,它会认为该命令已经很强大,因此不执行任何操作。

因此,使用 TeX Live 2020 或更高版本时,之前建议的解决方法\MakeRobust\widetilde不再起作用。

由于\robustify使用了一种非常不同的保护机制,因此可以解决这个问题。没什么大不了的:etoolbox是一个经过良好测试和维护的软件包。

否则,在应用之前必须删除“内部版本” \MakeRobust

\documentclass{article}

\usepackage[lite]{mtpro2}

\makeatletter
\newcommand{\ReallyMakeRobust}[1]{%
  \count@ =\escapechar \escapechar =`\\
  \expandafter\let\csname\expandafter\@gobble\string#1\space\endcsname\relax
  \escapechar=\count@
  \MakeRobust#1%
}
\makeatother

\ReallyMakeRobust\widetilde
\ReallyMakeRobust\widehat
\ReallyMakeRobust\widecheck

\begin{document}

\section{$\widetilde{O}\widehat{O}\widecheck{O}$}

\end{document}

相关内容