我如何定义像*这样的命令,类似于
\newcommand{\astcommand}[1]{{#1}^*}
但是,当应用于单个符号 a 时,会给出输出 a*,而当应用于多个符号(如 abc)时,会自动在输出中添加括号,如 (abc)*?
我的意思是,不必用括号来调用它,就像
\astcommand{(abc)}
只是
\astcommand{abc}
答案1
这是一个带有 * 变体的版本,它使用\mleft
and\mright
或可选参数来手动调整括号的大小:
\documentclass{article}
\usepackage{xparse,mleftright}
\ExplSyntaxOn
% pass control to an inner function
\NewDocumentCommand{\astcommand}{sO{}m}
{
\IfBooleanTF{#1}
{ \cstoica_astcommand_auto:n { #3 } }
{ \cstoica_astcommand_manual:nn { #2 } { #3 } }
}
% *-version: we want to use \mleft(...\mright)
\cs_new_protected:Npn \cstoica_astcommand_auto:n #1
{
\_cstoica_astcommand:nnn { \mleft( } { #1 } { \mright) }
}
% normal version; #1 is either empty or \big, \Big, ...
\cs_new_protected:Npn \cstoica_astcommand_manual:nn #1 #2
{
\_cstoica_astcommand:nnn { \mathopen{#1(} } { #2 } { \mathclose{#1)} }
}
% #1 is the left delimiter, #2 is the string, #3 is the right delimiter
\cs_new_protected:Npn \_cstoica_astcommand:nnn #1 #2 #3
{
\int_case:nnF { \tl_count:n { #2 } }
{% only one token, no fences
{1}{ #2^{*} }
}
{ #1 #2 #3^{*} } % more than one token
}
\ExplSyntaxOff
\begin{document}
$\astcommand{a}\quad
\astcommand{ab}\quad
\astcommand{\sqrt{a}}\quad
\astcommand{}$
$\astcommand[\big]{a}\quad\astcommand[\big]{ab}$
$\displaystyle\astcommand*{\frac{a}{b}}$
\end{document}
警告诸如此类的输入\astcommand{{abc}}
将导致没有括号。要强制使用括号,请添加一个空组,例如
\astcommand{{}a}
答案2
这是一个使用的解决方案xstring
包裹
% arara: pdflatex
\documentclass{article}
\usepackage{xstring}
\newcommand{\astcommand}[1]{%
\StrLen{#1}[\mylength]%
\ifnum\mylength>1%
(#1)^*%
\else%
#1^*%
\fi}
\begin{document}
$\astcommand{a}$
$\astcommand{b}$
$\astcommand{abc}$
\end{document}
如果你可能需要括号根据参数增长,你可能想\left
使用\right
或查看左右包裹。