定义一个新命令,其输出取决于内部参数

定义一个新命令,其输出取决于内部参数

也许有人可以告诉我如何在 \LaTeX 中定义一个新命令,该命令可以将一个强制值和另一个可选值(参数)作为输入。在这种情况下,根据可选参数的值,输出对象的类型应该会发生变化。

具体来说,在我的例子中,我需要指定一个命令\dependSet(<arg>, <opt par>)来绘制括号。在这种情况下,根据可选参数的存在/不存在应该改变输出(内部有/不存在垂直线):

功能 输出
\dependSet{x, y} 在此处输入图片描述
\dependSet{x, y}{a} 排

因此,为了可用性,参数位于命令的参数之后非常重要,并且使用花括号而不是方括号来选择。

附言:实际上,遗憾的是,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})%
}

答案2

以下代码与您的规范完全兼容,由完整示例给出:

\documentclass[onecolumn]{article}

\newcommand\ds[1]{%
    (#1)%
}

\begin{document}
    This can be used as text:
    
    \ds{x, y}
    
    \ds{x, y|a}
    
    It can also be used inline in math-mode: $\ds{x, y}$, see also: $\ds{x, y|a}$.
\end{document}

如您所见,这个想法是将参数与功能分开。这比考虑您可能想要或不想使用的各种组合要容易得多。

在此处输入图片描述

相关内容