为了避免输入下标和额外的括号和方括号,我想要定义一个命令,比如说\disk
,它可以与 2 个或 3 个参数的逗号分隔列表一起使用,如下所示:
$\disk{r,x}$
$\disk{r,x,d}$
这将分别产生与直接输入相同的输出:
$D_{r}(x)$
$D_{r}(x;d)$
[当然r
,x
、 和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}