Cleveref 错误地在外部引用中显示文件名

Cleveref 错误地在外部引用中显示文件名

我正在使用 和 的组合xr-hyperhyperref其中cleveref包含多个文件。我拥有的旧代码不再正常工作。外部引用现在包括外部文件的文件名,而不仅仅是引用的编号。

在下面的例子中,我fileone先编译,然后编译filetwo,它引用了中的部分fileone。然后的输出filetwo

在此处输入图片描述

而不仅仅是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}

我怀疑需要进行一些修复cleveref,但还没有查明到底需要什么。

作为参考,文件版本是

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

答案1

编辑 2023-03-28

LaTeX 中已添加 cleveref 的急救包,其中包含答案中提到的重新定义。随着下一个 LaTeX 版本和今天发布的 latex-dev,引用将再次正确。

旧答案

在当前的 LaTeX 中,文件\newlabel中的.aux语法已经与hyperref并且始终包含五个数据容器。cleveref尚未适应此更改,并且在其定义中仍然只使用两个数据容器。因此您的外部.aux文件包含(我添加了一些空格以便更好地查看):

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

在文档中,cleveref标签只有两个数据容器,如cleveref是唯一使用它的人。但是xr-hyper尝试遵循新标准,并将其读取的每个标签扩展到五个数据容器。它还利用第五个数据容器来存储链接的文件名。

现在,最近xr-hyper已扩展为始终存储文件名(而不仅仅是当标签包含第四个容器中的目标名称时),以允许文件链接到外部文档,即使该文档未使用hyperref通过这种改变,可以从外部文档中获取标签的定义:

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

进而clevereffileone.pdf在最后一个论点中失败了。

最好的情况是cleveref也会更新为始终使用标准的五个数据容器,以便所有内容同步。现在,您可以执行以下操作:

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

相关内容