我偶然发现了一个 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
已经破坏了正常的保护机制,最简单的方法是不使用该包(禁用警告似乎是一件可疑的事情),但你可以让\tilde
etex\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}