Welche Tipps haben die Leute zum Golfen in TeX / LaTeX? Bitte posten Sie einen Tipp pro Antwort, der mindestens etwas spezifisch für TeX / LaTeX ist.
Kontext: Ich habe diese Antwort bemerkt und festgestellt , dass es für TeX / LaTeX keine Tipps gibt. Daher erstelle ich diese. Es gibt einige Überschneidungen mit den engeren Fragetipps für das Golfen in TikZ (da TikZ ein spezifisches Makropaket auf TeX / LaTeX ist): Antworten auf diese Frage werden wahrscheinlich auch dort zutreffen, aber nicht umgekehrt.
Antworten:
Berücksichtigen Sie statt der dokumentierten interne LaTeX-Makros
Dies ist beispielsweise
\roman
ein dokumentiertes LaTeX-Makro, das auf LaTeX-Zählern funktioniert. Um daraus42
zu werdenXLIV
, müsste man so etwas benutzenWenn Sie stattdessen nachsehen, wie
\roman
das implementiert ist (verwenden Sie es\show\roman
, um es interaktiv abzurufen, anstatt die Quelldateien zu lesen), können Sie feststellen, dass es in Form eines nützlichen Makros namens implementiert ist\@roman
, und verwenden Sie es stattdessen direkt:\catcode`@11
ist die golfige Schreibweise\makeatletter
(Clean Way in LaTeX) oder\catcode`\@=11
(Clean Way in Plain TeX). Es wird zu Beginn nur einmal benötigt, danach können Sie Makronamen verwenden, die enthalten@
.quelle
~
kann als Makro verwendet werden (wie auch andere aktive Charaktere)Beispiel
Vor:
Nach:
Erläuterung : Im Allgemeinen sind Makros in TeX „Steuersequenzen“: Sie können
\something
oder definieren\a
. Sie können aber noch kürzer werden, indem Sie einen aktiven Charakter verwenden. Das einzige aktive Zeichen, das standardmäßig vorhanden ist (in TeX / LaTeX), ist~
(verwendet für "Krawatten", dh definiert als\penalty \@M \
in TeX (eine Strafe von 10000, gefolgt von einem Leerzeichen) und als\nobreakspace {}
in LaTeX). Aber nichts hindert Sie daran, es für den von Ihnen gewünschten Zweck neu zu definieren.Weiter : Sie können dasselbe mit jedem anderen Zeichen tun, indem Sie dessen Katcode auf
\active
(13) setzen. Zum Beispiel machenZ
hat einen aktiven Charakter ein „Kosten“ von 12 Bytes\catcode`Z13
. Dann können Sie einfachZ
überall anstelle eines Makros wie verwenden\z
. Bei einigen Zeichen, die mit einer bestimmten Bedeutung beginnen, funktioniert der direkte Backtick-Ansatz nicht und Sie benötigen ein weiteres Zeichen:\catcode`\Z13
oder\catcode90=13
.quelle
\def
kann festen Mustern entsprechenAngenommen, Sie hatten
\def\a #1 #2 {...some definition here...}
. Wenn Sie es dann auf eine Zeichenfolge wie aufrufen, können\a Act42, Scene26
die Argumente innerhalb des Makros wie # 1 <-Act42,
, # 2 <- zugewiesen werden ,Scene26
und dann müssen Sie einige weitere Arbeiten ausführen, um die relevanten Teile zu extrahieren. Stattdessen könnte man direkt schreibenund dann aufrufen, als
\a Act42, Scene26
würde direkt # 1 <-42
und # 2 <- gesetzt26
.(Dies ist im Grunde die Definition von
\def
, aber es ist leicht zu vergessen, da dies in LaTeX normalerweise nicht der Fall ist und Argumente lieber übergeben werden,{}
als wären es Funktionsaufrufe.)quelle
Wahl zwischen TeX und LaTeX
Darüber lässt sich viel sagen, aber vergleichen Sie kurz gesagt ein typisches einfaches TeX-Dokument, das "Hallo" druckt, mit einem typischen LaTeX-Dokument für dasselbe:
gegen
Die "Kosten" von LaTeX (Wrt-Code Golf) liegen auf der Hand. Der "Vorteil" ist natürlich, dass LaTeX eine Bibliothek mit vielen vorgefertigten Makros und Paketen enthält, von denen einige für die jeweilige Aufgabe nützlich sein können.
quelle
\@Roman
(es würde eine Menge Bytes kosten, wenn Großbuchstaben im Klartext verwendet würden) - aber einfaches TeX war oft kürzer.\input ...
ist kürzer als\usepackage{...}
Zum Beispiel können Sie schreiben
anstatt
Das sind 6 Bytes weniger.
quelle
\usepackage
zunehmender Anzahl der enthaltenen Pakete effizienter wird. Da Sie mehr als ein Paket mit nur einer\usepackage
Anweisung verwenden können, aber\input
für jedes Paket eine benötigen , ist\usepackage
die Option " Wenn Sie 3 oder mehr Pakete verwenden" die bessere.Wenn Sie LaTeX verwenden, verwenden Sie eine kurze
documentclass
(Idee von Chris H )Anstatt mit dem Typischen zu beginnen
Man kann kürzere Dokumentenklassen wie
book
oder sogar wählenoder
quelle
article
standardmäßig nummeriert seine Seiten, dies kann als zusätzliche Ausgabe angesehen werden. Vielleicht ist eine Meta-Frage, um zu bestimmen, welche Dokumentenklassen erlaubt sein sollen.g.cls
die nurarticle.cls
mit ist,\pagenumbering{gobble}
aber da der Github unten ist, kann ich es vorerst nicht aufstelleng.cls
Das Erstellen einer Umgebung mit dem Namen
myenvironment
generiert die Befehle\myenvironment
und\endmyenvironment
. Diese werden intern verwendet, um die Umgebung zu starten und zu beenden. In einigen Fällen können sie als Verknüpfungen verwendet werden. Zum Beispiel anstelle vonman kann tun
Nicht unterstützt, nicht zuverlässig, funktioniert nicht in allen Fällen, auf eigene Gefahr usw. usw.
quelle
\itemize{...}
noch mehr sparen.\usepackage{packagea,packageb,packagec}
funktioniert, solange Sie keine Optionen an die Pakete übergeben.quelle
Führen Sie die Zeilen zusammen. Zeilenumbrüche werden in LaTeX / TeX im Vergleich zu vielen Langformsprachen selten benötigt.
quelle
Einige Makros, für deren Argumente möglicherweise geschweifte Klammern erforderlich sind, tun dies tatsächlich nicht, insbesondere, wenn sie in einem anderen Makro mit
#1
-style-Argumenten verwendet werden.Die meisten Makros benötigen nur geschweifte Klammern, wenn das Argument mehr als ein Token (Zeichen oder Kontrollsequenz) enthält.
quelle
Wenn Sie dasselbe Makro mit einem langen Namen mehrmals verwenden müssen, können Sie
\let
einen kürzeren Alias definieren.Dies spart zwei Bytes
\def\a{\mymacrowithalongname}
, wenn Sie nicht mehrere Token in der Definition benötigen.Anstelle eines Makronamens können Sie ein aktives Zeichen zum Speichern von Backslashes verwenden.
Beachten Sie, dass
\let
dies nicht nur mit Makronamen funktioniert, sondern auch mit integrierten Grundelementen. Wenn Sie zum Beispiel viele\ifnum ... \fi
Konstrukte in Ihrem Code verwenden, können Sie durch das Definieren\let\i\ifnum
und Verwenden von\i ... \fi
ein paar Bytes sparen. Dies funktioniert auch für\let
sich selbst:\let\l\let
.quelle
Verwenden Sie lokale
{
...}
Gruppen mit BedachtWie in dieser Antwort hervorgehoben , können aktive Zeichen wie
~
als Makroname verwendet werden. Leider~
ist dies standardmäßig das einzige aktive Zeichen, und das Ändern des Catcodes für ein anderes Zeichen ist teuer:\catcode`!13
dauert 12 Byte. Wenn die neue Makrodefinition nur in einer kleinen Region Ihres Codes benötigt wird, können lokale Gruppen eine Lösung sein.Wenn TeX eine neue lokale Gruppe betritt, die von geöffnet wurde
{
, erstellt es eine neue Gruppierungsebene auf dem internen Speicherstapel. Dies bedeutet, dass alle aktuellen Makros und Register gespeichert werden. Änderungen an ihnen (sofern nicht ausdrücklich als markiert\global
) sind nur noch aktiv, bis die Gruppe durch geschlossen wird}
. Dies bedeutet, dass~
innerhalb einer Gruppe neu definiert und dort mit der neuen Definition verwendet werden kann. Die alte Definition wird nach Beendigung der Gruppe automatisch wiederhergestellt.Hier ist ein Beispiel:
Dies gibt aus
Ein interessanter Nebeneffekt dieses Gruppierungsmechanismus ist, dass die alten Werte in der Gruppe noch verfügbar sind, bis sie dort geändert werden. Stellen Sie sich zur Veranschaulichung vor, wir möchten eine Anzahl von Zeichen basierend auf dem Wert eines Zählers drucken, sie mit Leerzeichen bis zu einer festen Länge auffüllen und mit dem ursprünglichen Zählerwert fortfahren. Dies könnte folgendermaßen erreicht werden:
welche Ausgänge
Dieses Gruppierungsverhalten ist besonders wichtig, wenn Sie die Standardmakros von TeX für das
\loop ... \repeat
Verschachteln von Schleifen verwenden möchten . Diese Makros definieren interne Befehle und verwenden diese, um die weitere Vorgehensweise zu bestimmen. Wenn Sie sie verschachteln, ohne die innere Schleife in geschweifte Klammern zu setzen, werden die internen Befehle durcheinander gebracht und es kommt zu unerwartetem Verhalten.quelle
Die Weiterentwicklung von Zählern, wie z
auch arbeiten als
Das gleiche Prinzip gilt auch für die Initialisierung:
setzt den Zähler auf 1.
Beachten Sie, dass diese ein Leerzeichen (Zeilenumbruch oder Leerzeichen) nach sich ziehen müssen (oder a
\relax
, aber das gleiche gilt für Leerzeichen), damit der nächste Befehl nicht ignoriert wird. Beispielsweise,druckt NICHT \ u, ignoriert aber den
\the
Befehl.quelle
\enddocument
statt\end{document}
speichert zwei Zeichenquelle
\begin{document}
=>\document
obwohl