定义具有不同数量参数的命令及其带星号的版本

定义具有不同数量参数的命令及其带星号的版本

我想要创建以下命令:

$\vecbi*{A}{s}$$\vecbi{A}$

在我的文本中写粗体矢量。

然而,我尝试了下面的代码,但仍然没有解决方案。

\makeatletter
\def\vecbi#1#2{\@ifstar\vecbiu\vecbin}
\def\vecbiu#1#2{\boldsymbol{#1}_{\text{#2}}}
\def\vecbin#1{\boldsymbol{#1}}
\makeatother

这是一个简单的例子:

\documentclass{article}
\usepackage{lipsum}
\usepackage{amsmath}

\makeatletter
\def\vecbi#1#2{\@ifstar\vecbiu\vecbin}
\def\vecbiu#1#2{\ensuremath{\boldsymbol{#1}_{\text{#2}}}}
\def\vecbin#1{\ensuremath{\boldsymbol{#1}}}
\makeatother

\begin{document}

$\vecbi*{A}{s} * \vecbi{A}$

\vspace{2cm}

\lipsum[21]

\end{document}

解决方案也可以不使用星号版本,例如

$\vecbi{A}{s}$$\vecbi{A}$

如果你能帮助(纠正)我,我将非常高兴。

答案1

该命令\vecbi应该被定义没有参数:

\documentclass{article}
\usepackage{amsmath,bm}

\makeatletter
\newcommand\vecbi{\@ifstar\vecbiu\vecbin}
\newcommand\vecbiu[2]{\bm{#1}_{\textnormal{#2}}}
\newcommand\vecbin[1]{\bm{#1}}
\makeatother

\begin{document}

$\vecbi*{A}{s} * \vecbi{A}$

\end{document}

\boldsymbol我已经用替换了过时的 ,\bm并删除了\ensuremath,这只会损坏您自己的打字稿。\text我使用了 ,而不是 ,这不能保证直立的形状\textnormal

在此处输入图片描述

替代方法:可选参数。我更喜欢第一种方法。

\documentclass{article}
\usepackage{amsmath,bm,xparse}

\NewDocumentCommand{\vecbi}{om}{%
  \bm{#2}\IfValueT{#1}{_{\textnormal{#1}}}%
}

\NewDocumentCommand{\vecbix}{mg}{
  \bm{#1}\IfValueT{#2}{_{\textnormal{#2}}}%
}

\begin{document}

$\vecbi[s]{A} * \vecbi{A}$

$\vecbix{A}{s} * \vecbix{A}$

\end{document}

在此处输入图片描述

答案2

如果你需要声明一个或两个参数的宏\vecbi{A}\vecbi{B}{s}那么你必须说明第二个参数存在的信号是什么。例如,信号是{在第一个参数之后立即使用的 open ,它们之间没有空格。那么你可以使用这个:

\def\vecbi#1{\def\tmp{#1}\futurelet\next\vecbiA}
\def\vecbiA{\ifx\next\bgroup\expandafter\vecbiu \else \expandafter\vecbin \fi}
\def\vecbiu#1{{\bf\tmp}_{\rm#1}}
\def\vecbin{{\bf\tmp}}

$ \vecbi{A}{s}, \vecbi{B} $

此代码不需要任何包,因为它仅基于 TeX 基元。抱歉,我在此示例中没有使用类似 LaTeX 的数学字体选择器,因为我不使用 LaTeX。您可以根据需要替换宏的\vecbiu主体\vecbin

编辑:常见的原则,如何实现具有零到九个参数的宏,,,,\macro等,如下:\macro{A}\macro{a}{b}{c}{d}

\newcount\tmpnum
\long\def\addto#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}}
\def\sdef#1{\expandafter\def\csname#1\endcsname}

\def\macro{\tmpnum=0 \def\tmp{}\futurelet\next\macroA}
\def\macroA{\ifx\next\bgroup \expandafter\macroB \else \expandafter\macroC \fi}
\def\macroB#1{\advance\tmpnum by1 \addto\tmp{{#1}}\futurelet\next\macroA}
\def\macroC{\csname macro\the\tmpnum\expandafter\endcsname\tmp}
\sdef{macro0}{\message{macro with no parameters}}
\sdef{macro1}#1{\message{macro with one parameter #1}}
\sdef{macro2}#1#2{\message{macro with two parameters #1, #2}}
\sdef{macro3}#1#2#3{\message{macro with three parameters #1, #2, #3}}
\sdef{macro4}#1#2#3#4{\message{macro with four parameters #1, #2, #3, #4}}
\sdef{macro5}#1#2#3#4#5{\message{macro with five parameters #1, #2, #3, #4, #5}}
\sdef{macro6}#1#2#3#4#5#6{\message{macro with six parameters}}
\sdef{macro7}#1#2#3#4#5#6#7{\message{macro with seven parameters}}
\sdef{macro8}#1#2#3#4#5#6#7#8{\message{macro with eight parameters}}
\sdef{macro9}#1#2#3#4#5#6#7#8#9{\message{macro with nine parameters}}

\macro{A}{B}, \macro{C}, \macro{D}{E}{F}, \macro.

相关内容