
Existe um conflito conhecido entre a memoir
classe e o hyperref
pacote. hyperref
não é possível processar títulos do Índice que incluem a \MakeTextUppercase
macro.
O memoir
manual ( texdoc memoir
) fornece um trecho de código que deveria resolver o problema, mas não consigo fazê-lo funcionar.
Estou usando a solução do manual incorretamente ou é necessária outra solução?
\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}
Compilando este MWE recebo o seguinte erro:
! Argument of \contentsline has an extra }.
<inserted text>
\par
l.2 \contentsline
{chapter}{\chapternumberline {1}A Tale}{5}
Outras soluções foram propostas:
Mas o ideal é que a solução do manual da aula seja a correta.
Responder1
Acho que você está entendendo mal memoir
o manual.
Diz que ao carregar hyperref
você não pode definir uma fonte maiúscula para as partes do ToC com
\renewcommand*{\cftpartfont}{\MakeTextUppercase}
Diz que você pode usar \settocpreprocessor
desta maneira:
\makeatletter
\settocpreprocessor{part}{%
\let\tempf@rtoc\f@rtoc%
\def\f@rtoc{%
\texorpdfstring{\MakeTextUppercase{\tempf@rtoc}}{\tempf@rtoc}}%
}
\makeatother
Então, simplesmente remover a linha ofensiva do seu MWE dá o resultado desejado
\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}