
Vielleicht kann mir jemand sagen, wie ich in \LaTeX einen neuen Befehl definieren kann, der als Eingabe einen obligatorischen Wert und einen optionalen Wert (Parameter) annehmen kann. In diesem Fall sollte sich der Typ des Ausgabeobjekts je nach Wert des optionalen Arguments ändern.
Insbesondere in meinem Fall muss ich einen Befehl \dependSet(<arg>, <opt par>)
zum Zeichnen von Klammern angeben. In diesem Fall sollte sich die Ausgabe je nach Vorhandensein/Fehlen des optionalen Arguments ändern (Vorhandensein/Fehlen einer vertikalen Linie darin):
Dementsprechend ist es für die Benutzerfreundlichkeit wichtig, dass der Parameter nach den Argumenten des Befehls steht und mit geschweiften Klammern und nicht mit eckigen Klammern ausgewählt wird.
PS:Eigentlich ist es schade, dass LaTex eine ziemlich unbequeme Notation verwendet (die so etwas wie ALGOL 60 erinnert) und nichts dazu beiträgt, die Definition neuer Befehle im Python-ähnlichen Stil zu ermöglichen.
Antwort1
Nehmen wir an, Sie möchten aus bestimmten Gründen nicht eintippen (x,y)
. (x,y\mid a)
Und es gibt gute Gründe, dies nicht zu tun: Sie möchten oder müssen beispielsweise die Notation ändern. Eine fest verdrahtete Eingabe würde die Aufgabe sehr erschweren.
Die Idee ist, einzugeben
\dependSet{x,y}
\dependSet{x,y|a}
aber ohne Auswirkungen auf die endgültige Ausgabe. Die Eingabe ist ganz natürlich und vermeidet die Komplikationen zu vieler Klammern.
Wie machen wir das? Wir können es \NewDocumentCommand
und seine \SplitArgument
Funktion nutzen.
\documentclass{article}
%\usepackage{xparse} % uncomment for older versions of LaTeX
\NewDocumentCommand{\dependSet}{>{\SplitArgument{1}{|}}m}{%
\dependSetAux#1%
}
\NewDocumentCommand{\dependSetAux}{mm}{%
\IfNoValueTF{#2}{% no | found
(#1)%
}{% found |
(#1\mid #2)%
}%
}
\begin{document}
$\dependSet{x}+\dependSet{x,y}+\dependSet{x,y|a}$
\end{document}
Kommentare.
Der Befehl \dependSet
übergibt sein Argument in \dependSetAux
Form von zwei geschweiften Gruppen. Wenn das erste Argument kein enthält |
, wird die zweite geschweifte Gruppe verwendet, {-NoValue-}
die wie gezeigt getestet werden kann.
Wenn Sie die endgültige Formatierung ändern möchten, klicken Sie auf \dependSetAux
.
Ein möglicherweise effizienterer, aber weniger geradliniger Code wäre
\NewDocumentCommand{\dependSetAux}{mm}{%
(#1\IfValueT{#2}{\mid #2})%
}
Antwort2
Der folgende Code ist vollständig mit Ihrer Spezifikation kompatibel und wird durch ein vollständiges Beispiel angegeben:
\documentclass[onecolumn]{article}
\newcommand\ds[1]{%
(#1)%
}
\begin{document}
This can be used as text:
\ds{x, y}
\ds{x, y|a}
It can also be used inline in math-mode: $\ds{x, y}$, see also: $\ds{x, y|a}$.
\end{document}
Wie Sie sehen, geht es darum, Argumente von Funktionalität zu trennen. Das ist einfacher, als sich alle möglichen Kombinationen auszudenken, die Sie vielleicht verwenden möchten oder nicht.