我有两个独立的文档,独立编译并位于两个完全不同的文件夹中。我严重依赖该chemnum
包为两个文档中的许多分子分配编号。
我想交叉引用这个编号系统:如果我在 document1 中创建一个复合标签,我希望 document2 能够识别出这个编号已经被分配,并避免\cmpd{...}
在 document2 中调用时创建新的标签。
如果交叉引用可以双向进行(可能使用两个文档之间共享的某种辅助文件)那就更好了。
我已经尝试过xr
,它似乎对普通标签工作正常,即调用的标签,\label{...}
但它似乎与辅助文件中的 chemnum 条目不兼容。
我知道我可以\setchemnum{init}
在使用这些化合物标签之前先定义它们,但这违背了自动标记的要点chemnum
有没有人有什么建议?
梅威瑟:
文档1.tex
\documentclass{article}
\usepackage{chemnum}
\begin{document}
\cmpd{compoundA, compoundB, compound C}
\end{document}
文档2.tex
\documentclass{article}
\usepackage{chemnum}
\begin{document}
\cmpd{compoundB}
\end{document}
我希望 document2 将 \cmpd{compoundB} 打印为 2,而不是 1。
答案1
编辑: (1)根据 markellos 的要求,增加了对子化合物的支持。 (2)调整解决方案以支持hyperref
,请参阅 markellos 的评论。
这个非常老套的解决方案建立在xr
的功能之上,并遵循了 Ulrike Fischer 的建议。对于您提供的绝对最小的工作示例,这“有效”,但是,根据您的使用情况,您可能需要进行一些调整。
基本上,我们扩展了xr
的扫描算法来识别辅助文件中的\chemnum@cmpd
和\cmenum@subcmpd
指令doc1.aux
,并将这些化合物添加到的化合物列表中doc2.tex
。
doc1.tex:
\documentclass{article}
\usepackage{chemnum}
\begin{document}
\cmpd{compoundA,compoundB,compoundC.i,compoundC.ii}
\end{document}
doc2.tex:
\documentclass{article}
\usepackage{chemnum}
\usepackage{xr}
\makeatletter
\let\XR@oldread\XR@read
\def\XR@read{%
\read\@inputcheck to\XR@line% identical to xr's definition
\expandafter\XR@chemnumtest\XR@line...\XR@% here we inject our own parsing
\expandafter\XR@test\XR@line...\XR@% continue with xr's parsing
}
\long\def\XR@chemnumtest#1#2#3#4\XR@{%
\ifx#1\chemnum@cmpd
\labelcmpd{#2}% this declares the compound locally
\fi
\ifx#1\chemnum@subcmpd
\labelcmpd{#2.#3}% handles subcompounds
\fi
}
\makeatother
% this reads doc1.aux
\externaldocument{doc1}
\begin{document}
\cmpd{compoundB,compoundC.i,compoundC.iii,compoundD}
\end{document}
经过四次编译(pdflatex doc1.tex
两次,然后pdflatex doc2.tex
两次)后,doc1.pdf 显示“1、2、3a 和 3b”,doc2.pdf 显示“2、3a、3c 和 4”,正如预期的那样。