如何根据 \section 及其可选参数定义新命令?

如何根据 \section 及其可选参数定义新命令?

我定义了一个新的命令,\mysec如下所示:

\documentclass{article}
\newcommand{\mysec}[1]{\section{#1}}
\begin{document}
\mysec[Foo foo]{Bla bla bla}
\end{document}

但在 PDF 输出中,我得到:

1 [

Foo foo]Bla bla bla

如何解决这个问题呢?

顺便说一句,我更希望不使用额外的软件包来解决问题。另请注意,我不想重新定义命令\section

答案1

引用TeX 常见问题解答

在使用 定义的宏中\newcommand,可选参数的工作方式与 的可选参数不太一样\section。 的可选参数的默认值 \section是强制参数的值,但\newcommand要求您事先“知道”默认值。

必要的技巧是在可选参数中使用宏[...]

使用您的 MWE 加上第一个常见问题解答解决方案:

\documentclass{article}
\newcommand\mysec[2][\DefaultOpt]{%
  \def\DefaultOpt{#2}%
  \section[#1]{#2}%
}
\begin{document}
\tableofcontents
\mysec{Foo}
\mysec[Bla]{Bla bla bla}
\end{document}

在此处输入图片描述

答案2

\section有几种语法形式:

  • \section*{title}:星号形式抑制了目录中的编号和条目。
  • \section[toc]{title}:如果没有使用星号,则可以使用可选参数给出目录中的不同条目。

两个 LaTeX 内核宏有助于解析参数\section

  • \@ifstar{<star>}{<no star>}:如果后面有星号,则调用第一个参数,否则调用第二个参数。如果看到星号,则将其从输入中删除。

  • \@dblarg{<macro or macro with arguments>}:宏\@dblarg会查看下一个强制参数前面是否有可选参数,并使用两个参数调用其参数。如果有一个可选参数,则该参数放在方括号中,后面跟着强制参数。在这种情况下,\@dblarg或多或少是无操作。但如果缺少可选参数,则\@dblarg复制强制参数的内容并将其传递到方括号中。示例:

    \@dblarg{\foo}[aa]{bb} ⇒ \foo[aa]{bb}
    \@dblarg{\foo}{cc} ⇒ \foo[cc]{cc}
    

然后\mysec可以按以下方式定义:

\documentclass{article}

\makeatletter
\newcommand*{\mysec}{%
  \@ifstar{\@mysec@star}{\@mysec}%
}
\newcommand*{\@mysec}{%
  \@dblarg\@mysec@nostar%
}
\newcommand*{\@mysec@star}[1]{%
  \section*{#1}%
  \begin{tabular}{@{}l@{ }l@{}}
    Star: yes\\
    Title: #1\\
  \end{tabular}%
}
\def\@mysec@nostar[#1]#2{%
  \section[{#1}]{#2}%
  \begin{tabular}{@{}l@{ }l@{}}
    Star: & no\\
    Toc: &#1\\
    Title: &#2\\
  \end{tabular}%
}
\makeatother

\begin{document}
\mysec*{Introduction}
\mysec{My section}
\mysec[Foo foo]{Bla bla bla}
\end{document}

结果

答案3

这对于xparse包裹:

\documentclass{article}
\usepackage{xparse}
\DeclareDocumentCommand\mysec{om}
 {%
  \IfValueTF{#1}
   {\section[#1]{#2}}
   {\section{#2}}%
 }
\begin{document}
   \tableofcontents
  \section[my section]{Here is normal section}
  Some text
  \section{Another normal section}
  Some text
  \mysec[foo bar]{this is my section}
  Text
  \mysec{this is my second section}
  Text
\end{document}

如果您不想使用任何额外的包:

\documentclass{article}
\let\mysec\section
\begin{document}
   \tableofcontents
  \section[my section]{Here is normal section}
  Some text
  \section{Another normal section}
  Some text
  \mysec[foo bar]{this is my section}
  Text
  \mysec{this is my second section}
  Text
\end{document}

在此处输入图片描述

相关内容