
공백으로 구분된 문자열을 여러 부분으로 나누고 각 부분에 대한 코드를 생성하고 싶습니다. 분명히 TeX는 기본적으로 쉼표로 구분된 문자열과 작동하므로 적응 항목을 작성해 보았습니다.
\usepackage{xstring}
\makeatletter
\@for\next:=foo,bar,baz\do{X \next Y} \\
\StrSubstitute{foo bar baz}{ }{,} \\
\@for\next:=\StrSubstitute{foo bar baz}{ }{,}\do{X \next Y}
\makeatother
쉼표로 구분된 문자열에 대한 출력의 첫 번째 줄이 정확합니다. 공백으로 구분된 문자열이 해당 쉼표로 구분된 문자열로 변환되는 것을 보여주는 출력의 두 번째 줄이 정확합니다.
그러나 세 번째 줄인 두 번째 줄에서는 \@for
문자열이 분할되지 않습니다.
왜 안 됩니까? 어떻게 해결해야 합니까?
답변1
\StrSubstitute
\StrSubstitute
여러 개의 선택적 인수가 있고 확장할 수 없으므로 출력을 사용 하고 TeX의 입력 스트림에 다시 공급할 수 없습니다 .
\StrSubstitute
결과를 임시 매크로에 저장 하고 이 매크로를 \@for\next
... 에 대한 입력으로 사용할 수 있습니다.
\documentclass{article}
\usepackage{xstring}
\begin{document}
\makeatletter
\@for\next:=foo,bar,baz\do{X \next Y} \\
\StrSubstitute{foo bar baz}{ }{,} \\
\StrSubstitute{foo bar baz}{ }{,}[\@stuff]
\@for\next:=\@stuff\do{X \next Y}
\makeatother
\end{document}
답변2
답변3
패키지 listofitems
는 지정된 다중 문자(여기서는 공백 과 쉼표 로 제공됨)를 기반으로 구문 분석할 수 있습니다
,
. 따라서 의 하나의 정의는 를 \setsepchar
사용하지 않고도 모든 사례를 해결합니다 xstring
. 매크로에 솔루션을 구현하도록 편집되었습니다 \processlist
.
\documentclass{scrartcl}
\usepackage{listofitems}
\setsepchar{ ||,}%
\newcommand\processlist[1]{%
\readlist\mylist{#1}%
\foreachitem\next\in\mylist{X \next Y}%
}
\begin{document}
\processlist{foo,bar,baz}
\processlist{foo bar baz}
\end{document}