这个问题与另一个问题相关未回答的一个。我的不是针对 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.pdf
和file_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
然后产生