\@for는 \StrSubstitute로 구성되지 않습니다.

\@for는 \StrSubstitute로 구성되지 않습니다.

공백으로 구분된 문자열을 여러 부분으로 나누고 각 부분에 대한 코드를 생성하고 싶습니다. 분명히 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

공백으로 구분된 목록을 반복해야 하는 경우 공백을 쉼표로 바꾸고 쉼표로 구분된 목록을 반복할 필요가 없습니다. 해당 대체를 이미 구현하려면 공간을 반복하는 기능이 필요할 수 있습니다.

예를 들어 이것은 공백으로 구분된 단어를 각각 fbox에 넣어 반복합니다.

여기에 이미지 설명을 입력하세요

\documentclass{article}

\def\zz#1{\zzz#1 \! }

\def\zzz#1 {\ifx\!#1\else\fbox{#1} \expandafter\zzz\fi}
\begin{document}

\zz{foo bar baz}

\end{document}

답변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}

여기에 이미지 설명을 입력하세요

관련 정보