请参阅最后的更新!
当日志文件太大时,我的 latex 编辑器 (TexStudio) 会发出警告。因此,我必须删除警告,这些警告大多是
第 x 页上的 Marginpar 已移动
我的文档大约有 1000 页,我将其用\cite
在页边空白处。所以我有数千条这样的警告。
我的想法是使用包silence
并设置适当的过滤器。但是当我包括
\usepackage{silence}
在序言中,即使没有设置过滤器、选项或相应的命令,渲染为 PDF 的时间似乎也是无限的。在我非常快的机器上,渲染通常需要 1-2 分钟。使用 silent 则需要无限长的时间,至少需要几个小时。当我中断时,我可以从日志中看到,只扫描了大约 60 章中的前几章。如果设置了过滤器,则会正确过滤掉相应的警告。当然,这些渲染时间使其无法工作。正如我在 MikTeX 包管理器中看到的那样,silence 包安装正确。我在命令\usepackage
之后立即包含了该命令\documentclass
,但如果我在序言的后面位置包含了它,行为也是一样的。我安装了几十个其他包,从来没有遇到过这样的事情。
存在什么问题?我该怎么办?
更新:
通过进一步测试,我发现我的一个子文件中的以下代码导致了包的无限循环silence
:
\subsection{text … $ \mathbb{R} $ … text}
在节标题中使用数学模式,但仅与宏 、 结合使用\mathbb
。\mathcal
其他宏工作良好,甚至是自定义宏。可能还有其他宏会导致挂断,但到目前为止,我只发现这两个。更改节标题其余文本的长度没有效果。在相关的 2 个节标题中的数学模式中消除这些宏会导致相应的子文件得到快速而正确的处理。所有不必要的警告都消失了。
答案1
以下会产生无限循环:
\RequirePackage{silence}
\documentclass{article}
\usepackage{amsmath,amssymb}
\usepackage{hyperref}
\begin{document}
\section{Something about $\mathbb{R}$, plus other things}
\end{document}
另一方面,这将完美地编译。
\RequirePackage{silence}
\documentclass{article}
\usepackage{amsmath,amssymb}
\usepackage{hyperref}
\WarningFilter{latex}{Marginpar on page}
\WarningFilter{hyperref}{Token not allowed}
\pdfstringdefDisableCommands{\let\mathbb\relax}
\begin{document}
\section{Something about $\mathbb{R}$, plus other things}
\end{document}
更好的方法是使用
\section{Something about \texorpdfstring{$\mathbb{R}$}{R}, plus other things}
问题出在哪里?就是当hyperref
宏试图生成书签的文本时。出于某种原因,a\sl@Terminator
逃脱了被吞噬,因为在某些情况下silence
重新定义\@gobble
,但hyperref
做的事情与其他包的预期不同。由于的定义\sl@Terminator
是
\def\sl@Terminator{\sl@Terminator}
这将导致无限循环。