文件和方程计数器之间的交叉引用

文件和方程计数器之间的交叉引用

我正在使用包xr在两个文件之间进行交叉引用。

有没有办法让一个文件中的方程编号与另一个文件中的方程编号保持一致?我的意思是,如果文件 A 中的最后一个方程是 (28),那么文件 (B) 中的第一个方程就是 (29),依此类推。

另一个问题是,这可以用引理、定理等的计数器来完成吗?

答案1

使用包的解决方案zref

文件 A

第一个文档在引用中test-A.tex写入计数器的最新值:equationzrefeq-last

% test-A.tex
\documentclass{article}

\usepackage{zref-base}
\usepackage{atveryend}
\makeatletter
\AfterLastShipout{%
  \if@filesw   
    \begingroup
      \zref@setcurrent{default}{\the\value{equation}}%
      \zref@wrapper@immediate{%
        \zref@labelbyprops{eq-last}{default}%
      }%
    \endgroup
  \fi
}
\makeatother

\begin{document}
\begin{equation}E=mc^2\end{equation}
\end{document}

评论:

  • 而是使用在最后一页发出之后和文件关闭之前执行的\AtEndDocument钩子。\AfterLastShipout.aux

  • \zref@wrapper@immediate映射\write\immediate\write以便直接写入.aux文件。此时延迟写入\immediate将不起作用,因为最后一页已经发出,并且没有下一页。

  • 代码放在\if@filesw和里面\fi。支持\nofiles,禁止写入辅助文件。

文件 B

下一本“系列丛书”从文档中导入参考文献test-A。参考文献名称以 为前缀,以A-避免名称冲突 ( \zexternaldocument):

% test-B.tex
\documentclass{article}

\usepackage{zref-xr}
\makeatletter
\zexternaldocument[A-]{test-A}
\AtBeginDocument{%
  \setcounter{equation}{\zref@extractdefault{A-eq-last}{default}{0}}%
  \zref@refused{A-eq-last}%
}
\makeatother

\begin{document}
\begin{equation}v=\frac{s}{t}\end{equation}
\end{document}

评论:

  • \zref@extractdefault是可扩展的,可以在 的值部分直接使用\setcounter
  • \zref@refused如果引用未定义,则会发出抱怨。LaTeX 会清除中未定义引用的警告状态\begin{document}。因此我们需要\AtBeginDocument(否则最后的“ LaTeX warning: There were undefined references.”可能会丢失)。

答案2

这是一种方法。在这个 MWE 中,我将两个计数器保存到外部文件:\thesection\theequation。显然,您可以扩展解决方案以包括保存您需要从一个文档传输到下一个文档的任何状态变量(例如\thepage,等等)。

我创建了两个命令:\recallstatus和,\savestatus它们应该分别在文档部分(第 1 部分除外)的开头和文档部分的结尾调用。在本 MWE 中,我在每个序言中都定义了它们,但将它们塞入一个multipart.sty或类似的名称中会更容易,您只需 即可\usepackage

以下是文档的第一部分

\documentclass{article}
\newcounter{docpart}
\def\savestatus{%
  \newwrite\tempfile%
  \immediate\openout\tempfile=docstatus\arabic{docpart}.dat%
  \immediate\write\tempfile{\thesection}%
  \immediate\write\tempfile{\theequation}%
  \immediate\closeout\tempfile%
}
\newcounter{olddocpart}
\def\recallstatus{%
  \setcounter{olddocpart}{\arabic{docpart}}
  \addtocounter{olddocpart}{-1}
  \newread\rtempfile%
  \openin\rtempfile=docstatus\arabic{olddocpart}.dat%
  \read\rtempfile to \tmp%
  \setcounter{section}{\tmp}
  \read\rtempfile to \tmp%
  \setcounter{equation}{\tmp}%
  \closein\rtempfile%
}

\setcounter{docpart}{1}
\begin{document}
\section{The First Section}
\begin{equation}
y = x
\end{equation}
\begin{equation}
y = 1/x
\end{equation}
\savestatus
\end{document}

最后\savestatus创建一个docstatus1.dat包含数据(当前部分和方程式)的文件:

1
2

以下是该文件的第二部分:

\documentclass{article}
\newcounter{docpart}
\def\savestatus{%
  \newwrite\tempfile%
  \immediate\openout\tempfile=docstatus\arabic{docpart}.dat%
  \immediate\write\tempfile{\thesection}%
  \immediate\write\tempfile{\theequation}%
  \immediate\closeout\tempfile%
}
\newcounter{olddocpart}
\def\recallstatus{%
  \setcounter{olddocpart}{\arabic{docpart}}
  \addtocounter{olddocpart}{-1}
  \newread\rtempfile%
  \openin\rtempfile=docstatus\arabic{olddocpart}.dat%
  \read\rtempfile to \tmp%
  \setcounter{section}{\tmp}
  \read\rtempfile to \tmp%
  \setcounter{equation}{\tmp}%
  \closein\rtempfile%
}

\setcounter{docpart}{2}
\begin{document}
\recallstatus
\section{The Second Section}
\begin{equation}
y = x^2
\end{equation}
\begin{equation}
y = 1/x^2
\end{equation}
\savestatus

\end{document}

它所做的第一件事是读取第 1 部分的数据文件以重置相应的计数器。正如您从输出中看到的那样,它会从中断的地方拾取部分和方程编号。最后,我又做了一次\savestatus(写入docstatus2.dat)来为第 3 部分做准备。

这是第 1 部分的文档图像:

在此处输入图片描述

这是第二部分:

在此处输入图片描述

显然,如果您修改了第 1 部分中的计数器,则第 2、3 部分等都必须依次重新编译,以便更新它们的计数器。

相关内容