Как применить исправление из руководства Memoir, чтобы разрешить \MakeTextUppercase в toc с hyperref

Как применить исправление из руководства Memoir, чтобы разрешить \MakeTextUppercase в toc с hyperref

Существует известный конфликт между memoirклассом и hyperrefпакетом. hyperrefНевозможно обработать заголовки оглавления, включающие \MakeTextUppercaseмакрос.

В memoirруководстве ( texdoc 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} 

введите описание изображения здесь

Связанный контент