
Estou usando uma combinação de xr-hyper
e hyperref
com cleveref
vários arquivos. O código antigo que possuo não está mais funcionando corretamente. As referências externas agora incluem o nome do arquivo externo, em vez apenas do número referenciado.
No exemplo abaixo, eu compilo fileone
primeiro e depois o filetwo
, que se refere à seção em fileone
. A saída de filetwo
é então
em vez de apenas 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}
Suspeito que cleveref
seja necessária alguma correção, mas não localizei exatamente o que é necessário.
Para referência, as versões dos arquivos são
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
Responder1
Editar 28/03/2023
Um primeiro socorro para inteligência foi adicionado ao LaTeX que contém as redefinições mencionadas na resposta. Com o próximo lançamento do LaTeX e com o latex-dev lançado hoje as referências estarão corretas novamente.
Resposta Antiga
Em um LaTeX atual, a sintaxe do \newlabel
arquivo .aux
foi unificada com a sintaxe usada porhyperref
e sempre contém cinco contêineres de dados.cleveref
não foi adaptado a esta mudança e ainda utiliza apenas dois contêineres de dados em sua definição. Então seu .aux
arquivo externo contém (adicionei alguns espaços para melhor visibilidade):
\newlabel{sec:one}{ {1} {1} {One} {section.1} {} } %<------- five
\newlabel{sec:one@cref}{ {[section][1][]1} {[1][1][]1} } %<------- two
Dentro de um documento não importa tanto que ocleveref
rótulo tem apenas dois contêineres de dados, comocleveref
é o único que usa. Masxr-hyper
tenta aderir ao novo padrão também e estende cada rótulo que lê para cinco contêineres de dados. Ele também utiliza o quinto contêiner de dados para armazenar o nome do arquivo dos links.
Agora, recentementexr-hyper
foi estendido para armazenar sempre o nome do arquivo (e não apenas se o rótulo contiver um nome de destino no quarto contêiner) para permitir links de arquivo para o documento externo, mesmo que esse documento não tenha usadohyperref
. Com esta mudança obtém-se estas definições para os rótulos do 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}{}{}{}.
E entãocleveref
cai sobre o fileone.pdf
no último argumento.
O melhor seria secleveref
seria atualizado para usar sempre o contêiner de cinco dados padrão, para que tudo esteja sincronizado. Por enquanto, você pode fazer algo assim:
\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}