논문을 작성하고 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\def
LaTeX 대신 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
레이블 이름에는 바벨 약칭을 지원할 수 없습니다.
링크를 원하지 않으면 \getrefnumber
of 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}}
이는 대문자 변환으로부터 참조를 보호하는 것만큼 우아하지는 않지만 동일한 항목에 두 개의 레이블을 붙이는 드문 경우이므로 관심을 끌 수 있습니다.