我希望能够定义一个宏,例如\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
作为主体应用,因此第二个上标显示得比第一个大。