
Estoy usando una combinación de xr-hyper
y hyperref
con cleveref
varios 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 fileone
primero y luego filetwo
, lo que hace referencia a la sección de fileone
. La salida de filetwo
es entonces
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 cleveref
se 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 \newlabel
en el .aux
archivo se ha unificado con la sintaxis utilizada porhyperref
y siempre contiene cinco contenedores de datos.cleveref
no se ha adaptado a este cambio y todavía solo utiliza dos contenedores de datos en su definición. Entonces su archivo externo .aux
contiene (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 elcleveref
La etiqueta tiene solo dos contenedores de datos, comocleveref
es el único que lo usa. Peroxr-hyper
Tambié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-hyper
se 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 luegocleveref
cae sobre el fileone.pdf
en el último argumento.
Lo mejor sería sicleveref
Se 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}