幽灵环境

幽灵环境

我正在尝试执行以下操作。我希望源代码的一部分能够正常编译但不产生任何输出。特别是,我希望对幻像部分的引用能够产生与未幻像部分相同的结果。

我知道这听起来很奇怪而且我从未见过这样的事情。

对于不处理重影部分浮点数的解决方案,我不会有任何疑问。

这是我想要的代码的想法:

\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,但结果卡在了\labels 上。所以我使用坏的语法\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 的解决方案进行彻底的比较,因此如果您发现其他内容,请随时添加到此帖子中。

  1. 使用\include,幽灵部分必须存储在单独的文件中。正如 Ethan 所写,可以使用 来规避这个问题\filecontents
  2. 每当包含一个文件时,就会开始一个新页面。此外,在包含的文件的末尾,也会开始一个新页面。这可能并不总是理想的行为,但它也有优点:\include无论文件是否实际包含,周围的文本将始终以相同的方式排版。此外,页面计数器会调整以尊重“隐藏”页面。因此,隐藏文本分布在不可见的页面上,并且可以引用这些隐藏页面,正如 touhami 在他的评论中所希望的那样。

相关内容