我发现自己\newcommand
经常使用宏,除了偶尔难以正确定义可选参数外,宏运行良好。但有一个严重的限制,我希望这能表明这是我的无知而不是限制,即使宏定义受参数的特定值约束的能力。一个简单的例子:我发现经常使用表达式 {1, 2, ..., n},我称之为 n 集,并使用以下简单宏:
\newcommand{\myNset}{\{1,2,\dots,n\}}
n
如果我可以传递一个整数作为参数,将其设为默认值,并且如果参数恰好是 2 或 3,则生成 {1,2} 或 {1,2,3) 等, 这不是很有帮助吗?当然比笨拙的要好:
\newcommand{\myTwoset}{\{1,2\}}
\newcommand{\myThreeset}{\{1,2,3\}}
等等,当然这些都太笨拙了,根本没用。在哪里划线?10 处?27 处?
这可能只是一个微不足道的例子,但我\newcommand
一次又一次地发现这种条件处理宏的应用,例如与创建矩阵有关。这将使我对 LaTeX 的使用达到一个全新的水平。
顺便说一句,我已经阅读了 LaTeX Companion 中的相关页面,但没有成功。
答案1
\documentclass{article}
\newcommand\myNset[1][99]{\{1,2\ifnum#1=3 ,3\else\ifnum#1>3 ,\dots,n\fi\fi\}}
\begin{document}
\myNset
\myNset[3]
\myNset[2]
\end{document}
\myNset[0]
并且[1]
与[2]
答案2
通过此 LaTeX3 实现,可选参数也可以是变量:
\documentclass{article}
\usepackage{amsmath,xparse}
\ExplSyntaxOn
\NewDocumentCommand{\Nset}{O{n}}
{
\{1
\str_case:nnF { #1 }
{
{1} {}
{2} {,2}
{3} {,2,3}
{4} {,2,3,4}
}
{,2,\dots,#1}
\}
}
\ExplSyntaxOff
\begin{document}
$\Nset$
$\Nset[1]$
$\Nset[2]$
$\Nset[3]$
$\Nset[4]$
$\Nset[5]$
$\Nset[m]$
$\Nset[k-1]$
\end{document}
我们用\NewDocumentCommand{\Nset}{O{n}}{...}
定义一个具有唯一可选参数的命令,其默认值为n
。此命令排版左括号和1
,然后根据已知值列表检查参数,在本例中为 1、2、3 和 4,并采取适当的操作(即排版参数中缺少的所有数字,以逗号分隔);如果可选参数未出现在列表中,则执行最后一个操作,即排版,2,\dots,<argument>
。最后,找到右括号。
答案3
这是一个基于的解决方案期权包裹:
\documentclass{article}
\usepackage{catoptions}
\newcommand*\Nset[1][1]{%
\{1%
\cptifcasse\ifstrcmpTF{#1}
{1}{}
{2}{, 2}
{3}{, 2, 3}
{4}{, 2, 3, 4}
\elseif
, 2, \dots, #1%
\endif
\}%
}
\begin{document}
$\Nset$
\par
$\Nset[1]$
\par
$\Nset[3]$
\par
$\Nset[n]$
\end{document}