我想定义一个transp
最终有一个参数的命令:矩阵的名称和最后两个输出。
\transp{A}
是括号内的矩阵 A^T,\transp A
就是矩阵A^T。
我尝试了这个命令:
\newcommand{\transp}[1]{
\ifstrempty{#1}{{}^{\text{\tbf{T}}} }{{}^{\text{\tbf{T}}} \left( #1 \right)}}
但要打印转置符号,我必须写入\transp{}
。我可以修改上一个命令以便只写入\transp
(如2中所述)吗?
答案1
根据标准 TeX 语法,\transp{A}
和\transp A
完全等价。
你可能按下列方式进行:
\documentclass{article}
\usepackage{amsmath}
\makeatletter
\DeclareRobustCommand{\transp}{%
\@ifnextchar\bgroup\transp@paren\transp@simple
}
\newcommand{\transp@paren}[1]{(#1)^{T}}
\newcommand{\transp@simple}[1]{#1^{T}}
\makeatother
\begin{document}
$\transp A+\transp{B+C}$
\end{document}
但我会避免这样做,因为它容易让人困惑。
我发现下面的方法好多了。你可以通过添加 来明确标记需要括号的位置*
。
\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}
\NewDocumentCommand{\transp}{sm}{%
\IfBooleanTF{#1}{(#2)^{T}}{#2^{T}}%
}
\begin{document}
$\transp{A}+\transp*{B+C}$
\end{document}
答案2
以下方法似乎有效,但我怀疑这总体上不是一个好主意。通常\foo A
和\foo {A}
对于只有一个参数的宏给出相同的结果,如果参数包含多个标记,则需要使用括号。事实上,我认为对强制参数使用括号是一种很好的做法,即使它们只包含一个标记。
请注意,\transp
不带括号的 只能接受一个标记作为其参数,和 也是如此\transp A+B
。特别是,会死得很惨。\transp A
+B
\transp \mathbf{A}
\documentclass{article}
\usepackage{amsmath}
\makeatletter
\newcommand*{\transp@nb}[1]{#1^{T}}
\newcommand*{\transp@br}[1]{(#1)^{T}}
\newcommand{\transp}{}
\protected\def\transp{%
\@ifnextchar\bgroup
{\transp@br}
{\transp@nb}}
\makeatother
\begin{document}
\begin{align*}
\transp A \\
\transp{A}
\end{align*}
\end{document}
带星号的变体会更常见(另见 egreg 的答案)
\documentclass{article}
\usepackage{amsmath}
\makeatletter
\newcommand*{\transp@nb}[1]{#1^{T}}
\newcommand*{\transp@br}[1]{(#1)^{T}}
\newcommand{\transp}{}
\protected\def\transp{%
\@ifstar
{\transp@br}
{\transp@nb}}
\makeatother
\begin{document}
\begin{align*}
\transp{A} \\
\transp*{A}
\end{align*}
\end{document}
但您也可以使用可选参数(p
用于括号、b
用于方括号)
\documentclass{article}
\usepackage{amsmath}
\makeatletter
\newcommand{\transp}[2][]{%
\if#1p
(#2)
\else
\if#1b
[A]
\else
A
\fi
\fi^{T}
}
\makeatother
\begin{document}
\begin{align*}
\transp{A} \\
\transp[b]{A}
\end{align*}
\end{document}