
Ich möchte ein Makro definieren, das seinen Inhalt in eine Tikz- \foreach
Anweisung 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:
Ich habe viele andere Dinge probiert, wie zum Beispiel \x
zuerst das Erweitern, aber ich habe noch nichts gefunden, das funktioniert.
Sieht irgendjemand eine Möglichkeit, dies zu tun?
[Mein echter Code generiert eine tikzpicture
Umgebung, die ich unbedingt von `tikz verwenden möchte \foreach
.]
Antwort1
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 \detokenize
sein 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 expl3
Antwort (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}
Das aktuelle Element im Zyklus wird durch gekennzeichnet (was in der Definition von #1
zu werden muss ).##1
\Macro