Cleveref가 외부 참조에 파일 이름을 실수로 표시함

Cleveref가 외부 참조에 파일 이름을 실수로 표시함

여러 파일과 xr-hyper, hyperref및 의 조합을 사용하고 있습니다 . 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 수정

답변에 언급된 재정의가 포함된 Cleveref에 대한 응급처치가 LaTeX에 추가되었습니다. 다음 LaTeX 릴리스와 오늘 릴리스된 latex-dev에서는 참조가 다시 정확해질 것입니다.

오래된 답변

\newlabel현재 LaTeX에서는 파일 의 구문이 .aux다음에서 사용하는 구문으로 통일되었습니다.hyperref항상 5개의 데이터 컨테이너를 포함합니다.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또한 새로운 표준을 준수하려고 노력하고 읽는 모든 레이블을 5개의 데이터 컨테이너로 확장합니다. 또한 다섯 번째 데이터 컨테이너를 사용하여 링크의 파일 이름을 저장합니다.

이제 최근에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표준 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}

관련 정보