应用于更多符号时自动使用括号的命令

应用于更多符号时自动使用括号的命令

我如何定义像*这样的命令,类似于

\newcommand{\astcommand}[1]{{#1}^*}

但是,当应用于单个符号 a 时,会给出输出 a*,而当应用于多个符号(如 abc)时,会自动在输出中添加括号,如 (abc)*?

我的意思是,不必用括号来调用它,就像

\astcommand{(abc)}

只是

\astcommand{abc}

答案1

这是一个带有 * 变体的版本,它使用\mleftand\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或查看左右包裹。

相关内容