如果这是重复的,我很抱歉,但是我似乎无法在任何地方找到确切的答案。我正在用 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
答案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