
以下のコードでは以下が生成されます。
私が期待しているのは、
\foreach がリスト全体を 1 つの値として扱うように見えるのはなぜですか? どうすれば修正できますか?
\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
すでに使用していますx文字列文字列を調べるには、次のようにすることもできます。
コード
\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]}
したがって、実行する必要があるサイクルは 1 つだけです。
まず文字列を分離してから を呼び出す必要がありますが\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
。つまり、 と の 2 つの呼び出し\map*
です\map
。