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

你已经使用字符串在字符串中四处寻找,因此您也可以这样做:

代码

\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

在此处输入图片描述

相关内容