轉置矩陣和括號

轉置矩陣和括號

我想定義一個指令transp,最終有一個參數:矩陣的名稱,最後是兩個輸出。

  1. \transp{A}是括號之間的矩陣 A^T,
  2. \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}

A^T //(A)^T

星號的變體會更常見(另請參閱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}

相關內容