tabbing
환경과 루프를 사용하여 들여쓰기된 줄을 자동으로 생성하려고 합니다 @for
. 어떤 이유로 인해 for 루프는 내용이 아닌 반복 변수의 이름을 반복해서 인쇄하게 됩니다. 내가 도대체 뭘 잘못하고있는 겁니까?
MWE:
\documentclass{article}
\begin{document}
\begin{tabbing}
a \= b\\
\> c\\
\makeatletter
\@for\ij:=abc,def\do{\>\ij{}\\}
\makeatother
\end{tabbing}
\end{document}
답변1
\>
테이블 셀은 그룹을 생성하므로 TeX가 다른 셀로 이동할 때(여기서는 을 사용하여 다음 열이나 \\
다음 행으로 이동 하는 경우) 모든 비전역 할당이 손실됩니다 . \@for
루프 변수에 대한 로컬 할당을 수행하므로 테이블 셀이 끝나면 자연스럽게 손실됩니다. \ij
표준 정의가 네덜란드 이중 문자 "ij"를 인쇄하는 를 선택했기 때문에 루프 변수의 "이름"이 인쇄되는 것을 볼 수 있습니다 . 사용했거나 정의되지 않은 항목을 사용했다면 \ii
오류가 발생합니다.
루프 변수가 .다음에 가장 먼저 나오는 경우 \>
테이블 셀이 .로 끝나기 전에 루프 변수를 속이고 확장할 수 있습니다 \expandafter
. 루프 변수 앞에 아무것도 없으면 (적응 없이는) 작동하지 않습니다.
\@for\ii:=abc,def\do{\expandafter\>\ii{}\\}
테이블 셀을 끝내기 전에 전역 변수에 할당할 수도 있으며, 그러면 전역 변수가 어디에나 표시되도록 할 수 있습니다.
\@for\ii:=abc,def\do{\global\let\jj=\ii \> something \jj{}\\}
하지만 루핑 변수를 사용하지 않는 루핑 함수를 사용하는 것이 좋습니다. 예를 들어 expl3's
\clist_map_inline:nn
(여기에서는 로 이름이 변경됨 \ListLoop
):
\documentclass{article}
\ExplSyntaxOn
\cs_new_eq:NN \ListLoop \clist_map_inline:nn
\ExplSyntaxOff
\begin{document}
\begin{tabbing}
a \= b\\
\> c\\
\ListLoop{abc,def}{\>#1\\}
\end{tabbing}
\end{document}
첫 번째 인수는 반복할 목록이고, 두 번째 인수는 각 반복에서 실행할 코드입니다. 여기에는 #1
현재 항목(또는 정의 내에서 ##1
사용 중인 항목 )이 포함됩니다.\ListLoop