在 \newcommand 中使用必需参数作为可选参数的默认值

在 \newcommand 中使用必需参数作为可选参数的默认值

我想创建一个新的子部分命令,其调用结构与原始命令相同,但我不知道如何处理省略可选参数的情况。基本上,我希望必须newsubsection[Short Title]{Long Title}调用subsection[#1]{#2}newsubsection{Title}调用subsection{#1}

我读了有关类似问题的帖子大约两年前在这里发布,但它似乎要复杂得多(不止一个opt参数),而且我是一个 TeX 新手,无法将解决方案转移到我的问题上。

此外,我已经尝试了很多奇怪的组合,例如(尝试使用-example\newcommand{\subsect}[2][#1]{\par\nolinenumbers\subsection[#1]{#2}\linenumbers}中的语法失败\wbalTwo这里),但它们都未能实现任何远程工作。

答案1

xparse提供一个简单的界面和参数条件。以下可能是您想要的:

在此处输入图片描述

\documentclass{article}
\usepackage{lipsum,lineno,xparse}% http://ctan.org/pkg/{lipsum,lineno,xparse}
\NewDocumentCommand{\sect}{s o m}{%
  \par\nolinenumbers%
  \IfBooleanTF{#1}
    {\section*{#3}}% \sect*
    {\IfNoValueTF{#2}
      {\section{#3}}% \sect{...}
      {\section[#2]{#3}}% \sect[..]{...}
    }%
  \linenumbers%
}
\linenumbers
\begin{document} 
\section{First section}\lipsum[8]
\sect{Second section}\lipsum[8]
\end{document}

xparse提供对(或宏参数)\IfBooleanTF存在的条件以及对可选参数(或宏参数)存在的条件。*s\IfNoValueTFo

尽管我已经用 演示了它\section,但它很容易修改以便使用\subsection或类似的东西。

答案2

LaTeX 有一个辅助宏\@dblarg,用于分段和标题以及类似的命令,其用途正是:使可选参数具有主参数的默认值。

\makeatletter
\def\newsubsection{\@dblarg\@newsubsection}
\def\@newsubsection[#1]#2{%
\typeout{opt arg: #1}%
\typeout{main arg: #2}%
}

\newsubsection{aaa}

\newsubsection[xxx]{yyy}

\stop

产生了终端输出

opt arg: aaa
main arg: aaa
opt arg: xxx
main arg: yyy

相关内容