背景
在文档完全编译后,激活\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
包仍然使用aux
LaTeX 中的文件机制,但在最终 PDF 文件中添加书签的实际工作是在aux
读取文件时完成的。结尾文档的开始部分,而不是在开始读取时。这就是它如何在一次运行中实现其结果(尽管不清楚为什么它需要使用辅助文件 - 它似乎并不依赖于“whatsit”节点,因为它使用了\immediate
)。
问题在于,当\nofiles
处于活动状态(\if@filesw
为\iffalse
)时,LaTeX 不会aux
在文档末尾重新输入文件(即使文件已经存在 - 原因仍然不完全清楚)。因此,书签永远不会被写入。此外,该\bookmark
命令在此模式下基本被禁用,并且没有进行足够的设置以使aux
文件命令正常工作。
可能的修复
以下代码显示了对bookmark
软件包和 LaTeX 本身的补丁,这些补丁应允许在使用编译足够多次而不\nofiles
激活的方法时保留书签。这通过让 LaTeX 在处于活动状态时在文档末尾\nofiles
输入文件来实现;我不能 100% 确定这没有意外的副作用。(像往常一样,当使用时,如果参考或引文发生变化,那么您将收到有关更改的警告并被告知重新运行 latex,但显然这永远不会稳定,因为在后续运行中不会改变。)aux
\nofiles
\nofiles
aux
\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}