我想在标题中引用某些内容,同时仍将其大写。是否可以“保护”命令\ref
?
\documentclass{memoir}
\usepackage{hyperref}
\begin{document}
\chapter{Comes before Chapter \ref{s:2}}
\label{s:1}
\clearpage
Some text on next page so we can see the heading.
\chapter{Comes after Chapter \ref{s:1}}
\label{s:2}
\clearpage
Some text on next page so we can see the heading.
\end{document}
答案1
这里的问题实际上与 无关,memoir
因为如果您切换到 ,问题也会出现。有趣的是,如果被删除,book
问题就会消失。hyperref
然后是基本上就是罪魁祸首。当hyperref
被加载时\ref
,其内容不再免于在\ref
对其执行操作之前进行大写处理。这就是为什么你会看到 LaTeX 抱怨未知引用S:1
和 的原因S:2
。
在memoir
我们有一个包的副本textcase
因此我们应用\MakeTextUppercase
而不是正常的\MakeUppercase
,但至少在无法处理的标题中,它仍然会在应用之前将参数\ref
的内容大写。\ref
\ref
目前最好的解决方案是,实际上确保通过 hyperref 在标题中使用的标签使用大写字母。这样,将参数大写\ref
不会改变任何东西,并且 ref 会解析。
因此,
\chapter{Comes before Chapter \ref{s:2}}
\label{s:1}
...
\chapter{Comes after Chapter \ref{s:1}}
\label{s:2}
使用
\chapter{Comes before Chapter \ref{S:2}}
\label{S:1}
...
\chapter{Comes after Chapter \ref{S:1}}
\label{S:2}
补充:我们之所以在标题中看到问题,是因为标题是使用构造的,比如说,\markboth
执行\unrestored@protected@xdef
但在下hyperref
,\ref
已经受到保护,我们最终得到的是\MakeTextUppercase{... \protect\ref{s:1}} in the header, thus during upper casing
\ref` 被单独留下,但它的参数仍然扩大,从而导致了问题。(在聊天中解释)