当我重新定义\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}
我从底部获得的内容的屏幕截图。
我已尝试过:
- 使用
\renewcommand{\section}[1]{\oldsection{#1}}
会产生完全相同的问题。 - 省略参数
\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
有几件事:
在
article
文档类中,\tableofcontents
问题\section*{\contentsname}
。请注意*
。\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}