我正在使用包xr
在两个文件之间进行交叉引用。
有没有办法让一个文件中的方程编号与另一个文件中的方程编号保持一致?我的意思是,如果文件 A 中的最后一个方程是 (28),那么文件 (B) 中的第一个方程就是 (29),依此类推。
另一个问题是,这可以用引理、定理等的计数器来完成吗?
答案1
使用包的解决方案zref
:
文件 A
第一个文档在引用中test-A.tex
写入计数器的最新值:equation
zref
eq-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 部分等都必须依次重新编译,以便更新它们的计数器。