
Diese Frage gibt es hier schon irgendwie:Wie schreibe ich ein Infix-Makro/einen neuen Befehl?
Aber ich suche nicht nach einer Möglichkeit, mit einem Infix-Befehl zu dividieren, für den es meines Wissens bereits einen Befehl gibt. Ich suche nach einer Möglichkeit, einen neuen binären Infix-Befehl fürbeliebigZweck. Etwas wie
\infixnewcommand{\T}{{bunchofstuff} {#1} {bunchofstuff} {#2} {bunchofstuff}}
Später im Code {2 z \T 3 y}
würde dann durch ersetzt {{bunchofstuff} {2 z} {bunchofstuff} {3 y} {bunchofstuff}}
.
Außerdem ließ mich die Website die andere Frage nicht kommentieren, da ich nicht den Ruf hatte, also war ich irgendwie gezwungen, eine neue Frage zu beginnen, zumindest bis ich genug Ruf hatte, um zu kommentieren. Tut mir leid :D
Das konkrete Beispiel, mit dem ich konfrontiert bin, ist die Definition von tfrac, aber als Infix, also würde es wohl tover sein. Aber um das klarzustellen: Ich bin nicht an einer „Lösung“ interessiert, die ein bereits vorhandenes Paket beinhaltet, in dem tover definiert ist. tover ist nur das aktuelle Beispiel. Mich interessiert, wieICHkönnte einen solchen Befehl in meinem eigenen Code definieren, da ich mir gut vorstellen kann, dass mein zukünftiges Ich diese Fähigkeit benötigt.
Antwort1
TeX bearbeitet Token streng in der Reihenfolge, in der sie in den Scanner gelangen. Wenn ein TokenTzu untersuchende Token erweiterbar ist, erweitert TeX es und sucht nach seinen Argumenten (ohne Erweiterung). Wenn das TokenTein Makro ist, werden es und seine Argumente durch den Ersetzungstext ersetzt; andernfalls verschwindet es einfach, nachdem seine Aktion ausgeführt wurde (dies ist der Fall bei \expandafter
und \noexpand
allen Bedingungen, einschließlich \else
und \fi
).
WennTist nicht erweiterbar, es wird zur Ausführung in den Schlund geschickt. In bestimmten Fällen kann dies Token auf der Haupttokenliste wiederbeleben (das ist bei \lowercase
und der Fall \uppercase
).
Daher gibt es keine Möglichkeit, ein „Infix-Makro“ zu definieren, das untersuchen kann, was davor kommt, weil das, was davor kommt, bereits entweder erweitert oder ausgeführt wurde; in beiden Fällen ist das Token verschwunden und nicht mehr verfügbar.
Der Fall von \over
und verwandten Primitiven ( \overwithdelims
, \atop
und \atopwithdelims
) ist ganz anders. Sie sind keine Makros und nicht erweiterbar, also sind sie, wie bereits gesagt,hingerichtet. Die Ausführung von \over
und den anderen besteht darin, die aktuell erstellte mathematische Liste beiseite zu legen, eine neue zu beginnen und sie nach Abschluss an einer anderen speziellen Stelle abzulegen. Die beiden gespeicherten Listen werden dann verwendet, um ein „Bruchatom“ als Zähler und Nenner zu bilden. Für die withdelims
Fälle werden Trennzeichen hinzugefügt und für die Fälle wird eine Bruchlinie festgelegt over
.
Wie Sie sehen, ist hier keine Makroerweiterung erforderlich (natürlich ist sie es beim Erstellen der beiden mathematischen Listen, aber das ist irrelevant). Der Prozess nutzt die Tatsache aus, dass TeX weiß, an welcher mathematischen Liste es im Mathematikmodus arbeitet. Dies steht dem Benutzer jedoch nicht zur Verfügung (bei LuaTeX kann es das sein, aber das ist eine andere Sache).
Sie könnten die Infix-Notation vortäuschen, indem Sie anstelle von {
und spezielle Trennzeichen verwenden }
, aber an diesem Punkt scheint ein Makro mit zwei Argumenten praktischer, da es ähnlich \frac
funktioniert.
Antwort2
Wichtig: sehenhttps://tex.stackexchange.com/a/638830/250119(und egregs Kommentar unten) für die Erklärung, was der Code macht (im Grunde macht er einenRegex-Suchen und Ersetzenbasierend auf dem TeX-Code), welche Einschränkungen es gibt, um zu entscheiden, ob Sie ihn verwenden möchten.
Quellcode:
%! TEX program = lualatex
\documentclass{article}
\usepackage{rewriterest}
\begin{document}
\newcommand\Tprefix[2]{{bunchofstuff} #1 {bunchofstuff} #2 {bunchofstuff}}
\ExplSyntaxOn
\rewriterest:n {
\regex_replace_all:nnN {
\{
( [^\{\}]* ) % group 1: content does not contain any { or }
\\T\b
( [^\{\}]* ) % group 1: content does not contain any { or }
\}
} {
\\Tprefix % we're doing textual substitution here, so no \c{Tprefix}
\{ \1 \}
\{ \2 \}
} \RWRbody
}
\ExplSyntaxOff
test: {2 x \T 3 y}
\end{document}
Ausgabe: wie erwartet.
Sie benötigen ein Paket, dessen Quellcode sich derzeit unterhttps://github.com/user202729/TeXlib