Ich möchte einen Befehl definieren, transp
der letztendlich ein Argument hat: den Namen der Matrix und schließlich zwei Ausgaben.
\transp{A}
ist die Matrix A^T in Klammern,\transp A
ist einfach die Matrix A^T.
Ich habe diesen Befehl ausprobiert:
\newcommand{\transp}[1]{
\ifstrempty{#1}{{}^{\text{\tbf{T}}} }{{}^{\text{\tbf{T}}} \left( #1 \right)}}
aber um das Transponierungssymbol zu drucken, muss ich schreiben \transp{}
. Kann ich den vorherigen Befehl ändern, um nur zu schreiben \transp
(wie in 2. erwähnt)?
Antwort1
Gemäß der Standard-TeX-Syntax sind \transp{A}
und \transp A
völlig gleichwertig.
DukönnteGehen Sie dazu folgendermaßen vor:
\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}
aber ich würde es vermeiden, weil es verwirrend ist.
Ich finde Folgendes viel besser. Sie markieren explizit die Stellen, an denen Sie Klammern haben möchten, indem Sie hinzufügen *
.
\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}
\NewDocumentCommand{\transp}{sm}{%
\IfBooleanTF{#1}{(#2)^{T}}{#2^{T}}%
}
\begin{document}
$\transp{A}+\transp*{B+C}$
\end{document}
Antwort2
Das Folgende scheint zu funktionieren, aber ich bezweifle, dass es im Allgemeinen eine gute Idee ist. Normalerweise ergibt \foo A
es \foo {A}
dasselbe Ergebnis für Makros mit einem Argument und die Klammern sind erforderlich, wenn das Argument aus mehr als einem Token besteht. Tatsächlich würde ich sagen, dass es eine gute Praxis ist, Klammern für obligatorische Argumente zu verwenden, selbst wenn sie nur ein Token einschließen.
Beachten Sie, dass \transp
ohne Klammern nur ein Token als Argument akzeptiert werden kann, also \transp A+B
und \transp A
. +B
Insbesondere dann \transp \mathbf{A}
stirbt auf schreckliche Weise.
\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}
Eine mit Sternchen versehene Variante wäre häufiger (siehe auch egregs Antwort)
\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}
Sie können aber auch ein optionales Argument verwenden ( p
für Klammern, b
für eckige Klammern)
\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}