Транспонировать матрицу и скобки

Транспонировать матрицу и скобки

Я хотел бы определить команду, 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без скобок может принимать только один токен в качестве аргумента, как \transp A+Bи \transp A. +BВ частности, тогда \transp \mathbf{A}dies horribly.

\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}

Связанный контент