如何應用回憶錄手冊的修復以允許 \MakeTextUppercase 與 hyperref 一起出現在 toc 中

如何應用回憶錄手冊的修復以允許 \MakeTextUppercase 與 hyperref 一起出現在 toc 中

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} 

在此輸入影像描述

相關內容