![在 \newcommand 中使用必需参数作为可选参数的默认值](https://linux22.com/image/261680/%E5%9C%A8%20%5Cnewcommand%20%E4%B8%AD%E4%BD%BF%E7%94%A8%E5%BF%85%E9%9C%80%E5%8F%82%E6%95%B0%E4%BD%9C%E4%B8%BA%E5%8F%AF%E9%80%89%E5%8F%82%E6%95%B0%E7%9A%84%E9%BB%98%E8%AE%A4%E5%80%BC%20.png)
我想创建一个新的子部分命令,其调用结构与原始命令相同,但我不知道如何处理省略可选参数的情况。基本上,我希望必须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
\IfNoValueTF
o
尽管我已经用 演示了它\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