von KOMA » Do 2. Sep 2010, 11:24
\global wirkt nur auf bestimmte Primitive, beispielsweise \let, \def, \edef. Wobei man statt \global\def auch gleich \gdef und statt \global\edef auch gleich \xdef verwenden kann.
\protected@edef etc. sind Macros. Wenn die expandieren, steht in der Expansion nach dem \global zwar tatsächlich eines der genannten Primitiven aber das falsche. Aus
\global\protected@edef\foo{\bar}
wird bei der Expansion:
\global\let\@@protect\protect
\let\protect\@unexpandable@protect
\afterassignment\restore@protect
\edef\foo{\bar}
Du siehst, dass dann \global an der falschen Stelle steht, nämlich nicht vor dem \edef am Ende.
\protected@edef erhält bei der Definition \protect, während \edef \protect i. d. R. schlicht wegwirft, weil es normalerweise als \relax definiert sein sollte (außer ein Paket- oder Klassenautor oder ein Anwender hat mal wieder gemurkst und \protect umdefiniert, ohne es anschließend wieder korrekt auf den vorherigen Wert zurück zu setzen). LaTeX-Anwender verlassen sich natürlich darauf, dass \protect wirklich hilft, wenn eine Anweisung ansonsten zerbrechen würde - auch bei mehreren Schachtelungen.
In einigen wenigen Fällen will man dann tatsächlich \edef statt \protected@edef. Darauf kommen wir dann, wenn Du mal ein Problem mit \protected@edef hast.
Achja: \protect benötigt man dann, wenn eine Anweisung ansonsten
zerbricht, das heißt zu früh expandiert wird. Das ist beispielsweise bei diversen Befehlen der Fall, wenn man sie in
moving arguments verwenden. Das wiederum sind Argumente, die nicht (nur) direkt von der Anweisung verarbeitet werden, der man sie übergibt, sondern von dieser weitergereicht werden. Bei Gliederungsbefehlen ist das beispielsweise das Argument, das in die aux- und von dort in die toc-Datei geschrieben und außerdem an \...mark weitergereicht wird, um von dort in den Kolumnentitel zu gelangen. \protect verhält sich je nach Kontext dabei unterschiedlich. Mal ist es ein einfaches \string, mal ein \protect\string, mal ein \noexpand, mal ein \protect\noexpand u. v. m.
Die primäre Anleitung zu vielen LaTeX-Befehlen und internen LaTeX-Befehlen findet man übrigens in source2e.pdf. Link gibt es in den
wichtigen Netzdokumenten.
\global wirkt nur auf bestimmte Primitive, beispielsweise \let, \def, \edef. Wobei man statt \global\def auch gleich \gdef und statt \global\edef auch gleich \xdef verwenden kann.
\protected@edef etc. sind Macros. Wenn die expandieren, steht in der Expansion nach dem \global zwar tatsächlich eines der genannten Primitiven aber das falsche. Aus [code]\global\protected@edef\foo{\bar}[/code] wird bei der Expansion: [code]\global\let\@@protect\protect
\let\protect\@unexpandable@protect
\afterassignment\restore@protect
\edef\foo{\bar}[/code] Du siehst, dass dann \global an der falschen Stelle steht, nämlich nicht vor dem \edef am Ende.
\protected@edef erhält bei der Definition \protect, während \edef \protect i. d. R. schlicht wegwirft, weil es normalerweise als \relax definiert sein sollte (außer ein Paket- oder Klassenautor oder ein Anwender hat mal wieder gemurkst und \protect umdefiniert, ohne es anschließend wieder korrekt auf den vorherigen Wert zurück zu setzen). LaTeX-Anwender verlassen sich natürlich darauf, dass \protect wirklich hilft, wenn eine Anweisung ansonsten zerbrechen würde - auch bei mehreren Schachtelungen.
In einigen wenigen Fällen will man dann tatsächlich \edef statt \protected@edef. Darauf kommen wir dann, wenn Du mal ein Problem mit \protected@edef hast. ;-)
Achja: \protect benötigt man dann, wenn eine Anweisung ansonsten [i]zerbricht[/i], das heißt zu früh expandiert wird. Das ist beispielsweise bei diversen Befehlen der Fall, wenn man sie in [i]moving arguments[/i] verwenden. Das wiederum sind Argumente, die nicht (nur) direkt von der Anweisung verarbeitet werden, der man sie übergibt, sondern von dieser weitergereicht werden. Bei Gliederungsbefehlen ist das beispielsweise das Argument, das in die aux- und von dort in die toc-Datei geschrieben und außerdem an \...mark weitergereicht wird, um von dort in den Kolumnentitel zu gelangen. \protect verhält sich je nach Kontext dabei unterschiedlich. Mal ist es ein einfaches \string, mal ein \protect\string, mal ein \noexpand, mal ein \protect\noexpand u. v. m.
Die primäre Anleitung zu vielen LaTeX-Befehlen und internen LaTeX-Befehlen findet man übrigens in source2e.pdf. Link gibt es in den [url=http://www.golatex.de/wiki/index.php?title=Wichtige_Netzdokumente]wichtigen Netzdokumenten[/url].