使用 latexmk 时两个文件与 xr 相互交叉引用

使用 latexmk 时两个文件与 xr 相互交叉引用

这个问题与另一个问题相关未回答的一个。我的不是针对 Overleaf 的,我提供了一个 MWE。

我有以下两个文件:

% file_a.tex
\documentclass{article}
\usepackage{xr}

\makeatletter
\@addtofilelist{file_b.tex}
\@addtofilelist{file_b.aux}
\makeatother
\externaldocument{file_b}

\begin{document}
    \section{File A Section 1}\label{a:sec1}
    File B Section 2: \ref{b:sec2}.

    \section{File A Section 2}\label{a:sec2}
    File B Section 1: \ref{b:sec1}.
\end{document}
% file_b.tex
\documentclass{article}
\usepackage{xr}

\makeatletter
\@addtofilelist{file_a.tex}
\@addtofilelist{file_a.aux}
\makeatother
\externaldocument{file_a}

\begin{document}
    \section{File B Section 1}\label{b:sec1}
    File A Section 2: \ref{a:sec2}.

    \section{File B Section 2}\label{b:sec2}
    File A Section 1: \ref{a:sec1}.
\end{document}

file_a.tex我可以通过首先编译(从而生成file_a.aux),然后编译file_b.tex(从而生成file_b.aux),然后再次编译来使交叉引用起作用file_a.tex

xelatex file_a.tex && xelatex file_b.tex && xelatex file_a.tex

但是,我无法找到一种方法来通过一次运行正确地编译这两个文件latexmk。这是我的.latexmkrc,它与在OverLeaf 的知识库以及之前链接的答案。

# Use XeLaTeX
$pdf_mode = 5;
$dvi_mode = 0;
$postscript_mode = 0;

add_cus_dep('tex', 'aux', 0, 'makeexternaldocument');

sub makeexternaldocument {
    if(!($root_filename eq $_[0])) {
        system("latexmk -cd -xelatex \"$_[0]\"");
    }
}

如果我运行,latexmk file_a.tex则不会得到正确的输出file_a.pdf(引用被替换为 ??),而且根本得不到任何结果file_b.pdf。理想情况下,我希望在一次运行中同时获得file_a.pdffile_b.pdf(和正确的引用!)。我们可以假设这是我唯一需要的两个文件,并且不会有任何其他文件之间的依赖关系图。

答案1

在命令行上,在每个文件上运行 latexmk 更简单,但在 Overleaf 或其他无法直接访问命令行的系统中,您可以执行

latexmkrc

$xelatex="xelatex %O file_a;xelatex %O file_b"

文件_a.tex

\documentclass{article}
\usepackage{xr}

\externaldocument{file_b}

\begin{document}
    \section{File A Section 1}\label{a:sec1}
    File B Section 2: \ref{b:sec2}.

    \section{File A Section 2}\label{a:sec2}
    File B Section 1: \ref{b:sec1}.
\end{document}

文件_b.tex

\documentclass{article}
\usepackage{xr}

\externaldocument{file_a}

\begin{document}
    \section{File B Section 1}\label{b:sec1}
    File A Section 2: \ref{a:sec2}.

    \section{File B Section 2}\label{b:sec2}
    File A Section 1: \ref{a:sec1}.
\end{document}

只需拨打

latexmk --xelatex file_a

然后产生

在此处输入图片描述

在此处输入图片描述

相关内容