如何在逗号分隔的列表中定义带有 2 个或 3 个参数的 LaTeX 命令

如何在逗号分隔的列表中定义带有 2 个或 3 个参数的 LaTeX 命令

为了避免输入下标和额外的括号和方括号,我想要定义一个命令,比如说\disk,它可以与 2 个或 3 个参数的逗号分隔列表一起使用,如下所示:

$\disk{r,x}$
$\disk{r,x,d}$

这将分别产生与直接输入相同的输出:

$D_{r}(x)$
$D_{r}(x;d)$

[当然rx、 和d可以是任意字母或数字等。例如,我可能会使用\disk{\epsilon, 0, D}、 等。]

使用xparse或者其他方式,如何做到这一点?

尽管我知道可以使用可选参数获得两个不同的输出,但这需要在括号内输入第三个可选参数;并且在任何情况下,即使对于只有两个参数的情况,我也希望通过使用逗号分隔的列表{x, d}而不是来加快输入速度{x}{d}

答案1

我们可以在 TeX 原始级别上执行此操作,无需任何xparse或其他包。请注意,只有两行代码。

\def\disk#1{\diskA#1,,\end}
\def\diskA#1,#2,#3,#4\end{D_{#1}\ifx,#3,(#2)\else (#2;#3)\fi}

$\disk{r,x}$

$\disk{r,x,s}$

\end

如果您需要做这样的事情,$\disk{\epsilon,(1,2),\rho}$那么添加一行代码:

\def\disk#1{\diskA#1()\end}
\def\diskA#1(#2)#3\end{\ifx\end#3\end\diskB#1,,\end \else\diskA#1{(#2)}#3\end \fi}
\def\diskB#1,#2,#3,#4\end{D_{#1}\ifx,#3,(#2)\else (#2;#3)\fi}

$\disk{r,x}$

$\disk{r,x,s}$

$\disk{\epsilon,(1,2),\rho}$

\end

答案2

您必须假设有三个项目;如果没有,则缺少的项目将自动作为“无值”传递给内部宏。

然后内部宏可以检查给定的值。

\documentclass{article}
\usepackage{xparse}

\NewDocumentCommand{\disk}{ >{\SplitArgument{2}{,}} m }{\printdisk#1}
\NewDocumentCommand{\printdisk}{mmm}{D_{#1}(#2\IfValueT{#3}{;#3})}

\begin{document}

$\disk{r,x}$

$\disk{r,x,s}$

\end{document}

在此处输入图片描述

不同的实现:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\disk}{m}
 {
  % split the input at commas
  \seq_set_split:Nnn \l_murray_disk_input_seq { , } { #1 }
  % remove the leftmost item
  \seq_pop_left:NN \l_murray_disk_input_seq \l_murray_disk_radius_tl
  % print; _ is not available here
  D\c_math_subscript_token{\l_murray_disk_radius_tl}
    (\seq_use:Nn \l_murray_disk_input_seq { ; })
 }
\seq_new:N \l_murray_disk_input_clist
\tl_new:N \l_murray_disk_radius_tl
\ExplSyntaxOff

\begin{document}

$\disk{r,x}$

$\disk{r,x,s}$

\end{document}

相关内容