Cleveref 在外部引用中錯誤地顯示了檔名

Cleveref 在外部引用中錯誤地顯示了檔名

xr-hyper我將,hyperrefcleveref與多個文件結合使用。我擁有的舊代碼不再正常工作。外部引用現在包括外部文件的文件名,而不僅僅是引用的編號。

在下面的範例中,我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,引用將再次正確。

舊答案

\newlabel在目前的 LaTeX 中,文件中的語法.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}

相關內容