So erkennen Sie „leere“ Elemente in einer Tikz \foreach-Anweisung

So erkennen Sie „leere“ Elemente in einer Tikz \foreach-Anweisung

Ich möchte ein Makro definieren, das seinen Inhalt in eine Tikz- \foreachAnweisung einspeist, zum Beispiel:

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

das dann als verwendet wird \Macro{1,2,3,4}. Manchmal möchte ich ihm „leere“ Argumente geben, wie z. B. \Macro{,,,4,5,5}. Ich möchte in der Lage sein, die „leeren“ Argumente zu erkennen und in solchen Fällen etwas anderes zu tun. Ich dachte, dass so etwas wie das Folgende funktionieren würde:

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

aber aus irgendeinem Grund erkennt dies die leeren Argumente nicht und erzeugt stattdessen:

Bildbeschreibung hier eingeben

Ich habe viele andere Dinge probiert, wie zum Beispiel \xzuerst das Erweitern, aber ich habe noch nichts gefunden, das funktioniert.

Sieht irgendjemand eine Möglichkeit, dies zu tun?

[Mein echter Code generiert eine tikzpictureUmgebung, die ich unbedingt von `tikz verwenden möchte \foreach.]

Antwort1

Etwas wie das?

\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}

Bildbeschreibung hier eingeben

Antwort2

Das Problem im Makro aus der Frage:

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

bedeutet, dass \detokenizesein Argument nicht erweitert wird und die beiden Token \und zurückgibt x. Dies wird behoben, indem ein hinzugefügt wird \expandafter:

\detokenize\expandafter{\x}

Das vollständige Makro:

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

Antwort3

Die obligatorische expl3Antwort (nachdem festgestellt wurde, dass dies \detokenize\expandafter{\x}die Lösung wäre):

\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}

Bildbeschreibung hier eingeben

Das aktuelle Element im Zyklus wird durch gekennzeichnet (was in der Definition von #1zu werden muss ).##1\Macro

verwandte Informationen