为什么使用 \nofiles 时不出现书签?

为什么使用 \nofiles 时不出现书签?

背景

在文档完全编译后,激活\nofiles通常会导致下次运行时的引用和其他实体与上一次运行时相同。当使用该pgfpages包将多个逻辑页面放到单个物理页面上时,必须利用这一点,否则引用和链接将指向错误的页面。

通常的编译工作流程是正常编译(不带\nofiles),然后添加\nofiles,然后再次编译。

书签

bookmark软件包宣称能够在一次运行中正确获取书签。但是,当\nofiles处于活动状态时,根本不会创建书签,即使之前的运行包含书签。

:使用时如何让bookmark包正常工作\nofiles

(注意我已经有一个回答这个问题,并提供答案以造福他人。也许有人可以改进它。

平均能量损失

(虽然我的真实用例是使用该包,但没有必要使用pgfpages它来演示行为。)

\documentclass{article}
\usepackage{bookmark}

% compile first with \nofiles commented out
% then comment it back in, and compile again
%\nofiles
\setcounter{errorcontextlines}{\maxdimen}

\begin{document}
\section{first}
abc
\section{second}
def

\end{document}

按原样编译时,各部分的书签显示正常。随后取消注释该\nofiles行并再次编译时,书签不见了,但它们仍然是需要的!

答案1

解释

bookmark包仍然使用auxLaTeX 中的文件机制,但在最终 PDF 文件中添加书签的实际工作是在aux读取文件时完成的。结尾文档的开始部分,而不是在开始读取时。这就是它如何在一次运行中实现其结果(尽管不清楚为什么它需要使用辅助文件 - 它似乎并不依赖于“whatsit”节点,因为它使用了\immediate)。

问题在于,当\nofiles处于活动状态(\if@filesw\iffalse)时,LaTeX 不会aux在文档末尾重新输入文件(即使文件已经存在 - 原因仍然不完全清楚)。因此,书签永远不会被写入。此外,该\bookmark命令在此模式下基本被禁用,并且没有进行足够的设置以使aux文件命令正常工作。

可能的修复

以下代码显示了对bookmark软件包和 LaTeX 本身的补丁,这些补丁应允许在使用编译足够多次而不\nofiles激活的方法时保留书签。这通过让 LaTeX 在处于活动状态时在文档末尾\nofiles输入文件来实现;我不能 100% 确定这没有意外的副作用。(像往常一样,当使用时,如果参考或引文发生变化,那么您将收到有关更改的警告并被告知重新运行 latex,但显然这永远不会稳定,因为在后续运行中不会改变。)aux\nofiles\nofilesaux

\documentclass{article}
\usepackage{bookmark}

% compile first with \nofiles commented out
% then comment it back in, and compile again
%\nofiles
\setcounter{errorcontextlines}{\maxdimen}

%% the patch for \nofiles support for bookmark package
\usepackage{etoolbox}
\usepackage{xpatch}

\makeatletter
\newcommand*{\dopatchbkm}{%
    \xpatchcmd{\bookmark}{\if@filesw}{\iftrue}{}{\errmessage{failed to patch}}%don't deactivate \bookmark in \nofiles mode
    \xpatchcmd{\bookmark}{\@mainaux}{\m@ne}{}{\errmessage{failed to patch}}%but still don't write to files (write to log instead)
    \patchcmd{\enddocument}{\if@filesw}{\iftrue}{}{\errmessage{failed to patch}}%still input the aux file at the end
    \patchcmd{\enddocument}{\@@input\jobname.aux}{\@input{\jobname.aux}}{}{\errmessage{failed to patch}}%for protection in case the aux file doesn't actually exist (don't want a non-recoverable error)! Thanks to David Carlisle.
}

\AtBeginDocument{% delay to \begin{document} in case \nofiles is used AFTER this point
\if@filesw
\else
    \dopatchbkm
\fi
}
\makeatother
%% end patch for \nofiles support for bookmark package

\begin{document}
\section{first}
abc
\section{second}
def

\end{document}

相关内容