大写标题中的 `\ref` (回忆录 + hyperref)

大写标题中的 `\ref` (回忆录 + hyperref)

我想在标题中引用某些内容,同时仍将其大写。是否可以“保护”命令\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` 被单独留下,但它的参数仍然扩大,从而导致了问题。(在聊天中解释)

相关内容