我正在使用软件包\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}