我使用以下内容作为正文中的章节标题:
\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
定义的宏,即article
latex.ltx
LaTeX 转换Section Title text \ref{chap:sd}
为SECTION TITLE TEXT \ref{CHAP:SD}
然后尝试扩展\ref{CHAP:SD}
,这当然是对不存在的标签的引用。
基本问题是,宏可能很\protected
脆弱,但参数无法受到保护,至少不能以简单的方式保护,即将其chap:sd
转换为大写字母。
基本上有三种解决方案:
从一开始就将用于章节标题的所有标签名称更改为大写
不要
\ref{}
在章节等标题中使用等将标签名称隐藏在一个强大的宏中,即无法扩展的东西
\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
由于没有人能够解决这个问题,我决定在不使用参考的情况下重命名该部分标题。