重新定义 \section 输出相当于在目录前添加一个额外的 \section{*}

重新定义 \section 输出相当于在目录前添加一个额外的 \section{*}

当我重新定义\section命令时,在目录之前会创建一个标题为“*”的附加部分,就好像我\section{*}在目录之前插入了内容一样,但我从未这样做过。以下是最小工作示例:

\documentclass[12pt]{article}

\usepackage{parskip,lipsum}
\let\oldsection\section
\def\section#1{\oldsection{#1}} % CREATES ADDITIONAL GHOST SECTION???

\begin{document}
\tableofcontents
\section{I am a section}
\lipsum[1]
\end{document}

我从底部获得的内容的屏幕截图。

我已尝试过:

  1. 使用\renewcommand{\section}[1]{\oldsection{#1}}会产生完全相同的问题。
  2. 省略参数\def\section{\oldsection}不会产生同样的问题,但我需要传递我需要执行的操作的参数。

(从更大的角度来看,我需要做的是:我想重新定义,\def\section#1{\clearevenpage\twocolumn[\oldsection{#1}]}以便各部分从偶数页开始,并在双列文档中跨越整个页面。但是,意外的行为似乎与我在这里想要实现的目标完全无关。)

带有额外部分的输出


编辑:对于任何想知道的人来说, \clearevenpage上面提到的定义为

\documentclass[twoside]{article}

\makeatletter
\def\clearevenpage{\clearpage\if@twoside \ifodd\c@page
    \hbox{}\newpage\if@twocolumn\hbox{}\newpage\fi\fi\fi}
\makeatother

答案1

有几件事:

  1. article文档类中,\tableofcontents问题\section*{\contentsname}。请注意*

  2. \section被定义为默认不接受任何参数。哇哦?!事实上,它将参数捕获和星号检查交给了其他宏。

因此,您对采用单数参数的(重新)定义\section必然会将作为第一个参数传递的任何内容作为其仅有的论点……正如您所见,当第一个参数是*(如\tableofcontents)时,这是一个问题。

与简单的重新定义不同,您必须在不同的位置进行干预(不是,\section而是在 调用的辅助宏的某个更深层的地方\section),或者从一开始就对默认提供的选择进行条件化\section。后一种选择更容易,也更易于理解。

\documentclass[twocolumn]{article}

\usepackage{lipsum}
%\usepackage{xparse}% Use this if your LaTeX distribution is not up-to-date.

\newcommand{\clearevenpage}{\clearpage}% Or whatever you have \clearevenpage defined as.

\let\oldsection\section
\RenewDocumentCommand{\section}{s o m}{%
  \clearevenpage
  \twocolumn[%
    \IfBooleanTF{#1}
      {\oldsection*{#3}}% \section*[.]{..}
      {\IfValueTF{#2}
        {\oldsection[#2]{#3}}% \section[.]{..}
        {\oldsection{#3}}% \section{..}
      }%
  ]
}

\begin{document}

\tableofcontents

\section{I am a section}

\lipsum[1]

\end{document}

相关内容