章节标题中的波浪号 + amsmath & hyperef & silent 导致崩溃

章节标题中的波浪号 + amsmath & hyperef & silent 导致崩溃

我偶然发现了一个 LaTeX 崩溃(超出容量,参数堆栈大小=10000),并将其浓缩为下面的最小工作示例。我猜想这是其中一个软件包中的错误?有人能解释一下这里发生了什么吗?(​​如果这是一个错误,哪个软件包应该负责?)

我在当前的 TeX Live 上使用 CTAN 的所有更新时遇到了这个问题,但我相对确定在全新安装的 TeX Live 2018(没有任何 CTAN 更新)上也遇到了同样的问题。

\documentclass{article}

% uncommenting any one of these packages avoids the crash
\usepackage{amsmath}
\usepackage{hyperref}
\usepackage{silence}

\begin{document}
\section{$\tilde O$}
% \section[]{$\tilde O$}     % using this instead of line above also prevents crash, even with all three packages above
\end{document}

答案1

我想说这实际上不是一个错误。hyperref$在创建书签时删除了数学移位( )(您可以在日志中看到警告),这意味着 \tilde 现在应该正常地给出错误,因为它超出了数学范围。hyperref 中的代码试图阻止这种情况,但由于 silent 重新定义了 \PackageError,hyperref 代码现在失败了。

我认为最好的方法是使用\texorpdfstring以避免在书签中使用波浪符号。您还可以使用 \pdfstringdef 为波浪符号提供更安全的定义。

\documentclass{article}

% uncommenting any one of these packages avoids the crash
\usepackage{amsmath}
\usepackage{silence}

\usepackage{hyperref}
%\pdfstringdef{\tilde}{}
\begin{document}
\section{\texorpdfstring{$a\tilde{O}$}{aO}}

\end{document}

答案2

似乎silence已经破坏了正常的保护机制,最简单的方法是不使用该包(禁用警告似乎是一件可疑的事情),但你可以让\tildeetex\protected变得健壮,然后它又安全了,添加

\protected\expandafter\def\expandafter\tilde\expandafter{\tilde}

软件包使文档正常工作后(带有 hyperref 的警告)

答案3

\tilde无论如何,您都不会在书签中看到波浪符号,因此我建议在书签中添加定义。

silence之前加载hyperref

\documentclass{article}

\usepackage{amsmath}
\usepackage{silence}
\usepackage{hyperref}

\WarningFilter{hyperref}{Token not allowed}
\pdfstringdefDisableCommands{\let\tilde\relax}

\begin{document}

\section{$\tilde O$}

\end{document}

相关内容