Ich möchte \foreach
als Ersatz den folgenden Code verwenden:
\def\x{0}
\edef\y{\x}
\xdef\z{(b\y)}
\def\x{1}
\edef\y{\x}
\xdef\w{\z(b\y)}
\def\x{2}
\edef\y{\x}
\xdef\z{\w(b\y)}
\def\x{3}
\edef\y{\x}
\xdef\w{\z(b\y)}
\w
Das Ziel besteht darin, dieses Ergebnis zu erhalten: (b0)(b1)(b2)(b3) mit einem Makro
Ich habe das Ergebnis mit erhalten, \toks
aber vielleicht lässt sich dies vermeiden.
\documentclass{article}
\usepackage{tikz}
\begin{document}
\makeatletter
\toksdef\toks@=0 % ?
\toksdef\toks@@=1 %
\xdef\tmp{}%
\foreach \x in {0,1,2,3}{%
\toks@\expandafter{\x}%
\toks@@\expandafter{\tmp}%
\xdef\tmp{\the\toks@@(b\the\toks@)}%
}
\makeatother
\tmp
\end{document}
Ich finde, dieser Code ist nicht schön. Wie kann ich das Ergebnis besser erreichen, ohne ein externes Paket zu verwenden?
Antwort1
Der LaTeX-Kernel stellt \@for
dies bereit, funktioniert aber nicht in Gruppen wie \foreach
:
\def\tmp{}
\@for\next:=0,1,2,3\do{\edef\tmp{\tmp(b\next)}}
In Ihrem Code ist Folgendes nicht erforderlich \toks
:
\foreach \x in {0,1,2,3}{%
\xdef\tmp{\tmp(b\x)}%
}
würde auch funktionieren.
Wenn die Elemente jedoch in dem Sinne „gefährlich“ sind, dass sie nicht überleben \edef
(wie oder andere ähnliche Token), ist die Verwendung von Token-Registern erforderlich, um eine vollständige Erweiterung zu vermeiden, und Ihre Methode ist gut. Es ist besser , und nicht für lokale Zuweisungen \textbf
zu verwenden , also sollten Sie\toks2
\toks1
\toksdef\toks@@=2
Antwort2
Die Verwendung einer großen Paketschleifenstruktur ist hierfür wirklich übertrieben, da eine einzelne \def
ausreicht
\def\x#1{\ifnum\numexpr#1\relax>0 \x{#1-1}\fi(b\the\numexpr#1\relax)}
\typeout{\x{3}}
produziert
(b0)(b1)(b2)(b3)
Antwort3
pgfkeys
Wenn Sie und verwenden pgffor
(das intern vom .list
Handler verwendet wird), können Sie einfach den .list
Handler verwenden.
Wenn Sie nur den Sequenzsatz benötigen (b0)(b…)b(3)
, können Sieeins .code
Schlüssel und verwenden Sie diesen Schlüssel mit dem .list
Handler. (→ do
)
Wenn Sie jedoch ein erweiterbares Makro möchten, muss dieses Makro fest sein (→ doo
, entspricht \foreach \x in {0,...,3}{\xdef\tmp{\tmp(b\x)}}
) oder Sie benötigen mehr als eine Taste (→ dooo
, flexibler).
Code
\documentclass{article}
\usepackage{pgfkeys,pgffor}
\makeatletter
\pgfkeys{/alain/do/.code=(b#1)}
\pgfkeys{/alain/doo/.code=\edef\tmp{\tmp(b#1)}}
\pgfkeys{/alain/dooo ini/.code=\let\qrr@doo@temp\pgfutil@empty,
/alain/dooo/.code=\edef\qrr@doo@temp{\qrr@doo@temp(b#1)},
/alain/dooo set/.code=\let#1\qrr@doo@temp}
\makeatletter
\begin{document}
\pgfkeys{/alain/do/.list={0,...,3}}
\def\tmp{}
\pgfkeys{/alain/doo/.list={0,...,3}}
\tmp
\pgfkeys{/alain/.cd,
dooo ini,
dooo/.list={0,...,3},
dooo set=\myTemp}
\myTemp
\end{document}