\toks를 \foreach와 함께 사용하는 방법

\toks를 \foreach와 함께 사용하는 방법

\foreach다음 코드를 대체하는 데 사용하고 싶습니다 .

\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 

목표는 매크로를 사용하여 다음 결과를 얻는 것입니다. (b0)(b1)(b2)(b3)

나는 결과를 얻었 \toks지만 아마도 이것을 피할 수 있습니다.

\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} 

이 코드는 좋지 않은 것 같아요. extern 패키지 없이 결과를 얻는 더 좋은 방법은 무엇입니까?

답변1

LaTeX 커널은 \@for다음과 같은 그룹에서는 작동하지 않습니다 \foreach.

\def\tmp{}
\@for\next:=0,1,2,3\do{\edef\tmp{\tmp(b\next)}}

귀하의 코드에는 다음이 필요하지 않습니다 \toks.

\foreach \x in {0,1,2,3}{%
    \xdef\tmp{\tmp(b\x)}%
 }

잘 작동 할 것입니다.

그러나 항목이 생존하지 못한다는 점에서 "위험"한 경우 \edef(예: \textbf또는 기타 유사한 토큰), 완전한 확장을 피하기 위해 토큰 레지스터를 사용하는 것이 필요하며 귀하의 방법이 좋습니다. 로컬 과제 \toks2보다는 사용하는 것이 더 좋으 \toks1므로 그렇게 해야 합니다.

\toksdef\toks@@=2

답변2

큰 패키지 루프 구조를 사용하는 것은 실제로 과잉입니다. 단일이면 \def충분하기 때문입니다.

\def\x#1{\ifnum\numexpr#1\relax>0 \x{#1-1}\fi(b\the\numexpr#1\relax)}

\typeout{\x{3}}

생산하다

(b0)(b1)(b2)(b3)

답변3

pgfkeysand pgffor(핸들러가 내부적으로 사용하는 ) 를 사용하는 경우 .list간단히 핸들러를 사용할 수 있습니다 .list.

시퀀스 조판만 필요한 경우 다음 (b0)(b…)b(3)을 설정할 수 있습니다.하나 .code키를 선택하고 해당 키를 .list핸들러와 함께 사용하세요. (→ do)

그러나 확장 가능한 매크로를 원할 경우 이 매크로를 고정해야 합니다(→ doo, 와 동일 \foreach \x in {0,...,3}{\xdef\tmp{\tmp(b\x)}}). 또는 하나 이상의 키(→ dooo, 더 유연함)가 필요합니다.

암호

\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}

관련 정보