
InDasAntwort: Egreg hat die Makros verwendet \DeclareTextSymbol
, \DeclareTextCommandDefault
und wo ich zuvor (und erfolglos) ein einfaches oder \UndeclareTextCommand
versucht hatte .\newcommand
\let
Kann mir bitte jemand die korrekte Verwendung dieser Befehle und den Unterschied zum Standard \newcommand
etc. näher erläutern?
Antwort1
Einige Befehle können ihre Aktion basierend auf der aktuellen Ausgabecodierung auswählen.
Das einfachste Beispiel sind Akzente. Man möchte, dass \"
sich Akzente anders verhalten, wenn die Ausgabekodierung (die eine Entsprechung zwischen den verfügbaren Glyphen und ihrer Position in der Schriftart darstellt) OT1 oder T1 ist.
Im ersten Fall \"u
würde die Ausgabe aus einem Akzent und einem Buchstaben zusammengesetzt, mit T1 wird direkt ein vorgefertigter Buchstabe gesetzt (dieser Unterschied ist sehr wichtig, wenn die Silbentrennung berücksichtigt wird).
Anstatt also eine Liste von Befehlen zum Ändern der Definition beim Wechseln der Kodierungen zu pflegen, kann ein Befehl mit \DeclareTextSymbol
oder ähnlichen Funktionen definiert werden.
Schauen wir uns an \textborn
. Es ist im Basis-LaTeX nicht definiert, textcomp
bietet aber eine Definition dafür:
% textcomp.sty, line 225
\DeclareTextCommandDefault{\textborn}{\tc@check@symbol2\textborn}
Es ist nicht wichtig zu wissen, was der Ersatztext tun soll, aber dies definiert \textborn
als
\?-cmd \textborn \?\textborn
(drei Token, das letzte ist ein einzelnes Token, dessen Erweiterung der obige Ersetzungstext ist \tc@check@symbol2\textborn
und auf das durch Ausführen zugegriffen werden kann \csname ?\string\textborn\endcsname
).
Später, wenn ts1enc.def
geladen wird, weil textcomp.sty
implizit aufruft \usepackage[TS1]{inputenc}
), findet LaTeX
\DeclareTextSymbol{\textborn}{TS1}{98}
das wird einen ähnlichen Effekt haben wie zuvor, indem man definiert \textborn
als
\TS1-cmd \textborn \TS1\textborn
(wieder drei Token). Dies ist der wichtigste Teil. Wie funktioniert so ein Befehl?
Wenn LaTeX sich bei der Erweiterung von \textborn
an einer Stelle befindet, an der ein Zeichen gesetzt werden soll, wird die aktuelle Ausgabekodierung mit TS1 verglichen. Wenn dies der Fall ist, wird nur die Glyphe Nummer 98 der aktuellen Schriftart verwendet; andernfalls wird eine Gruppe geöffnet, die Kodierung auf TS1 umgeschaltet, das Zeichen 98 gesetzt und die Gruppe geschlossen.
Ein solcher Befehl ist immer robust, was bedeutet, dass er sich selbst erzeugt, wenn er in verschobenen Argumenten gefunden wird, anstatt sich zu erweitern, wenn Schreibvorgänge beteiligt sind.
Dies sollte Ihre Verwirrung erklären, wenn Sie
\let\oldtextborn\textborn
vor dem Laden kpfonts
und dann keinen Unterschied zwischen der von \textborn
und erzeugten Ausgabe sehen \oldtextborn
. Das kpfonts
Paket definiert nicht neu \textborn
, sondern ordnet der TS1-Kodierung basierend auf dem gewählten Schriftfamiliennamen eine neue Schriftart zu. Daher sind \oldtextborn
und \textborn
immer noch gleich.
Bei der Definition \textborn
der Verwendung der cmr
Familie muss man vorsichtig sein, denn eine Strategie wie
\let\oldtextborn\textborn
\renewcommand\textborn{{\fontfamily{cmr}\selectfont\oldtextborn}}
ist nicht garantiert sicher. Wenn beispielsweise \textborn
in einem beweglichen Argument, etwa in einem Abschnittstitel oder einer Bildunterschrift, vorkommt, .aux
enthält die Datei
\@writefile{toc}{\contentsline {section}{\numberline {1}{\fontfamily {cmr}\selectfont {\fontfamily {cmr}\selectfont \textborn }}}{1}}
wo der Befehl scheinbar mehrmals erweitert wird. Unter anderen Umständen kann dies sogar zu Endlosschleifen führen.
Eine Strategie mit Beteiligung \UndeclareTextCommand
ist auf jeden Fall sicherer.