
\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
答え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