탭 환경의 내용 대신 @for 루프 변수 이름이 인쇄됩니다.

탭 환경의 내용 대신 @for 루프 변수 이름이 인쇄됩니다.

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

관련 정보