考虑以下代码:
\documentclass{article}
\usepackage[ngerman]{babel}
\usepackage{hyperref}
\usepackage{blindtext}
\begin{document}
\Blindtext\Blindtext\Blindtext
\Blindtext\Blindtext\Blindtext
\end{document}
...以及来自其日志文件的一小部分。
[3]
Package babel Info: Redefining ngerman shorthand "|
(babel) in language on input line 7.
Package babel Info: Redefining ngerman shorthand "~
(babel) in language on input line 7.
Package babel Info: Redefining ngerman shorthand "|
(babel) in language on input line 7.
Package babel Info: Redefining ngerman shorthand "~
(babel) in language on input line 7.
Package babel Info: Redefining ngerman shorthand "|
(babel) in language on input line 7.
Package babel Info: Redefining ngerman shorthand "~
(babel) in language on input line 7.
babel 似乎每页都会重新定义这些简写几次,即使只有纯文本也是如此(为什么会这样?)。只有在hyperref
处于活动状态时才会发生这种情况。该日志文件的一半只包含这些行的迭代。显然,在我目前正在处理的 350 页文档中,情况更糟,使故障排除变得非常麻烦。有没有办法防止这种膨胀?
答案1
该信息来自\pdfstringdef
,用于将 TeX 字符串转换为 PDF 书签字符串。\pdfstringdef
重新定义了许多命令以禁用它们,以提供替换。因此hyperref
还重新定义了一些简写。例如,TeX 的连字符与书签无关,因此hyperref
重新定义了与连字符有关的简写ngerman
:
\declare@shorthand{ngerman}{"|}{}%
\declare@shorthand{ngerman}{"~}{-}%
生成两条信息消息,每条消息\pdfstringdef
都用 调用\usepackage[ngerman]{babel}
。这适用于\section
和 朋友 以及一些其他场合(PDF 信息条目的设置)。
答案2
一旦你知道这些信息无关紧要(事实也确实如此),你可以用温和的方式(也称为“大锤”)来压制它:
\documentclass{article}
\usepackage[ngerman]{babel}
\usepackage{lipsum}
\usepackage{etoolbox}
\usepackage{hyperref}
\makeatletter
\patchcmd{\@decl@short}{\bbl@info}{\@gobble}{}{}
\patchcmd{\@decl@short}{\bbl@info}{\@gobble}{}{}
\makeatother
\begin{document}
\lipsum[1-40]
\end{document}
没有更多Redefining ngerman shorthand
消息。
更细致的补丁将是
\documentclass{article}
\usepackage[ngerman]{babel}
\usepackage{lipsum}
\usepackage{etoolbox}
\usepackage{hyperref}
\makeatletter
\patchcmd{\pdfstringdef}
{\csname HyPsd@babel@}
{\let\bbl@info\@gobble\csname HyPsd@babel@}
{}{}
\makeatother
\begin{document}
\lipsum[1-40]
\end{document}
\bbl@info
这将仅在 的上下文中禁用(重新定义速记时) \pdfstringdef
。