헤더의 상호 참조, fancyhdr과 hyperref 간의 충돌

헤더의 상호 참조, fancyhdr과 hyperref 간의 충돌

논문을 작성하고 fancyhdr헤더로 사용하고 있습니다. 표준 "홀수 페이지의 장 이름, 짝수 페이지의 섹션 이름"입니다. 또한 hyperref내 참고문헌에서 긴 URL을 분리하려면 패키지를 사용해야 합니다 . 문제는 이 패키지(및 )를 사용할 때 breakurl헤더의 상호 참조가 물음표로 나타난다는 것입니다. 즉, 이름에 방정식에 대한 참조가 포함된 섹션/장이 있는 경우 해당 참조는 헤더에 제대로 표시되지 않습니다.

아래는 최소한의 예입니다. 컴파일 후 예를 들어 15페이지의 헤더를 참조하세요. 내가 댓글을 달면

\usepackage[breaklinks=true]{hyperref}
\usepackage{breakurl}

헤더에 참조가 올바르게 표시됩니다.

이 문제를 해결하는 이유나 방법에 대한 아이디어가 있습니까?

\documentclass[a4paper,11pt,twoside]{book}

\usepackage[rmargin=2cm,includeheadfoot,bmargin=2cm,tmargin=3cm, lmargin=4cm]{geometry}
\usepackage{fancyhdr}
\pagestyle{fancy}
\lhead[]{\footnotesize{\leftmark}}
\rhead[\footnotesize{\rightmark}]{}
\bibliographystyle{plain}

%If I comment the following two lines, no problem.
\usepackage[breaklinks=true]{hyperref}
\usepackage{breakurl}


\begin{document}

\title{Fake Title}
\author{Me}
\date{\today}
\maketitle

\chapter{First Chapter}

\section{First}
a \newpage b \newpage c \newpage
\section{Second}
\begin{equation}
x=2
\label{eq:myEquation}
\end{equation}
a \newpage b \newpage c \newpage
\section{Third}
\label{sec:thirdSection}
a \newpage b \newpage c \newpage

\chapter{Some thoughts about Section~\ref{sec:thirdSection}}
\section{First}
a \newpage b \newpage c \newpage
\section{About Equation~\ref{eq:myEquation}}
a \newpage b \newpage c \newpage
\section{First}
a \newpage b \newpage c \newpage
\end{document}

답변1

문제는 대문자로 된 헤더입니다. 당신 없이도 hyperref다음과 같은 경고를받습니다.

LATEX WARNING: REFERENCE `SEC:THIRDSECTION' ON PAGE 13 UNDEFINED on input line 44.

hyperref로드된 경우 \ref확장할 수 없으며 해당 인수는 참조 데이터를 가져오는 데 사용되기 전에 대문자로 변환됩니다.

이를 처리하는 방법에는 여러 가지가 있습니다. 한 가지 방법은 포함 \ref및 해당 인수를 포함하는 강력한 매크로를 사용하는 것입니다 . 그런 다음 이 명령을 사용하면 확장되지 않으며 \MakeUppercase인수가 대문자로 변환되지 않습니다.

% before \tableofcontents
\DeclareRobustCommand*{\RefSecThirdSection}{\ref{sec:thirdSection}}
\begin{document}
...
\tableofcontents
...
\chapter{Some thoughts about Section~\RefSecThirdSection}

\protected\defLaTeX 대신 e-TeX를 사용하면 \DeclareRobustCommand북마크 때문에 도움이 되지 않습니다. 비활성화 \MakeUppercase되고 명령이 다시 확장 가능해집니다. 대안은 다음과 같습니다 \pdfstringdefDisableCommands.

\protected\def\RefSecThirdSection{\ref{sec:thirdSection}}
\pdfstringdefDisableCommands{%
  \def\RefSecThirdSection{\ref{sec:thirdSection}}%
}

편의상 이를 매크로에 넣을 수 있습니다. 예:

\newcommand*{\headref}[1]{%
  \csname headref@#1\endcsname
}
\newcommand*{\declareheadref}[1]{%
  \protected\expandafter\def\csname headref@#1\endcsname{%
    \ref{#1}%
  }%
  \expandafter\pdfstringdefDisableCommands\expandafter{%
    \expandafter\def\csname headref@#1\endcsname{%
      \ref{#1}%
    }%
  }%
}
\declareheadref{sec:thirdSection}
\begin{document}
...
\tableofcontents
...
\chapter{Some thoughts about Section~\headref{sec:thirdSection}}

의 확장성으로 인해 \headref레이블 이름에는 바벨 약칭을 지원할 수 없습니다.

링크를 원하지 않으면 \getrefnumberof package를 refcount사용할 수 있습니다. \getrefnumber확장 가능하므로 참조 내용은 레이블 이름이 아닌 대문자로 변환됩니다.

\usepackage{refcount}
...
\refused{sec:thirdSection}
\chapter{Some thoughts about Section~\getrefnumber{sec:thirdSection}}

세 번째 방법은 먼저 대문자 레이블 이름을 사용하는 것입니다.

\label{SEC:THIRDSECTION}
...
\chapter{Some thoughts about Section~\ref{SEC:THIRDSECTION}}

답변2

Stephan이 언급했듯이 모든 대문자로 레이블을 작성하면 분명히 존재하지 않는 인수 \MakeUppercase가 수정되므로 문제가 해결됩니다. 그러나 보조 매크로를 사용하여 대소문자 변경을 숨길 수도 있습니다 .\ref{sec:thirdSection}\ref{SEC:THIRDSECTION}\MakeUppercase

\newcommand{\RthirdSection}{\ref{sec:thirdSection}}
\chapter{Some thoughts about Section~\protect\RthirdSection}
%...
\newcommand{\RmyEquation}{\ref{eq:myEquation}}
\section{About Equation~\protect\RmyEquation}

\protect또한 사용된 매크로도 있어야 합니다 .

이 제안은 TeX FAQ 항목에서 비롯되었습니다.사건을 바꾸는 기이함.

답변3

문서를 최소한으로 변경한 솔루션(새 매크로 또는 기존 레이블/참조 변경 없음)은 대문자 버전을두번째참조되는 항목의 라벨. 예를 들어 문제가 있는 참조가 다음과 같은 경우

\begin{theorem}\label{mainresult} Suppose... 
\end{theorem}

\section{Proof of Theorem~\ref{mainresult}}

다른 라벨을 추가하면 다른 변경 사항 없이 헤더에서 참조가 작동하게 됩니다.

\begin{theorem}\label{mainresult}\label{MAINRESULT} Suppose... 
\end{theorem}

\section{Proof of Theorem~\ref{mainresult}}

이는 대문자 변환으로부터 참조를 보호하는 것만큼 우아하지는 않지만 동일한 항목에 두 개의 레이블을 붙이는 드문 경우이므로 관심을 끌 수 있습니다.

관련 정보