Я хотел бы определить команду, 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}
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}