Ist es sicher, beim Definieren eines Makros Tabulatoren und Zeilenumbrüche zu ignorieren?

Ist es sicher, beim Definieren eines Makros Tabulatoren und Zeilenumbrüche zu ignorieren?

Ich habe mehrere LaTeX-Umgebungen geschrieben, um eine „Use Case Flow“-Sequenz für ein College-Projekt zu formatieren. Als Computerprogrammierer finde ich es ziemlich ärgerlich, dass ich keine Zeilenumbrüche und Einrückungen (wie bei C/Java-Code) verwenden kann, um den LaTeX-Code zu formatieren und ihn lesbarer zu machen, da ich weiß, dass ich mir des Problems der „unerwünschten Leerzeichen“ bewusst sein muss. Ich weiß, dass ich mit sichere Zeilenumbrüche erstellen kann %, aber es ist trotzdem ziemlich seltsam.

Dann fiel mir ein, dass jedem von TeX gelesenen Zeichen ein „Catcode“ zugewiesen ist, der sein Verhalten bestimmt, und dass es einen Catcode für Zeichen gibt, die ignoriert werden müssen (9). Also kam ich auf die Idee, die Catcodes für Zeilenumbrüche und Tabulatoren (die zur Codeformatierung verwendet werden) vorübergehend zu ändern und sie zu ignorieren, während die Makros definiert werden. Zum Beispiel dieser Code:

% UCSubFlow counter definition, etc
\newenvironment{subflow}[1]{%
\subparagraph{Subflow \arabic{UCSubFlow}: #1}%
\stepcounter{UCSubFlow}%
\begin{enumerate}%
}{%
\end{enumerate}%
}

wird meiner Meinung nach angenehmer zu lesen:

% Ignore tabs and newlines
\catcode9=9
\catcode13=9

% UCSubFlow counter definition, etc
\newenvironment{subflow}[1]{
    \subparagraph{Subflow \arabic{UCSubFlow}: #1}
    \stepcounter{UCSubFlow}
    \begin{enumerate}
}{
    \end{enumerate}
}
% More macro definitions...

% Return tabs and newlines back to normal
\catcode9=10
\catcode13=5

Die Abstände am Zeilenanfang sind Tabulatoren, keine Leerzeichen (sie werden trotzdem verwendet). Ich gehe davon aus, dass:

  • Meistens verwenden Makros kein <tab>s in ihrer Definition
  • Meistens haben Makros keine großen Textabschnitte. Wenn ich einen Absatz in meinem Makro beginnen möchte, ist es besser,\par
  • Makros können immer in einer Zeile geschrieben werden (sehr lange, aber immerhin eine Zeile)

Ich habe es in meinem Dokument verwendet und es scheint alles in Ordnung zu sein. Die Umgebung funktioniert wie erwartet und es scheint nichts kaputt gegangen zu sein. Zugegeben, meine Umgebung ist ziemlich einfach (eine spezielle Liste). Meine Frage ist:Ist dieser „Hack“ beim Schreiben von Makros generell sicher, oder birgt er versteckte Gefahren? (Besonders, wenn ich Makros anderer Pakete in meinem Makro verwende)

Antwort1

Zunächst einmal lässt sich Ihr Vorhaben ganz einfach durch das Setzen von realisieren \endlinechar=-1. Sie müssen keinen Catcode für setzen, ^^Mda \endlinechar-1dies bewirkt, dass dieses Zeichen nicht eingefügt wird. Sie müssen keinen Catcode für ^^I(Tab) setzen, da Leerzeichen und Tabulatoren den Catcode 10 haben und am Anfang jeder Zeile einfach ignoriert werden.

Diese Einstellung ist jedoch gefährlich. Natürlich kann sie nicht in den normalen Text des Dokuments eingefügt werden, denn danach:

 Hello
 world!

Wir erhalten Helloworld! als Ergebnis. Und die Verwendung dieser Einstellung nur beim Lesen von Makros? Stellen Sie sich die Definition vor:

\def\a{Hello
       world!}

dann tritt das gleiche Problem wie oben auf. Und das Problem kann versteckter sein, zum Beispiel:

\def\b{\ifnum\something=0
            123%
        \else
            456%
        \fi
}

Wenn nun am Ende jeder Zeile das Leerzeichen vorhanden ist, haben wir, if(somenthing=0) 123 else 456 fiaber wenn das Leerzeichen hier nicht vorhanden ist, haben wir, if(something=0123) else 456 fiund das ist ein völlig anderes Verhalten eines solchen Makros.

verwandte Informationen