也许有人可以告诉我如何在 \LaTeX 中定义一个新命令,该命令可以将一个强制值和另一个可选值(参数)作为输入。在这种情况下,根据可选参数的值,输出对象的类型应该会发生变化。
具体来说,在我的例子中,我需要指定一个命令\dependSet(<arg>, <opt par>)
来绘制括号。在这种情况下,根据可选参数的存在/不存在应该改变输出(内部有/不存在垂直线):
因此,为了可用性,参数位于命令的参数之后非常重要,并且使用花括号而不是方括号来选择。
附言:实际上,遗憾的是,LaTex 使用了一种相当不舒服的符号(有点像 ALGOL 60),并且没有采取任何措施使得能够以类似 Python 的风格定义新命令。
答案1
假设您出于某些原因不想输入(x,y)
或(x,y\mid a)
。并且有充分的理由不这样做:例如,您可能想要或被要求更改符号。硬连线输入会使任务变得非常困难。
这个想法是输入
\dependSet{x,y}
\dependSet{x,y|a}
但不会影响最终输出。输入非常自然,避免了过多括号带来的麻烦。
我们该怎么做呢?我们可以利用\NewDocumentCommand
它的\SplitArgument
功能。
\documentclass{article}
%\usepackage{xparse} % uncomment for older versions of LaTeX
\NewDocumentCommand{\dependSet}{>{\SplitArgument{1}{|}}m}{%
\dependSetAux#1%
}
\NewDocumentCommand{\dependSetAux}{mm}{%
\IfNoValueTF{#2}{% no | found
(#1)%
}{% found |
(#1\mid #2)%
}%
}
\begin{document}
$\dependSet{x}+\dependSet{x,y}+\dependSet{x,y|a}$
\end{document}
评论。
该命令\dependSet
将其参数作为两个括号组传递给。如果初始参数中\dependSetAux
没有,则第二个括号组将是可以进行测试的,如下所示。|
{-NoValue-}
如果您想更改最终格式,请按照 操作\dependSetAux
。
一个可能更有效但不太直接的代码是
\NewDocumentCommand{\dependSetAux}{mm}{%
(#1\IfValueT{#2}{\mid #2})%
}