TikZ: 인수가 목록인 매크로의 \foreach

TikZ: 인수가 목록인 매크로의 \foreach

아래 코드는 다음을 생성합니다.

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

내가 기대하는 것은:

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

\foreach가 전체 목록을 하나의 값으로 처리하는 것처럼 보이는 이유는 무엇입니까? 어떻게 해결하나요?

\documentclass{article}
\usepackage{xparse}
\usepackage{xstring}
\usepackage{etoolbox}
\usepackage{expl3}
\usepackage{tikz}

\begin{document}

\ExplSyntaxOn

\DeclareDocumentCommand{\separate}{m}
{
  \StrLeft{#1}{1}[\head]
  \StrBehind[1]{#1}{\head}[\tail]
  \IfInteger{\tail}{\head,\separate{\tail}}{\head}
}

\DeclareDocumentCommand{\map}{m}
{
  \def\list{#1}
  \foreach \i in \list
  {
    [\i]
  }
}

\ExplSyntaxOff

\def\arg{3669887}

\arg

\separate{\arg}

\map{\separate{\arg}}

\end{document}

답변1

당신은 이미 사용하고 있습니다xstring문자열을 둘러보려면 다음과 같이 할 수도 있습니다.

암호

\documentclass{article}
\usepackage{xstring}
\usepackage{tikz}

\begin{document}

\def\arg{3669887}

\StrLen{\arg}[\strlen]

\foreach \x in {1,...,\strlen}
{[\StrChar{\arg}{\x}]%
}

\end{document}

산출

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

답변2

귀하의 코드를 사용하면 본질적으로 다음과 같은 작업을 수행합니다.

\foreach \i in {\separate{\arg}}{[\i]}

따라서 한 사이클만 수행하면 됩니다.

먼저 문자열을 분리한 다음 를 호출해야 하지만 \foreach해당 작업을 수행할 수 없습니다.


내가 할 방법은 다음과 같습니다.

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentCommand{\separate}{sm}
 {
  \IfBooleanTF #1
   {
    \linus_separate:o { #2 }
   }
   {
    \linus_separate:n { #2 }
   }
 }

\NewDocumentCommand{\map}{sm}
 {
  \IfBooleanTF #1
   {
    \linus_map:o { #2 }
   }
   {
    \linus_map:n { #2 }
   }
 }

\cs_new_protected:Npn \linus_separate:n #1
 {
  % split the input into parts "at nothing"
  \seq_set_split:Nnn \l_linus_list_seq { } { #1 }
  % deliver the input separated by commas
  \seq_use:Nnnn \l_linus_list_seq { ,~ } { ,~ } { ,~ }
 }
% a variant for a macro input
\cs_generate_variant:Nn \linus_separate:n { o }
\cs_new_protected:Npn \linus_map:n #1
 {
  % split the input into parts "at nothing"
  \seq_set_split:Nnn \l_linus_list_seq { } { #1 }
  % deliver the input by enclosing the parts in brackets
  \seq_map_inline:Nn \l_linus_list_seq { [##1] }
 }
% a variant for a macro input
\cs_generate_variant:Nn \linus_map:n { o }

\ExplSyntaxOff

\begin{document}
\def\arg{3669887}

\arg

\separate*{\arg}

\map*{\arg}

\separate{1234}

\map{1234}

\end{document}

\separate그러나 아마도 이 기능이 더 이상 필요하지 않을 것입니다 . 입력이 "명시적"일 \arg때와 같이 "기호적"일 때 매크로를 구별하도록 유지하겠습니다. 따라서 두 호출 \map*\map.

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

관련 정보