Cleveref zeigt fälschlicherweise den Dateinamen in externen Referenzen an

Cleveref zeigt fälschlicherweise den Dateinamen in externen Referenzen an

Ich verwende eine Kombination aus xr-hyperund hyperrefmit cleverefmehreren 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 fileonezuerst und dann filetwo, was auf den Abschnitt in verweist fileone. Die Ausgabe von filetwoist dann

Bildbeschreibung hier eingeben

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 clevereferforderlich 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 \newlabelin der Datei mit der Syntax von vereinheitlicht.auxhyperrefund enthält immer fünf Datencontainer.cleverefwurde nicht an diese Änderung angepasst und verwendet weiterhin nur zwei Datencontainer in seiner Definition. Ihre externe .auxDatei 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 dieclevereflabel hat nur zwei Datencontainer, dacleverefist der einzige, der es benutzt. Aberxr-hyperversucht 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-hyperwurde 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 dannclevereffällt über das fileone.pdfim letzten Argument.

Das Beste wäre, wenncleverefwü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}

verwandte Informationen