![목록 변수 정의](https://rvso.com/image/309876/%EB%AA%A9%EB%A1%9D%20%EB%B3%80%EC%88%98%20%EC%A0%95%EC%9D%98.png)
etoolbox
목록 처리, 특히 \forcsvlist
.
쉼표로 구분된 목록을 에 직접 전달하면 \forcsvlist
목록의 각 항목을 구문 분석할 수 있습니다. 그러나 목록 변수를 다른 곳에서 정의하면 에서는 \forcsvlist
목록의 각 항목을 구별할 수 없으며 이를 하나의 전체 인수로 간주합니다.
예:
\newcommand\doforme[1]{#1 \\}
\forcsvlist\doforme{a,b,c}
위의 코드는 각 항목 끝에 개행 문자를 추가하여 완벽하게 작동합니다. 하지만 다음 코드는 작동하지 않습니다
\newcommand\doforme[1]{#1 \\}
\def\@authors{a,b,c}
\forcsvlist\doforme{\@authors}
이로 인해 해석할 수 있는 목록을 정의하는 다른 방법이 있어야 한다고 생각하게 됩니다 \forcsvlist
.
답변1
가변 형식을 사용할 때의 문제점은 전체를 a,b,c
하나의 개체로 간주하는 초기 확장이었습니다. 하나의 엔터티란 목록의 유일한 단일 요소를 의미합니다.
이 문제를 해결하려면 먼저 여기서 이중 괄호를 사용해야 합니다. 그래서 이 답변이 끝날 때 그 이유가 분명해질 것 {a,b,c}
입니다 .{{a,b,c}}
\expandafter
프리미티브는 다음 인수 이후에 주어진 인수를 확장합니다. 예를 들어 \def\foo{A}, \def\bar{B}
and 가 있으면 \expandafter\foo\bar
먼저 이 되고 \foo B
나중에는 이 됩니다 AB
.
마찬가지로, 다음과 같은 질문에서 위의 문제를 해결할 수 있습니다.
noindent\expandafter\forcsvlist\expandafter\doforme\authors
위의 재귀 표현식을 살펴보면 첫 번째 ExpandAfter는 첫 번째 인수(\forcsvlist)로 이동하고 잠시 건너뛴 다음 옆에 있는 인수 확장을 시도합니다. 이 경우에는 다시 입니다 \expandafter
. 따라서 두 번째는 \expandafter
다시 \doforme
잠시 건너뛴 다음 \authors.
\authors
현재 확장됩니다 {{a,b,c}}
. 확장 후에는 {a,b,c}
. 이제 최종 표현은 다음과 같습니다.
\noident\forcsvlist\doforme{a,b,c}
이는 질문의 첫 번째 사례와 같이 인수를 전달하는 것과 동일하므로 동일한 결과를 생성합니다.
답변2
패키지는 etoolbox
내부 목록을 처리하는 특수 명령을 정의합니다: \forlistloop
. 이러한 목록은 내부 목록 구분 기호로 특수 문자를 사용합니다. 따라서 \listadd
(또는 유사한 명령을 사용해야 합니다 .etoolbox
선적 서류 비치) 해당 목록에 항목을 추가합니다.
\documentclass{article}
\usepackage{etoolbox}
\begin{document}
\newcommand\doforme[1]{#1 \\}
\forcsvlist{\listadd\authors}{a,b,c}
\noindent\forlistloop\doforme{\authors}
\end{document}