So verwenden Sie \toks mit \foreach

So verwenden Sie \toks mit \foreach

Ich möchte \foreachals 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, \toksaber 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 \@fordies 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 \textbfzu verwenden , also sollten Sie\toks2\toks1

\toksdef\toks@@=2

Antwort2

Die Verwendung einer großen Paketschleifenstruktur ist hierfür wirklich übertrieben, da eine einzelne \defausreicht

\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

pgfkeysWenn Sie und verwenden pgffor(das intern vom .listHandler verwendet wird), können Sie einfach den .listHandler verwenden.

Wenn Sie nur den Sequenzsatz benötigen (b0)(b…)b(3), können Sieeins .codeSchlüssel und verwenden Sie diesen Schlüssel mit dem .listHandler. (→ 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}

verwandte Informationen