我正在尝试执行以下操作。我希望源代码的一部分能够正常编译但不产生任何输出。特别是,我希望对幻像部分的引用能够产生与未幻像部分相同的结果。
我知道这听起来很奇怪而且我从未见过这样的事情。
对于不处理重影部分浮点数的解决方案,我不会有任何疑问。
这是我想要的代码的想法:
\documentclass{article}
%\usepackage{ghost} % package that would define the ghost environement
\begin{document}
\section{First}
Some text here with a reference \ref{eq:one} and
another reference \ref{se:third}
%\begin{ghost}
\section{Second}
Some text again.
\begin{equation}\label{eq:one}
a = b
\end{equation}
%\end{ghost}
\section{Third}\label{se:third}
Some final text
\end{document}
这将产生以下输出(一旦 ghost 环境正常工作):
答案1
经过编辑后确实可以工作(我认为)。
我的方法是创建一个ghost
环境,将幽灵材料粘贴到未打印的盒子中。我首先尝试将其放入lrbox
,但结果卡在了\label
s 上。所以我使用坏的语法\setbox0=\vbox\bgroup...\egroup
。我想既然我反正没有排版材料,坏的配方的一些方面可能并不致命。
这种方法在激活分区信息而不实际打印时效果很好,所以我已经解决了一半的问题。然而,\label
在框中执行也破坏了一些东西。
因此,我的解决方案是抓住 的含义\label
,而不是执行框中的代码,我只会在每次调用时\xdef
将代码放入索引宏 ( \LBLi
, \LBLii
, ) 。然后,在退出框时,我将循环执行, , , ,依次执行,以实际执行框外的代码。\LBLiii
\label
\LBLi
\LBLii
\LBLiii
\label
经过一点努力,我让它工作了。什么\label
应该做的是写下以下内容评估添加到 aux 文件中的行:
\newlabel{<label>}{{\@currentlabel}{\thepage}}
因此实际的 aux 文件包含类似的内容\newlabel{eq:one}{{1}{1}}
。
我的编辑涉及在 的定义中使用\xdef
而不是,并保留。允许使用的正确值。\gdef
\LBLx
\noexpand
\thepage
\xdef
\@currentlabel
这是我的 MWE,适用于标签编号。它似乎\thepage
也适用于,可以通过取消注释该行在我的 MWE 中进行测试\vspace*
。
重新编辑以纳入\newif\ifghost
,根据 touhami 对问题的评论。设置\ghostfalse
在序言顶部附近将导致编译忽略ghost
并编译完整文档。使用\ghosttrue
,这些ghost
部分被省略,但希望得到说明。
\documentclass{article}
\usepackage{ifthen}
\newif\ifghost
\ghosttrue
\newcounter{nlabels}
\newcounter{ilabel}
\ifghost
\makeatletter
\def\pwr{\protected@write\@auxout}
\newenvironment{ghost}{\setcounter{nlabels}{0}%
\renewcommand\label[1]{\stepcounter{nlabels}%
\expandafter\xdef\csname LBL\romannumeral\value{nlabels}\endcsname{%
{}{\string\newlabel{##1}{{\@currentlabel}{\noexpand\thepage}}}}}%
\par\setbox0=\vbox\bgroup}{\egroup%
\setcounter{ilabel}{0}%
\whiledo{\value{ilabel}<\value{nlabels}}{%
\stepcounter{ilabel}%
\expandafter\expandafter\expandafter\pwr%
\csname LBL\romannumeral\value{ilabel}\endcsname%
}%
}
\makeatother
\else
\newenvironment{ghost}{}{}
\fi
\begin{document}
%\vspace*{6in}% Seems to work if I split the page during ghost.
\section{First}\label{se:first}
Reference to equations \ref{eq:one}, \ref{eq:two}, \ref{eq:three}
and \ref{eq:four}, and
another reference to sections \ref{se:first}, \ref{se:second} and \ref{se:third}.
\begin{equation}\label{eq:one}
y = mx+b
\end{equation}
\begin{ghost}
\section{Second}\label{se:second}
Some text again.
\begin{equation}\label{eq:two}
a = b
\end{equation}
\begin{equation}\label{eq:three}
c = d
\end{equation}
\end{ghost}
\section{Third}\label{se:third}
Some final text to see if next equation number is correct
\begin{equation}\label{eq:four}
e = mc^2
\end{equation}
\end{document}
对于此 MWE,辅助文件写为
\relax
\@writefile{toc}{\contentsline {section}{\numberline {1}First}{1}}
\newlabel{se:first}{{1}{1}}
\newlabel{eq:one}{{1}{1}}
\newlabel{se:second}{{2}{1}}
\newlabel{eq:two}{{2}{1}}
\newlabel{eq:three}{{3}{1}}
\@writefile{toc}{\contentsline {section}{\numberline {3}Third}{1}}
\newlabel{se:third}{{3}{1}}
\newlabel{eq:four}{{4}{1}}
答案2
我决定在一个单独的答案中总结 Steven 的解决方案与使用\include
/ \includeonly
(如 Ethan Bolker 所建议)之间的区别。我并没有真正与 Steven 的解决方案进行彻底的比较,因此如果您发现其他内容,请随时添加到此帖子中。
- 使用
\include
,幽灵部分必须存储在单独的文件中。正如 Ethan 所写,可以使用 来规避这个问题\filecontents
。 - 每当包含一个文件时,就会开始一个新页面。此外,在包含的文件的末尾,也会开始一个新页面。这可能并不总是理想的行为,但它也有优点:
\include
无论文件是否实际包含,周围的文本将始终以相同的方式排版。此外,页面计数器会调整以尊重“隐藏”页面。因此,隐藏文本分布在不可见的页面上,并且可以引用这些隐藏页面,正如 touhami 在他的评论中所希望的那样。