tikz \foreach ステートメント内の「空の」要素を検出する方法

tikz \foreach ステートメント内の「空の」要素を検出する方法

\foreachたとえば、その内容を tikz ステートメントに渡すマクロを定義したいと思います。

\newcommand\Macro[1]{ \foreach \x in {#1} {x=\x.} }

これは として使用されます\Macro{1,2,3,4}。 場合によっては、 などの「空の」引数を与えたいことがあります\Macro{,,,4,5,5}。 そのような場合には、「空の」引数を検出して、別の処理を実行できるようにしたいと思います。 次のようなものが機能すると考えました。

\newcommand\Macro[1]{%
  \foreach \x in {#1} {
    \if\relax\detokenize{\x}\relax Empty!
    \else x=\x.
    \fi 
  }
}

しかし、何らかの理由で、これは空の引数を検出せず、代わりに次の結果を生成します。

ここに画像の説明を入力してください

最初に拡張するなど、他の多くのことを試しましたが\x、まだうまくいくものは見つかっていません。

これを実行する方法を誰か知っていますか?

[実際のコードは環境を生成するので、 `tikz からtikzpicture使用したいのです。]\foreach

答え1

このようなもの?

\documentclass{article}
\usepackage{tikz}
\newcommand\Macro[1]{%
  \foreach \x in {#1} {
    \ifx\x\empty\relax Empty!
    \else x=\x.
    \fi 
  }
}
\begin{document}
\Macro{,,,4,5,5}
\end{document}

ここに画像の説明を入力してください

答え2

質問からのマクロの問題:

\newcommand\Macro[1]{%
  \foreach \x in {#1} {
    \if\relax\detokenize{\x}\relax Empty!
    \else x=\x.
    \fi 
  }
}

\detokenize引数を展開せず、\と の2 つのトークンを返しますx。 これは、 を追加することで解決されます\expandafter

\detokenize\expandafter{\x}

完全なマクロ:

\newcommand\Macro[1]{%
  \foreach \x in {#1} {
    \if\relax\detokenize\expandafter{\x}\relax Empty!
    \else x=\x.
    \fi 
  }
}

答え3

必須のexpl3回答(それが\detokenize\expandafter{\x}解決策となることを指摘した後):

\documentclass{article}
\usepackage{tikz}
\usepackage{xparse}

\ExplSyntaxOn
\NewExpandableDocumentCommand{\blankTF}{mmm}
 {% #1 = text to test, #2 = blank case, #3 = non blank case
  \str_if_eq_x:nnTF { #1 } { } { #2 } { #3 }
 }
\NewDocumentCommand{\lforeach}{O{,}mm}
 {% #1 = delimiter, #2 = list, #3 = code
  \seq_set_split:Nnn \l_andrew_foreach_seq { #1 } { #2 }
  \seq_map_inline:Nn \l_andrew_foreach_seq { #3 }
 }
\ExplSyntaxOff

\newcommand\Macro[1]{%
  \lforeach{#1}{%
    \blankTF{##1}{Empty!}{$|$##1$|$.}
  }
}

\begin{document}

\lforeach[-]{a-b--\texttt{c}}{%
    \blankTF{#1}{Empty!}{$|$#1$|$.}
  }

\lforeach{, ,,4, 5 ,5}{%
    \blankTF{#1}{Empty!}{$|$#1$|$.}
  }

\Macro{, ,,4, 5 ,5}

\end{document}

ここに画像の説明を入力してください

サイクル内の現在の項目は(の定義では に#1なる必要があります)で表されます。##1\Macro

関連情報