如何在我的自定义类中处理带有星号的 \section*

如何在我的自定义类中处理带有星号的 \section*

我已经重新定义了 .cls 文件中的节和子节,以至于 \section* 导致了不良行为。

例如,\section*{Introduction} These analyses were performed在我的 .tex 文件中结果为:

在此处输入图片描述

我知道我应该使用类似\@ifstar这里讨论的功能来解决这个问题:https://texfaq.org/FAQ-cmdstar。然而,经过几个小时和多次迭代,我还没有成功。你们有人知道我错过了什么吗?

我的 .cls 文件中的章节和小节被重新定义如下:

%%%%%%%%%%% SECTIONING %%%%%%%%%%%
\renewcommand\section{\@startsection%
{section}{1}{\z@}%      %name, level, indent
{-\baselineskip}%       %beforeskip
{.75\baselineskip}%     %afterskip
{\reset@font\bf\MakeUppercase}  %bold, uppercase
}
\renewcommand{\thesection}{\@Roman\c@section} 

\renewcommand\subsection{\@startsection%
{subsection}{2}{\z@}%       %name, level, indent
{-\baselineskip}%       %beforeskip
{.75\baselineskip}%     %afterskip
{\reset@font\bf}%               %bold
}
\renewcommand{\thesubsection}{\thesection\@Alph\c@subsection}

\renewcommand\subsubsection{\@startsection
{subsubsection}{3}{\z@}%    %name, level, indent
{-.75\baselineskip}%        %beforeskip
{.5\baselineskip}%      %afterskip
{\reset@font\emph}%             %italic
}
\renewcommand{\thesubsubsection}{\thesubsection.\@roman\c@subsection}

我已将一个最小工作示例放在网上。它包含三个文件和一个 pdf。

最小值.tex:https://dl.dropboxusercontent.com/u/10060444/min_ex/min_ex.tex ntmanuscript.cls:https://dl.dropboxusercontent.com/u/10060444/min_ex/ntmanuscript.cls min_ex.pdf:https://dl.dropboxusercontent.com/u/10060444/min_ex/min_ex.pdf

答案1

您不需要\@ifstar在定义中添加任何内容,因为\@startsection已经处理好了。但是,您使用的某些包重新定义了\@ifstar。出于某种原因,此重新定义使用\new@ifnextchar而不是标准\@ifnextchar。旧定义会忽略空格,但这个新定义不会。您在 的末尾\@startsection和星号之间引入了一个空格:

\renewcommand\section{\@startsection%
  {section}{1}{\z@}%      %name, level, indent
  {-\baselineskip}%       %beforeskip
  {.75\baselineskip}%     %afterskip
  {\reset@font\bf\MakeUppercase}  %bold, uppercase
}

{\reset@font\bf\MakeUppercase} %bold, uppercase在百分号之前的 那行中看到它。将其更改为{\reset@font\bf\MakeUppercase}% bold, uppercase

由于您正在加载 titlesec 包,我不明白为什么您选择使用低级 LaTeX 界面\@atartsection。您不应该使用titlesec的功能来更改章节标题的外观吗?

答案2

请注意,所有默认的部门单位都将其字体定义为开关(从article.cls

\newcommand\section{\@startsection {section}{1}{\z@}%
                                   {-3.5ex \@plus -1ex \@minus -.2ex}%
                                   {2.3ex \@plus.2ex}%
                                   {\normalfont\Large\bfseries}}
\newcommand\subsection{\@startsection{subsection}{2}{\z@}%
                                     {-3.25ex\@plus -1ex \@minus -.2ex}%
                                     {1.5ex \@plus .2ex}%
                                     {\normalfont\large\bfseries}}
\newcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}%
                                     {-3.25ex\@plus -1ex \@minus -.2ex}%
                                     {1.5ex \@plus .2ex}%
                                     {\normalfont\normalsize\bfseries}}
\newcommand\paragraph{\@startsection{paragraph}{4}{\z@}%
                                    {3.25ex \@plus1ex \@minus.2ex}%
                                    {-1em}%
                                    {\normalfont\normalsize\bfseries}}
\newcommand\subparagraph{\@startsection{subparagraph}{5}{\parindent}%
                                       {3.25ex \@plus1ex \@minus .2ex}%
                                       {-1em}%
                                      {\normalfont\normalsize\bfseries}}

在你的课堂上你使用\MakeUppercase并不是\emph开关。这些宏会抓取它们可以抓取的第一个参数,并且可能会在扩展期间抓取错误的信息\@startsection。此外,为了避免出现\@ifstar问题,请不要在分段定义中留下空格。以下是您应该做的添加到你的班级:

\RequirePackage{regexpatch}% http://ctan.org/pkg/regexpatch
\newcommand{\@sec@title@format}[1]{#1}
\makeatletter
\xpatchcmd*{\@sect}{#8}{\@sec@title@format{#8}}{}{}
\xpatchcmd*{\@ssect}{#5}{\@sec@title@format{#5}}{}{}
\makeatletter

您对部分单位的定义应类似于:

%%%%%%%%%%% SECTIONING %%%%%%%%%%%
\renewcommand{\section}{\renewcommand{\@sec@title@format}[1]{\MakeUppercase{##1}}%
  \@startsection%
    {section}{1}{\z@}%      %name, level, indent
    {-\baselineskip}%       %beforeskip
    {.75\baselineskip}%     %afterskip
    {\reset@font\bfseries}%  %bold, uppercase
}
\renewcommand{\thesection}{\@Roman\c@section} 

\renewcommand{\subsection}{\renewcommand{\@sec@title@format}[1]{##1}%
  \@startsection%
      {subsection}{2}{\z@}%     %name, level, indent
      {-\baselineskip}%     %beforeskip
      {.75\baselineskip}%       %afterskip
      {\reset@font\bfseries}%               %bold
}
\renewcommand{\thesubsection}{\thesection\@Alph\c@subsection}

\renewcommand{\subsubsection}{\renewcommand{\@sec@title@format}[1]{\emph{##1}}%
  \@startsection
    {subsubsection}{3}{\z@}%    %name, level, indent
    {-.75\baselineskip}%        %beforeskip
    {.5\baselineskip}%      %afterskip
    {\reset@font}%             %italic
}
\renewcommand{\thesubsubsection}{\thesubsection.\@roman\c@subsection}

相关内容