我想定義一個指令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
如果沒有大括號,則只能接受一個標記作為其參數,and也是\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}