将 \section 重新定义为 \section*

将 \section 重新定义为 \section*

如果这是重复的,我很抱歉,但是我似乎无法在任何地方找到确切的答案。我正在用 LaTeX 打字,为了方便打字(虽然我承认不是那么方便),我想重新定义命令,\section使其不提供章节编号(即与 相同\section*)。

最初,我天真地尝试了\renewcommand{\section}{\section*},但这当然会导致无限递归(因为\section*使用 定义\section),所以没有奏效。接下来,经过一番研究,我似乎可以通过以下方式(在序言中)来规避这个问题:

\let\oldsection\section*
\renewcommand{\section}{\oldsection}

然而这返回了错误:

! LaTeX Error: Missing \begin{document}.

See the LaTeX manual or LaTeX Companion for explanation.
Type  H <return>  for immediate help.
 ...                                              

l.13 \let\oldsection\section*

\section*我相信该错误与命令中的使用有关\let,但不确定到底是什么错误。

我知道我可以通过以下方式解决这个问题:

\let\oldsection\section
\renewcommand{\section*}{\oldsection}

然而,我觉得这并不符合我开始这样做的懒惰精神,并且我希望(如果可能的话)找到一个仍然能让我以\section最佳方式使用它的解决方案。

我怀疑解决方案可能在于重新定义编号规则\section(这可以,但不是理想的),但如果有任何帮助我们将不胜感激!

答案1

*不是宏名的一部分,它实际上是一个参数——具有星号版本的宏用于\@ifstar检查下一个标记是否是*,并分支到一个不同的宏,该宏对星号版本执行预期操作,对无星号宏执行另一个宏。

\let\origsection\section存储旧的定义,这里的版本
总是代表\oldsection*版本。

\documentclass{article}

\let\origsection\section

\makeatletter

\renewcommand{\section}{%
  \@ifstar{%
    \origsection*%
  }{%
    \origsection*%
  }%
}

\makeatother

\begin{document}

\section{Foo}

\section*{Foo again}

\end{document}

答案2

secnumdepth如果我想要未编号的部分,我会设置:

\documentclass{article}

\setcounter{secnumdepth}{0}

\begin{document}

\section{Foo}


\end{document}

在此处输入图片描述

答案3

尝试这个:

https://tex.stackexchange.com/a/380116/120578

特别是对于您的需求它可以是这样的:

\let\oldsection\section
\makeatletter
\def\msection{%
\@ifstar{\@Starred}{\@nonStarred}%
}
\def\@Starred{%
\@ifnextchar[%
{\GenericWarning{}{Warning: A starred section can not have optional parameters. I am going to ignore them!}\@StarredWith}%
{\@StarredWithout}%
}      
\def\@StarredWith[#1]#2{%
\oldsection*{#2}%
}
\def\@StarredWithout#1{
\oldsection*{#1}%
}
\def\@nonStarred{%
\@ifnextchar[%
{\@nonStarredWith}%
{\@nonStarredWithout}%
}
\def\@nonStarredWith[#1]#2{%
\oldsection*{#2}%
}
\def\@nonStarredWithout#1{%
\oldsection*{#1}%
}
\makeatother 

相关内容