저는 상호 참조 시스템이 필요한 수많은 부록이 포함된 기사를 작성 중입니다. 우리는 hyperref를 사용하기 때문에 xr-hyper 패키지를 사용해 보았습니다. 여러 번 시도한 후에 세 개의 외부 문서에서 작동하게 되었지만 네 번째 문서를 추가하는 순간 "Package xr warning: No file file4.aux LABELS NOT IMPORTED on input line 30"이라는 오류 메시지가 나타납니다.
문제는 다음과 같습니다. 우리는 Overleaf(및 pdflatex)를 사용하고 있습니다. 이 작업을 로컬로 수행하는 것은 불행하게도 현재로서는 선택 사항이 아닙니다.
나는 내가 찾을 수 있는 모든 스레드를 읽고 내가 찾을 수 있는 모든 실제 예제를 적용했지만 아무 소용이 없었습니다.
아래에 다양한 페이지의 MWE를 첨부합니다. 도대체 왜 네 번째 파일에 대한 참조가 허용되지 않는지 알 수 있는 사람이 있나요?
% the preamble
%\usepackage{xcite}
\usepackage{xr-hyper}
\usepackage{hyperref}
\makeatletter
\newcommand*{\addFileDependency}[1]{% argument=file name and extension
\typeout{(#1)}% latexmk will find this if $recorder=0 (however, in that case, it will ignore #1 if it is a .aux or .pdf file etc and it exists! if it doesn't exist, it will appear in the list of dependents regardless)
\@addtofilelist{#1}% if you want it to appear in \listfiles, not really necessary and latexmk doesn't use this
\IfFileExists{#1}{}{\typeout{No file #1.}}% latexmk will find this message if #1 doesn't exist (yet)
}
\makeatother
\newcommand*{\myexternaldocument}[1]{%
\externaldocument{#1}%
\addFileDependency{#1.tex}%
\addFileDependency{#1.aux}%
}
% put all the external documents here!
\myexternaldocument{file1}
\myexternaldocument{file2}
\myexternaldocument{file3}
\myexternaldocument{file4}
% the latexmkrc file
add_cus_dep( 'tex', 'aux', 0, 'makeexternaldocument' );
sub makeexternaldocument {
# if the dependency isn't one of the files that this latexmk run will consider, process it
# without this test, we would get an infinite loop!
if (!($root_filename eq $_[0]))
{ # PLEASE ENABLE ONLY ONE OF THE FOLLOWING
# DEPENDING ON THE ENGINE YOU'RE USING
# FOR PDFLATEX
system( "latexmk -pdf \"$_[0]\"" );
# FOR LATEX+DVIPDF
# system( "latexmk \"$_[0]\"" );
# FOR XELATEX
# system( "latexmk -xelatex \"$_[0]\"" );
# FOR LUALATEX
# system( "latexmk -lualatex \"$_[0]\"" );
}
}
% File 1
\documentclass[12pt]{article}
\input{preamble}
\begin{document}
\section{section 1 in file 1}
\label{sec1file1}
\section{section 2 in file 1}
\label{sec2file1}
Testing some references: \\
Referencing section one in file one: \ref{sec1file1}\\
Referencing section two in file one: \ref{sec2file1} \\
Referencing section one in file two: \ref{sec1file2} \\
Referencing section two in file two: \ref{sec2file2} \\
Referencing section one in file three: \ref{sec1file3} \\
Referencing section two in file three: \ref{sec2file3} \\
\end{document}
마지막으로 나머지 파일의 예는 다음과 같습니다.
\documentclass[12pt]{article}
\input{preamble}
\begin{document}
\section{section 1 in file 3}
\label{sec1file3}
\section{section 2 in file 3}
\label{sec2file3}
Testing some references: \\
Referencing section one in file one: \ref{sec1file1}\\
Referencing section two in file one: \ref{sec2file1} \\
Referencing section one in file two: \ref{sec1file2} \\
Referencing section two in file two: \ref{sec2file2} \\
Referencing section one in file three: \ref{sec1file3} \\
Referencing section two in file three: \ref{sec2file3} \\
Referencing section two in file four: \ref{sec2file4} \\
\end{document}
업데이트: 이제 Overleaf에서 aux 파일을 다운로드하여 다음과 같은 결과를 얻었습니다.
\relax
\providecommand\hyper@newdestlabel[2]{}
\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument}
\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined
\global\let\oldcontentsline\contentsline
\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}}
\global\let\oldnewlabel\newlabel
\gdef\newlabel#1#2{\newlabelxx{#1}#2}
\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}}
\AtEndDocument{\ifx\hyper@anchor\@undefined
\let\contentsline\oldcontentsline
\let\newlabel\oldnewlabel
\fi}
\fi}
\global\let\hyper@last\relax
\gdef\HyperFirstAtBeginDocument#1{#1}
\providecommand\HyField@AuxAddToFields[1]{}
\providecommand\HyField@AuxAddToCoFields[2]{}
\bibstyle{biblatex}
\bibdata{output-blx,hh_library}
\citation{biblatex-control}
\abx@aux@refcontext{nyt/global//global/global}
\providecommand \oddpage@label [2]{}
\@writefile{toc}{\boolfalse {citerequest}\boolfalse {citetracker}\boolfalse {pagetracker}\boolfalse {backtracker}\relax }
\@writefile{lof}{\boolfalse {citerequest}\boolfalse {citetracker}\boolfalse {pagetracker}\boolfalse {backtracker}\relax }
\@writefile{lot}{\boolfalse {citerequest}\boolfalse {citetracker}\boolfalse {pagetracker}\boolfalse {backtracker}\relax }
\@writefile{toc}{\defcounter {refsection}{0}\relax }\@writefile{toc}{\contentsline {section}{\numberline {1}section 1 in file 1}{1}{section.1}\protected@file@percent }
\newlabel{sec1file1}{{1}{1}{section 1 in file 1}{section.1}{}}
\@writefile{toc}{\defcounter {refsection}{0}\relax }\@writefile{toc}{\contentsline {section}{\numberline {2}section 2 in file 1}{1}{section.2}\protected@file@percent }
\newlabel{sec2file1}{{2}{1}{section 2 in file 1}{section.2}{}}
\newlabel{LastPage}{{}{1}{}{page.1}{}}
\xdef\lastpage@lastpage{1}
\xdef\lastpage@lastpageHy{1}
그게 전혀 도움이 되나요?
답변1
이 튜토리얼을 확인해 보세요:https://www.overleaf.com/learn/how-to/Cross_referencing_with_the_xr_package_in_Overleaf
File1.tex
File1에 File2의 레이블이 있고 인용하려고 한다고 가정해 보겠습니다 File2.tex
. 필요한 것은 다음과 같습니다.
- 사용자 정의 코드 가져오기
File1.tex
%%% HELPER CODE FOR DEALING WITH EXTERNAL REFERENCES
\usepackage{xr}
\makeatletter
\newcommand*{\addFileDependency}[1]{
\typeout{(#1)}
\@addtofilelist{#1}
\IfFileExists{#1}{}{\typeout{No file #1.}}
}
\makeatother
\newcommand*{\myexternaldocument}[1]{
\externaldocument{#1}
\addFileDependency{#1.tex}
\addFileDependency{#1.aux}
}
%%% END HELPER CODE
% put all the external documents here!
\myexternaldocument{File2}
latexmkrc
파일
add_cus_dep( 'tex', 'aux', 0, 'makeexternaldocument' );
sub makeexternaldocument {
if (!($root_filename eq $_[0]))
{
# FOR PDFLATEX
system( "latexmk -cd -pdf \"$_[0]\"" );
# FOR LATEX+DVIPDF
# system( "latexmk -cd \"$_[0]\"" );
# FOR XELATEX
# system( "latexmk -cd -xelatex \"$_[0]\"" );
# FOR LUALATEX
# system( "latexmk -cd -lualatex \"$_[0]\"" );
}
}
또한 latexmkrc
파일은 하위 폴더 내부가 아닌 루트(최상위) 수준 폴더에 있어야 합니다.
답변2
나도 문제를 만났다 (튜토리얼작동하지 않습니다). 나는 내 기본 문서와 외부 문서를 내 뒷면 프로젝트의 루트로 옮기는 것이 해결책이라는 것을 알았습니다.