Cleveref mostrando erroneamente o nome do arquivo em referências externas

Cleveref mostrando erroneamente o nome do arquivo em referências externas

Estou usando uma combinação de xr-hypere hyperrefcom cleverefvá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 fileoneprimeiro e depois o filetwo, que se refere à seção em fileone. A saída de filetwoé então

insira a descrição da imagem aqui

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 cleverefseja 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 \newlabelarquivo .auxfoi unificada com a sintaxe usada porhyperrefe sempre contém cinco contêineres de dados.cleverefnão foi adaptado a esta mudança e ainda utiliza apenas dois contêineres de dados em sua definição. Então seu .auxarquivo 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 ocleverefrótulo tem apenas dois contêineres de dados, comocleverefé o único que usa. Masxr-hypertenta 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-hyperfoi 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ãocleverefcai sobre o fileone.pdfno último argumento.

O melhor seria secleverefseria 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}

informação relacionada