babel + hyperref:每页多次“重新定义速记”

babel + hyperref:每页多次“重新定义速记”

考虑以下代码:

\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

相关内容