我想定义一个命令\widecomma
,使其$\widecomma{a,b}$
看起来与相同$a,~b$
。以下是我的尝试。
\let\comma,
\newcommand{\widecomma}[1]{\begingroup\catcode`,=\active\newcommand,{\comma~}#1\endgroup}
但如果我在下面的 MWE 中尝试它,\inaccessible
就会引发错误
\documentclass{article}
\let\comma,
\newcommand{\widecomma}[1]{\begingroup\catcode`,=\active\newcommand,{\comma~}#1\endgroup}
\begin{document}
$\widecomma{a,b}$
\end{document}
答案1
这比你的尝试要复杂一些。最好让角色数学活跃起来,而不是活跃起来一概而论,因此类别代码不会改变,并且\widecomma
也可以用作另一个命令的参数。
该指令\let\comma=,
不起作用,主要是因为你想保存数学代码逗号。
\documentclass{article}
% save the math code of the comma
\mathchardef\normalcomma=\mathcode`,
% define a suitable meaning for the active comma
\newcommand{\activatewidecomma}{%
\begingroup\lccode`~=`, \lowercase{\endgroup\def~}{{\normalcomma}\ }%
}
% in the scope of \widecomma the space after the comma will be wider
\newcommand{\widecomma}[1]{%
\begingroup
% set up the wanted meaning and make the comma math active
\activatewidecomma
\mathcode`,="8000
#1%
\endgroup
}
\begin{document}
$\widecomma{a,b}$ (wide)
$a,b$ (normal)
\end{document}
但是,正如评论中指出的那样,下标或上标中的逗号不应受到此行为的影响。我们可以通过以下方式修复此问题。
\documentclass{article}
% save the math code of the comma
\mathchardef\normalcomma=\mathcode`,
% define a suitable meaning for the active comma
\newcommand{\activatewidecomma}{%
\begingroup\lccode`~=`, \lowercase{\endgroup\let~}\makewidecomma
}
% in the scope of \widecomma the space after the comma will be wider
\newcommand{\widecomma}[1]{%
\begingroup
% set up the wanted meaning and make the comma math active
\activatewidecomma
\mathcode`,="8000
#1%
\endgroup
}
\newcommand{\makewidecomma}{%
{\normalcomma}% comma as an ordinary symbol
\nonscript\mskip 6mu plus 3mu minus 2mu % space only in text or display style
}
\begin{document}
$\widecomma{a,b}$ (wide)
$a,b$ (normal)
$\widecomma{a,H^{0,0}}$ (wide)
$a,H^{0,0}$ (normal)
\end{document}
答案2
根据评论中的请求,我提供了一个expl3
基于拆分逗号列表的解决方案。
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\widecomma}{ m }{
\clist_use:nn { #1 } { {,}\ } % since ~ means space in expl3
}
\ExplSyntaxOff
\begin{document}
\( \widecomma{a, b, c} \)
\end{document}
编辑:我猜可以使用\def
、\cs_new:Npn
或,\NewExpandableDocumentCommand
因为是\clist_use:nn
可扩展的。但我不确定将其设为\widecomma
可扩展是否会产生意想不到的后果。可能不会。