交叉引用和 chemnum

交叉引用和 chemnum

我有两个独立的文档,独立编译并位于两个完全不同的文件夹中。我严重依赖该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”,正如预期的那样。

相关内容