我想定义一个新的部分样式如下
\renewcommand\section{%
\@startsection{section}{1}
{\z@}%
{-3.5ex \@plus -1ex \@minus -.2ex}%
{2.3ex \@plus.2ex}%
{\normalfont\normalsize\bfseries}%
}
但每当我尝试 \MakeUppercase
{\normalfont\normalsize\bfseries\MakeUppercase}%
我收到错误“文件不存在”。如果我放置 \uppercase
{\normalfont\normalsize\bfseries\uppercase}%
目录中的章节标题不是大写的。对此有什么想法吗?
最小工作示例(MWE):
\documentclass{article}
\usepackage[T1]{fontenc}
\makeatletter
%Setting section style
\renewcommand\section{%
\@startsection{section}{1}
{\z@}%
{-3.5ex \@plus -1ex \@minus -.2ex}%
{2.3ex \@plus.2ex}%
{\normalfont\normalsize\bfseries}% normal size, boldface
}
%Setting subsection
\renewcommand\subsection{%
\@startsection{subsection}{2}
{\z@}%
{-3.25ex\@plus -1ex \@minus -.2ex}%
{2.3ex \@plus.2ex}%
{\normalfont\normalsize\uppercase}% normal size, uppercase
}
%Redefining sub-subsection
\renewcommand\subsubsection{%
\@startsection{subsubsection}{3}
{\z@}%
{-3.25ex\@plus -1ex \@minus -.2ex}%
{2.3ex \@plus.2ex}%
{\normalfont\normalsize\MakeUppercase}% normal size, uppercase
}
\makeatother
\begin{document}
\tableofcontents
\section{This should be capitalized here and at ToC}
\subsection{Anything}
\subsubsection{Anything else}
\end{document}
答案1
您必须重新定义\l@section
,它是负责排版目录中章节条目的宏。
\documentclass{article}
\makeatletter
%Setting section style
\renewcommand\section{%
\@startsection{section}{1}
{\z@}%
{-3.5ex \@plus -1ex \@minus -.2ex}%
{2.3ex \@plus.2ex}%
{\normalfont\normalsize\bfseries\MakeUppercase}%
}
%Setting subsection
\renewcommand\subsection{%
\@startsection{subsection}{2}
{\z@}%
{-3.25ex\@plus -1ex \@minus -.2ex}%
{2.3ex \@plus.2ex}%
% {1sp}% No space after subsubsections
{\normalfont\normalsize\MakeUppercase}% normal size, boldface
}
%Redefining sub-subsection
\renewcommand\subsubsection{%
\@startsection{subsubsection}{3}
{\z@}%
{-3.25ex\@plus -1ex \@minus -.2ex}%
{2.3ex \@plus.2ex}%
{\normalfont\normalsize\bfseries}% normal size, medium
}
\renewcommand*\l@section[2]{%
\ifnum \c@tocdepth >\z@
\addpenalty\@secpenalty
\addvspace{1.0em \@plus\p@}%
\setlength\@tempdima{1.5em}%
\begingroup
\parindent \z@ \rightskip \@pnumwidth
\parfillskip -\@pnumwidth
\leavevmode \bfseries
\advance\leftskip\@tempdima
\hskip -\leftskip
\MakeUppercase{#1}\nobreak\hfil \nobreak\hb@xt@\@pnumwidth{\hss #2}\par
\endgroup
\fi}
\makeatother
\begin{document}
\tableofcontents
\section{This should be capitalized here and at ToC}
Anything
\end{document}
我已删除代码中所有不必要的部分,仅减少到部分标题和的重新定义\l@section
。再添加您需要的部分。
答案2
这不起作用的原因(最初在这个 comp.text.tex 线程),并且\MakeUppercase
都\uppercase
接受参数,并且不是声明(如\bfseries
)。
该主题的一位回复者定义了以下宏来解决这个问题:
\def\MIA@up{%
\def\@M##1\par{10000 \MakeUppercase{##1}\par}}
\makeatother
可以在标题中的和之间的乳胶文件中设置宏\makeatletter
。此宏应该可以按照您尝试使用的方式与您的代码一起使用\MakeUppercase
,如下所示:
\renewcommand\section{%
\@startsection{section}{1}{\normalfont\normalsize\bfseries\MIA@up}%
}
请注意,我最终用来解决相同问题的该宏的版本(类似于上面的宏,但增加了一些大小调整和\centering
,但使用\def
而不是来定义\renewcommand
)都是在一个.dtx
文件中定义的,我将其编译为一个.cls
文件并使用来加载\usepackage{}
。可能需要在乳胶文件的标题中进行微小的调整才能完成所有操作。