Immer wieder stößt man auf den „
zeigt im Log:
Das funktioniert, weil Soweit so gut. Was mir allerdings nicht klar ist: wozu oder wann braucht man diese Art der Expansion? Was sind praktische Beispiele, wo sie eingesetzt wird oder sogar eingesetzt werden muss? (Es scheint ja eine Art „expandierbarer Expansion“ zu sein?) gefragt 26 Jul '13, 21:56 cgnieder |
Versuch einer Eigenantwort nach verschiedenen Recherchen (und inzwischen auch eigener Anwendung)... Grundsätzlich scheint es für die
Punkte 2. und 3. scheinen häufiger eingesetzt zu werden als der erste Punkt. Für Punkt 1. habe ich quasi keine Hinweise gefunden, dass es tatsächlich in der Praxis angewendet wird, abgesehen von dem einen oder anderen Post von Heiko Oberdiek auf TeX.sx. Das Prinzip ist einfach (hier steht · für eine beliebige Anzahl Leerzeichen): Open in writeLaTeX
\romannumeral·<num>·\relax und Open in writeLaTeX
\romannumeral<num>\relax sind äquivalent: nach Befehlssequenzen werden Leerzeichen sowieso ignoriert und das Leerzeichen nach Beispiel: Open in writeLaTeX
\documentclass{article} \begin{document} \makeatletter \long\def\trim@left#1{\romannumeral-`\q#1} \def\foo{ foo } !\trim@left{\foo}! \end{document} Punkt 2. scheint öfter verwendet zu werden, um expandierbar Makros zu expandieren. Wenn man z.B. aufmerksam auf TeX.sx sucht, findet man dafür immer wieder Beispiele. Auch in Paketen wird es angewendet, etwa dem Open in writeLaTeX
\catcode`\Q=3 \newcommand\trim@spaces[1]{% \romannumeral-`\q\trim@trim@\noexpand#1Q Q% } \long\def\trim@trim@#1 Q{\trim@trim@@#1Q} \long\def\trim@trim@@#1Q#2{#1} \catcode`\Q=11
Open in writeLaTeX
\newcommand\trim@spaces@noexp[1]{% \unexpanded\expandafter\expandafter\expandafter{\trim@spaces{#1}}% } Punkt 3. wird zum Beispiel in den Open in writeLaTeX
\documentclass{article} \begin{document} \makeatletter \def\ME@use#1{#1}% \def\MultiExpand{\romannumeral\multiexpand}% \edef\ME@endroman#1{0\noexpand\expandafter\space}% \long\def\multiexpand#1{% \ifnum#1<2 \expandafter\ME@endroman \else \expandafter\ME@use \fi {% \expandafter\multiexpand \expandafter{\number\numexpr#1-1\expandafter}% }% }% \def\a{\b} \def\b{\c} \def\c{\d} \def\d{\e} \def\e{\f} \def\f{\g} \def\g{\h} \def\h{\i} \def\i{\j} \def\j{k} \expandafter\expandafter\expandafter\def \expandafter\expandafter\expandafter\x \expandafter\expandafter\expandafter{\MultiExpand{8}\a} \show\x % ->\i . \end{document} Ich selber habe mir inzwischen angewöhnt, sie für Punkt 2., die expandierbare Expansion, einzusetzen.
beantwortet 04 Aug '13, 20:30 cgnieder |
Sehr oft stößt man IMHO nicht auf den Trick. Im Prinzip zeigt Dein eigenes Beispiel bereits, wofür er gut ist. Wollte man etwas ähnliches ohne den Trick machen, müsste man ein Hilfemakro mit
\edef
definieren und darauf\show
anwenden.Ich nehme aber an, dass eine der häufigeren Anwendung das Entfernen von Leerzeichen ist. AFAIK nutzen beispielsweise
trimspaces
und verschiedene key=value-Pakete das.Das Entfernen von Leerzeichen ist ein guter Hinweis, Danke. An die hatte ich gar nicht gedacht, obwohl ich's ja noch erwähnt hatte... Bei meinem eigenen Beispiel leuchtet mir noch nicht ganz ein, wo der potentielle Vorteil gegenüber einem Hilfsmakro und
\edef
wäre.@Clemens Da es bei TeX scopes nur in Form von Gruppen, nicht aber beispielsweise zur Trennung unterschiedlicher Module/Pakete/Klassen (oder wie immer man es nennen mag) gibt, sind Hilfsmakros immer ein wenig lästig, weil man keine wirklich privaten Namen dafür hat. Gerade das Verpacken in Gruppen kann höchst lästig sein, wenn man das Ergebnis dann wieder außerhalb der Gruppe benötigt. Man landet da sehr schnell bei seltsamen Konstrukten mit
\expandafter
,\unexpanded
,\noexpand
und\aftergroup
. Deshalb sind Tricks, die Hilfsmakros und damit auch Gruppen vermeiden, oftmals nützlich.Ein schönes Beispiel für eine Rekursion:
http://www.gust.org.pl/projects/pearls/2005p/david-kastrup/bachotex2005-david-kastrup-pearl3.pdf
@Herbert Danke für den Link! @saputello Ok, das leuchtet mir ein. Selbst mit hinreichend langen und komplizierten Namen für Hilfsmakros ist man natürlich nie vollständig auf der sicheren Seite. Dennoch scheint mir -- je weiter ich mich damit beschäftige -- der eigentliche Vorteil darin zu liegen, dass die
\romannumeral
-Expansion selbst expandierbar ist, z.B.: