
In LaTeX ist es möglich, Ausdrücke wie zu schreiben \frac12
, die gleichwertig mit Ausdrücken wie sein sollten \frac{1}{2}
. Gibt es einen formalen Begriff für die erste Notationsform?
Antwort1
NEIN.
Dies ist nur ein Teil der normalen Art und Weise, wie TeX nicht begrenzte Makroargumente absorbiert. Wenn Sie
\def\foo#1{Something using #1 (or not).}
oder gleichwertig
\newcommand\foo[1]{Something using #1 (or not).}
Wenn \foo
erweitert wird, nimmt es das nächste Token oder die nächste ausgeglichene Gruppe im Eingabestrom als Argument auf (das wie #1
in der Definition verfügbar ist). Unter der Annahme normaler Kategoriecodes
- Ein Token ist ein einzelnes Zeichen (außer
\
,{
,}
,%
oder ein Leerzeichen bzw. ein Zeilenumbruch (da diese ignoriert werden)) oder eine Befehlsfolge (etwas, das mit beginnt\
), - eine ausgeglichene Gruppe beginnt
{
und endet mit dem ersten}
, das nicht zu einer anderen Gruppe gehört (die später begonnen hat). Die Klammern werden bei der Absorption aus der Gruppe entfernt (d. h.#1
sie sind nicht enthalten).
Aus diesem Grund sind \foo x
und \foo{x}
, \newcommand{\foo}
und \newcommand\foo
oder \frac 12
, \frac{1}{2}
, \frac{1}2
und \frac1 2
gleichwertig.
Es ist eine gute Praxis, die Version zu wählen, die am klarsten ist, was normalerweise bedeutet, eine Gruppe zu verwenden. Persönlich verzichte ich explizit auf die Gruppe, wenn ichmüssenGeben Sie ein einzelnes Token ein, etwa \newcommand\foo
.
Antwort2
Es könnte erwähnenswert sein, dass die Unterscheidung zwischen Einzeltoken-Argumenten und Argumenten in Klammern in LaTeX3/ expliziter ist expl3
. Konventionell expl3
sollte jeder Makroname mit enden, :
gefolgt von einer Buchstabenfolge, den sogenannten Argumentspezifizierern, die jeweils den Typ des entsprechenden Arguments widerspiegeln.
Neben vielen anderen haben wir
n
für geschweifte Gruppen oder einzelne Token-Argumente undN
nur für Einzeltoken-Argumente, normalerweise Makro-/Funktionsnamen oder Variablennamen.
Diese Spezifizierer ändern zwar nicht die Art und Weise, wie (La)TeX die einzelnen Argumente verarbeitet, geben dem Benutzer jedoch einen Hinweis darauf, wie die Argumente innerhalb des Makros verwendet werden.
Beispielsweise l3tl
stellt das Paket zwei Funktionen \tl_if_empty:nTF
und bereit \tl_if_empty:NTF
. Während beide Funktionen prüfen, ob eine Tokenliste leer ist, und Code bedingt ausführen, wird bei ersterer erwartet, dass sie mit einer geschweiften Gruppe von Token aufgerufen wird, während bei letzterer eine Tokenlistenvariable erwartet wird, die zuerst erweitert wird, bevor der Test an ihrem Inhalt ausgeführt wird.