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