使用 \MakeUppercase 和 tocloft 时出错

使用 \MakeUppercase 和 tocloft 时出错

尝试使用tocloft包来定制目录,但是在使用\MakeUppercase\uppercase使用某些命令时遇到错误,即\cftsecfont

当我运行以下代码时,出现错误,提示缺少或多余}s。当我\MakeUppercase用替换时也会出现类似的错误\uppercase。如果我完全删除该命令,它将运行而不会出现任何错误。

\documentclass{article}
\usepackage{tocloft}
\begin{document}
\renewcommand{\cftsecfont}{\bfseries\MakeUppercase}
\tableofcontents
\section{Section One}
\subsection{Subsection}
\section{Section Two}
\end{document}

使用等时会出现类似错误\cftsubsecfont。我做错了什么?

答案1

您可以修补\l@section(和朋友)宏 - 它们负责设置目录中的章节/小节标题 - 到\MakeUppercase它收到的第一个参数(其中包括编号和标题):

在此处输入图片描述

\documentclass{article}
\usepackage{tocloft,etoolbox}% http://ctan.org/pkg/{tocloft,etoolbox}
\makeatletter
% \patchcmd{<cmd>}{<search>}{<replace>}{<success>}{<failure>}
\patchcmd{\l@section}{#1}{\MakeUppercase{#1}}{}{}% Sections use UPPERCASE in ToC
\patchcmd{\l@subsection}{#1}{\MakeUppercase{#1}}{}{}% Subsections use UPPERCASE in ToC
\makeatother
\begin{document}
\tableofcontents
\section{Section One}
\subsection{Subsection}
\section{Section Two}
\end{document}

上述补丁是根据\l@section(和朋友)的构造建议的(来自tocloft.dtx):

\renewcommand*{\l@section}[2]{%
  \ifnum \c@tocdepth >\z@
     % <snip>
     {\cftsecfont #1}\nobreak
     \cftsecfillnum{#2}}%
  \fi}

补丁之后,\l@section类似于

\renewcommand*{\l@section}[2]{%
  \ifnum \c@tocdepth >\z@
     % <snip>
     {\cftsecfont \MakeUppercase{#1}}\nobreak
     \cftsecfillnum{#2}}%
  \fi}

强制设置大写标题。

相关内容