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