목록 변수 정의

목록 변수 정의

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}

관련 정보