宏的双上标/下标问题

宏的双上标/下标问题

我希望能够定义一个宏,例如\newcommand{\Zs}{Z^*},然后在文本中的某个地方说$\Zs^T$并具有写入的效果$Z^{* T}$。还应该可以$\Zs$不使用下标来写入。有没有简单的解决方案可以实现这一点?最好是,解决方案应该允许人们相对轻松地对许多符号执行此操作。

我猜一种方法是定义一个带有类似参数的宏\newcommand{\Zss}[1]{Z^{* #1}}并使用或$\Zss{}$$\Zss{T}$但这似乎不太优雅。

我们可以定义一个蓝图命令,starred这样每当我们想要一个带星号的符号时,我们就可以写入\newcommand\Xs{\starred{X}}吗?

答案1

更新答案

使用e参数类型。

\documentclass{article}

\ExplSyntaxOn
\NewDocumentCommand{\definegenericstarred}{m}
 {
  \clist_map_inline:nn { #1 }
   {
    \cs_new_protected:cpn { ##1s } { \genericstarred{##1} }
   }
 }
\ExplSyntaxOff

\NewDocumentCommand{\genericstarred}{me{^_}}{%
  #1^{*\IfValueT{#2}{#2}}\IfValueT{#3}{_{#3}}%
}

\definegenericstarred{X,Y,Z,W}

\begin{document}

$\Xs+\Zs^T+\Ws+\Ys^2$

$\Xs_1+\Zs^T_1+\Ws+\Ys^2_1$

$\Xs_1+\Zs_1^T+\Ws+\Ys_1^2$

\end{document}

在此处输入图片描述

旧答案(已被新答案取代)

你必须自律,如果需要下标,

\Zs^{<superscript>}_{<subscript>}

代码如下:

\documentclass{article}

\makeatletter
\newcommand{\passerby@genericstarred}[1]{%
  #1\@ifnextchar^\passerby@eathat{^*}%
}
\def\passerby@eathat#1#2{% #1 is ^
  ^{*#2}%
}
\newcommand{\definegenericstarred}[1]{%
  \@for\next:=#1\do{%
    \expandafter\edef\csname\next s\endcsname{%
      \noexpand\passerby@genericstarred{\next}}%
  }%
}
\makeatother

\definegenericstarred{X,Y,Z,W}

\begin{document}
$\Xs+\Zs^T+\Ws+\Ys^2$
\end{document}

与LaTeX3相同:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\definegenericstarred}{m}
 {
  \clist_map_inline:nn { #1 }
   {
    \cs_new_protected:cpn { ##1s } { \passerby_generic_starred:n { ##1 } }
   }
 }

\cs_new_protected:Npn \passerby_generic_starred:n #1
 {
  #1 % print the main letter
  \peek_catcode_remove:NTF ^ % check if a ^ follows 
   { \passerby_add_star:n }  % yes, add the * to the explicit superscript
   { ^{*} }                  % no, just add the *
 }
\cs_new_protected:Npn \passerby_add_star:n #1
 {
  ^{*#1} % the final superscript
 }
\ExplSyntaxOff

\definegenericstarred{X,Y,Z,W}

\begin{document}
$\Xs+\Zs^T+\Ws+\Ys^2$
\end{document}

在此处输入图片描述

答案2

LaTeX\newcommand限制了它允许的分隔符。对于更通用的宏,您需要使用 TeX 的\def。我建议您egreg 的全面回答(重新)定义使用括号以外的分隔符的命令(例如 \underbrace)

在此处输入图片描述

\documentclass{article}

% sanity check (causes an error if \Zs is already defined as LaTeX command)
\newcommand{\Zs}{} 

\makeatletter
\def\Zs{%
  \@ifnextchar^%
    {\@Zs}
    {\@latex@warning{Missing argument for \string\Zs}\@Zs^{}}%
}
\def\@Zs^#1{%
  Z^{* #1}%
}
\makeatother

\begin{document}
foo $\Zs^T$ bar $\Zs$
\end{document}

答案3

我没有足够的声誉来发表评论,因此将其作为答案发布。 尝试一下{\Zs}^T。 看起来花括号迫使\Zs充当独立实体,从而避免了双上标问题。

编辑:这里似乎还有另一个问题。由于第二个上标应用了\Zs作为主体应用,因此第二个上标显示得比第一个大。

相关内容