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

回答で言及されている再定義を含む、cleveref の応急処置が LaTeX に追加されました。次の LaTeX リリースと本日リリースされた latex-dev では、参照が再び正しくなります。

古い回答

現在のLaTeXでは、ファイル\newlabel内のの構文.auxは、hyperref常に 5 つのデータ コンテナーが含まれます。cleverefこの変更には適応されておらず、定義では依然として 2 つのデータ コンテナーのみを使用しています。そのため、外部.auxファイルには次の内容が含まれます (見やすくするためにスペースをいくつか追加しました)。

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

文書内では、cleverefラベルには2つのデータコンテナしかありません。cleverefそれを使っているのはただ一人です。しかしxr-hyper新しい標準にも準拠しようとし、読み取るすべてのラベルを 5 つのデータ コンテナーに拡張します。また、5 番目のデータ コンテナーを使用して、リンクのファイル名を保存します。

さて、最近xr-hyper常にファイル名を保存するように拡張されました(ラベルに4番目のコンテナの宛先名が含まれている場合だけでなく)これにより、外部ドキュメントが使用されていない場合でも、ファイルリンクを外部ドキュメントに作成できます。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}{}{}{}. 

その後cleveref最後の議論で失敗しますfileone.pdf

一番良いのはcleverefすべてが同期されるように、常に標準の 5 つのデータ コンテナーを使用するように更新されます。現時点では、次のようにすることができます。

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

関連情報