如何应用 Memoir 手册的修复以允许目录中的 \MakeTextUppercase 带有 hyperref

如何应用 Memoir 手册的修复以允许目录中的 \MakeTextUppercase 带有 hyperref

memoir类和包之间存在已知冲突hyperrefhyperref无法处理包含宏的目录标题\MakeTextUppercase

手册memoirtexdoc memoir)提供了一些应该可以解决问题的代码,但我无法让它工作。

我是否错误地使用了手册的解决方案,或者是否需要其他解决方案?

\documentclass{memoir}

\renewcommand*{\cftpartfont}{\MakeTextUppercase}

% From Memoir manual p. 158
\makeatletter
\settocpreprocessor{part}{%
    \let\tempf@rtoc\f@rtoc%
    \def\f@rtoc{%
        \texorpdfstring{\MakeTextUppercase{\tempf@rtoc}}{\tempf@rtoc}}%
}
\makeatother

\usepackage{hyperref}

\begin{document}

\tableofcontents*

\part{A Whale}
\chapter{A Tale}
\section{A Sail}
\subsection{A Beachball}

\part{A Poodle}
\chapter{A Noodle}
\section{A Doodle}

\end{document}

编译此 MWE 我收到以下错误:

! Argument of \contentsline has an extra }.
<inserted text> 
                \par 
l.2 \contentsline
                  {chapter}{\chapternumberline {1}A Tale}{5}

还提出了其他解决方案:

但理想情况下,课程手册中的解决方案是正确的。

答案1

我认为你误解了memoir手册。

它说在加载时,hyperref你不能为目录中的部分设置大写字体

\renewcommand*{\cftpartfont}{\MakeTextUppercase}

它说你可以改用\settocpreprocessor以下方式使用:

\makeatletter
\settocpreprocessor{part}{%
    \let\tempf@rtoc\f@rtoc%
    \def\f@rtoc{%
        \texorpdfstring{\MakeTextUppercase{\tempf@rtoc}}{\tempf@rtoc}}%
}
\makeatother

因此,只需从 MWE 中删除有问题的行即可获得所需的结果

\documentclass{memoir}

%\renewcommand*{\cftpartfont}{\MakeTextUppercase}

% From Memoir manual p. 158
\makeatletter
\settocpreprocessor{part}{%
    \let\tempf@rtoc\f@rtoc%
    \def\f@rtoc{%
        \texorpdfstring{\MakeTextUppercase{\tempf@rtoc}}{\tempf@rtoc}}%
}
\makeatother

\usepackage{hyperref}

\begin{document}

\tableofcontents*

\part{A Whale}
\chapter{A Tale}
\section{A Sail}
\subsection{A Beachball}

\part{A Poodle}
\chapter{A Noodle}
\section{A Doodle}

\end{document} 

在此处输入图片描述

相关内容