章节标题/页眉中的交叉引用问题

章节标题/页眉中的交叉引用问题

我使用以下内容作为正文中的章节标题:

\documentclass[a4paper,openany]{book}

\usepackage{etoolbox} %Patches the "chapter" page numbering
\usepackage{fancyhdr}
\pagestyle{fancy} 
\fancyhead[RE]{\slshape \rightmark}
\fancyhead[LO]{\slshape \leftmark}
\fancyhead[LO,RE]{\thepage}
\fancyheadoffset[L]{0pt} %justification of the headers
\renewcommand{\headrulewidth}{0pt}
\renewcommand{\footrulewidth}{0pt}
\patchcmd{\chapter}{\thispagestyle{plain}}{\thispagestyle{empty}}{}{}
\cfoot{} % get rid of the page number 

\usepackage[a4paper, includehead, includefoot,  
top=0.75in,
bottom=0.5in,
outer=1in,
inner=1in,
]{geometry}

\usepackage{hyperref} 
\usepackage{cleveref} 

\begin{document}
\hypersetup{hidelinks} %Keep document hyperlinks but remove boarders 

\chapter{Chapter title text }\label{chap:sd}
some text
\clearpage
\section{Section title text \ref{chap:sd}}
\end{document}

但在标题中,它只显示“??”。

我该如何解决?

编辑:添加更多代码

答案1

缺少引用的原因仅仅是,\rightmark或者\leftmark使用在等或在中\MakeUppercase定义的宏,即articlelatex.ltx

LaTeX 转换Section Title text \ref{chap:sd}SECTION TITLE TEXT \ref{CHAP:SD}然后尝试扩展\ref{CHAP:SD},这当然是对不存在的标签的引用。

基本问题是,宏可能很\protected脆弱,但参数无法受到保护,至少不能以简单的方式保护,即将其chap:sd转换为大写字母。

基本上有三种解决方案:

  1. 从一开始就将用于章节标题的所有标签名称更改为大写

  2. 不要\ref{}在章节等标题中使用等

  3. 将标签名称隐藏在一个强大的宏中,即无法扩展的东西\MakeUpperCase,就像在保险箱中一样。

解决方案如下第二种方法。请注意,不可能再次使用相同的宏名作为健壮命令,因为这个宏名是.toc未展开的写入文件的 -- 它将使用最后已知的定义,而不是重新定义时的状态 -- 这就是出现\robustref和的原因\otherrobustref-- 但是由于有更多不同的引用出现在章节标题中,这种方法被证明是非常繁琐的,并且不是真正易于维护的。

我认为方法 1 更好。


\documentclass[a4paper,openany]{book}

\usepackage{etoolbox} %Patches the "chapter" page numbering
\usepackage{fancyhdr}
\pagestyle{fancy} 
\fancyhead[RE]{\slshape \bfseries \rightmark}
\fancyhead[LO]{\slshape \leftmark}
\fancyhead[LO,RE]{\thepage}
\fancyheadoffset[L]{0pt} %justification of the headers
\renewcommand{\headrulewidth}{0pt}
\renewcommand{\footrulewidth}{0pt}
\patchcmd{\chapter}{\thispagestyle{plain}}{\thispagestyle{empty}}{}{}
\cfoot{} % get rid of the page number 


\usepackage[a4paper, includehead, includefoot,  
top=0.75in,
bottom=0.5in,
outer=1in,
inner=1in,
]{geometry}

\usepackage{hyperref} 
\usepackage{cleveref} 


\DeclareRobustCommand{\robustref}{%
  \ref{chap:sd}%
}


\begin{document}
\hypersetup{hidelinks} %Keep document hyperlinks but remove boarders 

\chapter{Chapter title text }\label{chap:sd}
some text
\clearpage
\section{My section title \robustref}


\DeclareRobustCommand{\otherrobustref}{%
  \ref{otherchap:sd}%
}


\chapter{Another Chapter title text }\label{otherchap:sd}
some text
\clearpage
\section{My other section title \otherrobustref}


\end{document}

答案2

由于没有人能够解决这个问题,我决定在不使用参考的情况下重命名该部分标题。

相关内容