如何防止选定页面被运出并获取完整的交叉引用

如何防止选定页面被运出并获取完整的交叉引用

我只想保留一部分页面,即那些已用标签命令标记 \keepthispage并已提出以下前导命令的页面。

\RequirePackage{atbegshi}
\RequirePackage{etoolbox}
\newbool{keeppage}
\boolfalse{keeppage}
\AtBeginShipout{%
\ifbool{keeppage}
    {\global\boolfalse{keeppage}}
    {\global\boolfalse{keeppage}\AtBeginShipoutDiscard}}
\newcommand{\keepthispage}{\global\booltrue{keeppage}}

这种方法效果很好,但输出中未包含的所有页面上的标签都不会写入辅助文件,因此我最终会缺少很多引用。正如 Heiko Oberdiek 在回复另一个问题,首先需要在不抑制页面的情况下处理整个文件,例如通过添加\renewcommand{\keepthispage}{}和注释掉\AtBeginShipout上述代码片段下方的命令,然后使用重新运行它\nofiles

但是,这需要在运行之间编辑文件。有没有办法通过在同一输入文件上运行 latex/pdflatex 两次来实现此结果,而无需在中间编辑文件(自动编辑(例如使用)sed也不算数,因为有问题的 .tex 文件是自动生成的,并且用户希望他可以通过 latex 运行它 - 相反 latex 应该检测它是在第一遍还是第二遍,并表现得适当)。

答案1

页面引用是唯一受此延迟写入影响的事物.aux- 这是获得正确引用的必要条件。但是,如果您不使用任何页面引用,则可以.aux使用“立即写入包装器”(zref通过以下方式提供\zref@immediate@wrapper

在此处输入图片描述

\documentclass{article}

\usepackage{lipsum,zref}
\usepackage{atbegshi,etoolbox}

\newbool{keeppage}
\boolfalse{keeppage}
\AtBeginShipout{%
  \ifbool{keeppage}
      {\global\boolfalse{keeppage}}% Keep this page
      {\global\boolfalse{keeppage}\AtBeginShipoutDiscard}}% Discard this page
\newcommand{\keepthispage}{\global\booltrue{keeppage}}

\makeatletter
\let\oldlabel\label% Store \label
\renewcommand{\label}[1]{% Update \label to write to the .aux immediately
  \zref@wrapper@immediate{\oldlabel{#1}}}
\makeatother

\begin{document}

See Section~\ref{sec:second}.\keepthispage% Keep this page

\section{First section}\label{sec:first}\lipsum[1-5]
\subsection{First subsection}\label{subsec:first.first}\lipsum[1-5]
\subsection{Second subsection}\label{subsec:first.second}\lipsum[1-5]
\subsection{Last subsection}\label{subsec:first.last}\lipsum[1-5]

\section{Second section}\label{sec:second}\lipsum[1-5]
\subsection{First subsection}\label{subsec:second.first}\lipsum[1-5]
\subsection{Second subsection}\label{subsec:second.second}\lipsum[1-5]
\subsection{Last subsection}\label{subsec:second.last}\lipsum[1-5]

\end{document}

.aux文件现在将包含所有正确的柜台参考文献,但页码引用不正确:

\relax 
\providecommand\zref@newlabel[2]{}
\newlabel{sec:first}{{1}{\thepage }}
\@writefile{toc}{\contentsline {section}{\numberline {1}First section}{1}}
\newlabel{subsec:first.first}{{1.1}{\thepage }}
\newlabel{subsec:first.second}{{1.2}{\thepage }}
\newlabel{subsec:first.last}{{1.3}{\thepage }}
\newlabel{sec:second}{{2}{\thepage }}
\newlabel{subsec:second.first}{{2.1}{\thepage }}
\newlabel{subsec:second.second}{{2.2}{\thepage }}
\newlabel{subsec:second.last}{{2.3}{\thepage }}

请注意,在页面发出时仍会进行目录写入(因此未保留的页面会丢失)。

相关内容