Re: Aw: Re: Kleine Frage zu \url

"Bernd Raichle" (via tex-d-l Mailing List) <[email protected]>
Newsgroups gmane.comp.tex.german
Message-ID <25651.59174.197934.876269@lvps87-230-52-223.dedicated.hosteurope.de>
On Monday, 10 April 2023 00:31:48 +0200,
Martin Schröder <[email protected]> writes:
 > Am Mo., 10. Apr. 2023 um 00:18 Uhr schrieb Axel Berger
 > <[email protected]>:
 > > legst, ist *dieser* Fehler weg. Ganz offenbar definiert \url{}
 > > das "%" um, so daß es gültig wird, aber irgendwas in der Fußnote
 > > hebelt das wieder aus.
 > 
 > Dazu wird der catcode von % geändert - was in Argumenten von Makros
 > nicht funktioniert.

Naja, _diese_ Aussage ist dann doch etwas zu stark vereinfachend:


TeX verarbeitet dein Eingabetext in mehreren Schritten:

Im ersten Schritt werden die einzelnen Zeichen einer oder mehrerer Textdateien
(oder der Standardeingabe) in Tokens gewandelt.
Wie genau dies geschieht, kann durch die jedem Eingabe-Zeichen zugewiesenen \catcode
gesteuert werden.  Beispielsweise wird hier festgelegt, dass '%' als Kommentarzeichen
(nach diesem wird alles bis zum Zeilenende ignoriert), der Backslash '\' als einleitendes
Zeichen für eine eine Control-Sequenz, die alphabetischen Zeichen 'a..zA..Z' als "Letter"
etc. eingelesen und zu Tokens werden.  Ist dies passiert, daan kann an den Tokens
nichts mehr verändert werden, d.h. die besondere \catcode-Bedeutung ist fixiert.

Im zweiten Schritt finden dann die (Makro-)Expansionen statt, d.h. Control-Sequenzen
mit besonderer Bedeutung werden ausgewertet und hierbei werden Tokens durch andere Tokens
ersetzt, bis man nicht-expandiere Tokens hat.
Diese nicht-expandierbaren Token, die nach der Makro-Token-Text-Ersetzungen übrig geblieben
sind, triggern dann die Formatierung von Boxen, Zuweisungs-Operationen und ähnliches,
also letztlich dann das formatierente Dokument.


Zurück zum Beispiel:

Makros wie \verb (oder auch \url) definieren zuerst die \catcode verschiedener Eingabezeichen
um, so dass sie ihre besondere normale Bedeuetung verlieren.
Erst dann werden die nachfolgenden Zeichen gelesen und daraus Token geformt.

Hier ist die Reihenfolge wichtig, wann \catcode geändert und wann die Token geformt werden.
Wenn die Zeichen zuerst gelesen, daraus Token geformt und dann erst der \catcode einzelner
Zeichen verändert wird ... ist es zu spät: die Token sind bereits geformt und auch einige
Dinge wie das Kommentar-'%' bereits ausgewertet, so dass die nachfolgenden Zeichen der Zeile
bereits überlesen sind.

Beispiel:

\verb+Beispiel 1: % ist kein Kommentarzeichen+

\newcommand{\test}[1]{\verb+#1+}
\test{Beispiel 2: % ist ein Kommentarzeichen} so dass dies hier ignoriert wird
Unerwartet}

wird nicht funktionieren:

Das \verb in Beispiel 1 liest die nachfolgenden Zeichen eben erst einmal NICHT,
sondern ändert erst einmal die \catcode ... und liest dann alles, so dass das '%' nicht
mehr die Kommentarzeichen-Bedeutung hat.

In Beispiel 2 wird jedoch zuerst das Makro \test expandieren.  Hierzu wird ZUERST alles
in geschweiften Klammern als erstes Argument des Makros \test eingelesen und zu Token
gewandelt.  Hierbei ist \verb nicht aktiv geworden, d.h. es finden vorher keine \catcode-
Änderungen statt.  Ergebnis: das '%' im Argument ist ein Kommentarzeichen und alle
nachfolgenden Zeichen der Zeile werden ignoriert, so dass das erste Argument dann die
Token-Folge "Beispiel 2: Unerwartet" ist (d.h. das '}' in der Folgezeile beendet das
Argument.
Die Expansion des Makros \test führt dazu, dass dann in der Eingabe die Tokenfolge

\verb+Beispiel 2: Unerwartet+

steht und TeX expandiert dann \verb etc.  Die durch \verb gemachten \catcode-Änderungen
sind nun zu spät, da das nun nicht mehr Eingabezeichen sind, sondern bereits Tokens.


Dieses Problem hat man mit allen Makros und Umgebungen, deren korrekte Abarbeitung
auf \catcode-Änderungen angewiesen sind, also \verb, "verbatim", \url und ähnliche Dinge.


Viele Grüße
Bernd

-- 
FAQ: http://texfragen.de/
Durchsuchbares Archiv: https://www.listserv.dfn.de/sympa/arc/tex-d-l 
Unsubscribe/Verwaltung: https://www.listserv.dfn.de/sympa/info/tex-d-l
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.