Cleveref muestra por error el nombre del archivo en referencias externas

Cleveref muestra por error el nombre del archivo en referencias externas

Estoy usando una combinación de xr-hypery hyperrefcon cleverefvarios archivos. El código antiguo que tengo ya no funciona correctamente. Las referencias externas ahora incluyen el nombre del archivo externo, en lugar de solo el número al que se hace referencia.

En el siguiente ejemplo, compilo fileoneprimero y luego filetwo, lo que hace referencia a la sección de fileone. La salida de filetwoes entonces

ingrese la descripción de la imagen aquí

en lugar de simplemente 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}

Sospecho que cleverefse necesita alguna solución, pero no he localizado exactamente lo que se necesita.

Como referencia, las versiones del archivo son

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

Respuesta1

Editar 2023-03-28

Se han agregado a LaTeX primeros auxilios para Cleveref que contiene las redefiniciones mencionadas en la respuesta. Con la próxima versión de LaTeX y con el desarrollador de látex lanzado hoy, las referencias volverán a ser correctas.

Antigua respuesta

En un LaTeX actual, la sintaxis de \newlabelen el .auxarchivo se ha unificado con la sintaxis utilizada porhyperrefy siempre contiene cinco contenedores de datos.cleverefno se ha adaptado a este cambio y todavía solo utiliza dos contenedores de datos en su definición. Entonces su archivo externo .auxcontiene (agregué algunos espacios para una mejor visibilidad):

\newlabel{sec:one}{  {1}  {1}  {One}  {section.1}  {}  }    %<------- five
\newlabel{sec:one@cref}{  {[section][1][]1}  {[1][1][]1}  } %<------- two

Dentro de un documento no importa tanto que elcleverefLa etiqueta tiene solo dos contenedores de datos, comocleverefes el único que lo usa. Peroxr-hyperTambién intenta cumplir con el nuevo estándar y extiende cada etiqueta que lee a cinco contenedores de datos. También utiliza el quinto contenedor de datos para almacenar el nombre del archivo de los enlaces.

Ahora, recientementexr-hyperse ha extendido para almacenar siempre el nombre del archivo (y no solo si la etiqueta contiene un nombre de destino en el cuarto contenedor) para permitir enlaces de archivos al documento externo incluso si ese documento no usóhyperref. Con este cambio se obtienen estas definiciones para las etiquetas del documento externo:

> \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}{}{}{}. 

Y luegocleverefcae sobre el fileone.pdfen el último argumento.

Lo mejor sería sicleverefSe actualizaría para usar siempre el contenedor de cinco datos estándar, de modo que todo esté sincronizado. Por ahora, puedes hacer algo como esto:

\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}

información relacionada