
Ich verwende eine Kombination aus xr-hyper
und hyperref
mit cleveref
mehreren Dateien. Mein alter Code funktioniert nicht mehr richtig. Die externen Referenzen enthalten jetzt den Dateinamen der externen Datei und nicht nur die referenzierte Nummer.
Im folgenden Beispiel kompiliere ich fileone
zuerst und dann filetwo
, was auf den Abschnitt in verweist fileone
. Die Ausgabe von filetwo
ist dann
anstatt nur Section 1
.
fileone.tex
\documentclass{article}
\usepackage{xr-hyper}
\usepackage{hyperref}
\usepackage{cleveref}
\begin{document}
\section{One}
\label{sec:one}
\end{document}
filetwo.tex
\documentclass{article}
\usepackage{xr-hyper}
\usepackage{hyperref}
\usepackage{cleveref}
\externaldocument{fileone}
\begin{document}
\Cref{sec:one}
\end{document}
Ich vermute, dass eine Korrektur cleveref
erforderlich ist, habe aber nicht genau herausgefunden, was nötig ist.
Zur Referenz sind die Dateiversionen
xr-hyper.sty 2024-01-20 v7.01h eXternal References (DPC)
hyperref.sty 2024-01-20 v7.01h Hypertext links for LaTeX
cleveref.sty 2018/03/27 v0.21.4 Intelligent cross-referencing
Antwort1
Bearbeiten 28.03.2023
LaTeX wurde eine Erste-Hilfe-Datei für cleveref hinzugefügt, die die in der Antwort erwähnten Neudefinitionen enthält. Mit der nächsten LaTeX-Version und mit dem heute veröffentlichten latex-dev werden die Referenzen wieder korrekt sein.
Alte Antwort
In einem aktuellen LaTeX wurde die Syntax von \newlabel
in der Datei mit der Syntax von vereinheitlicht.aux
hyperref
und enthält immer fünf Datencontainer.cleveref
wurde nicht an diese Änderung angepasst und verwendet weiterhin nur zwei Datencontainer in seiner Definition. Ihre externe .aux
Datei enthält also (ich habe zur besseren Sichtbarkeit einige Leerzeichen hinzugefügt):
\newlabel{sec:one}{ {1} {1} {One} {section.1} {} } %<------- five
\newlabel{sec:one@cref}{ {[section][1][]1} {[1][1][]1} } %<------- two
Innerhalb eines Dokuments ist es nicht so wichtig, dass diecleveref
label hat nur zwei Datencontainer, dacleveref
ist der einzige, der es benutzt. Aberxr-hyper
versucht sich ebenfalls an den neuen Standard zu halten und erweitert jedes eingelesene Label auf fünf Datencontainer. Der fünfte Datencontainer wird zudem zur Speicherung der Dateinamen für Links verwendet.
Nun, vor kurzemxr-hyper
wurde erweitert, um immer den Dateinamen zu speichern (und nicht nur, wenn das Label einen Zielnamen im vierten Container enthält), um Dateilinks zum externen Dokument zu ermöglichen, auch wenn dieses Dokument nicht verwendethyperref
. Mit dieser Änderung erhält man folgende Definitionen für die Labels aus dem externen Dokument:
> \r@sec:one=macro:
->{1}{1}{One}{section.1}{fileone.pdf}.
> \r@sec:one@cref=macro:
->{[section][1][]1}{[1][1][]1}{}{}{fileone.pdf}.
% would be in older versions:
% ->{[section][1][]1}{[1][1][]1}{}{}{}.
Und danncleveref
fällt über das fileone.pdf
im letzten Argument.
Das Beste wäre, wenncleveref
würde aktualisiert, um auch immer den Standard-5-Datencontainer zu verwenden, damit alles synchron ist. Im Moment können Sie so etwas tun:
\documentclass{article}
\usepackage{xr-hyper}
\usepackage{hyperref}
\usepackage{cleveref}
\externaldocument{fileone}
\makeatletter
\def\cref@getref#1#2{%
\expandafter\let\expandafter#2\csname r@#1@cref\endcsname%
\expandafter\expandafter\expandafter\def%
\expandafter\expandafter\expandafter#2%
\expandafter\expandafter\expandafter{%
\expandafter\@firstoffive#2}}% <-------- five
\def\cpageref@getref#1#2{%
\expandafter\let\expandafter#2\csname r@#1@cref\endcsname%
\expandafter\expandafter\expandafter\def%
\expandafter\expandafter\expandafter#2%
\expandafter\expandafter\expandafter{%
\expandafter\@secondoffive#2}}% <----------- five
\AtBeginDocument{%
\def\label@noarg#1{%
\cref@old@label{#1}%
\@bsphack%
\edef\@tempa{{page}{\the\c@page}}%
\setcounter{page}{1}%
\edef\@tempb{\thepage}%
\expandafter\setcounter\@tempa%
\cref@constructprefix{page}{\cref@result}%
\protected@write\@auxout{}%
{\string\newlabel{#1@cref}{{\cref@currentlabel}%
{[\@tempb][\arabic{page}][\cref@result]\thepage}{}{}{}}}% <----- five
\@esphack}%
\def\label@optarg[#1]#2{%
\cref@old@label{#2}%
\@bsphack%
\edef\@tempa{{page}{\the\c@page}}%
\setcounter{page}{1}%
\edef\@tempb{\thepage}%
\expandafter\setcounter\@tempa%
\cref@constructprefix{page}{\cref@result}%
\protected@edef\cref@currentlabel{%
\expandafter\cref@override@label@type%
\cref@currentlabel\@nil{#1}}%
\protected@write\@auxout{}%
{\string\newlabel{#2@cref}{{\cref@currentlabel}%
{[\@tempb][\arabic{page}][\cref@result]\thepage}{}{}{}}}% <------- five
\@esphack}%
}
\begin{document}
\Cref{sec:one}
\end{document}