
我想定義一個巨集,將其內容輸入到 tikz\foreach
語句中,例如:
\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
先擴展,但我還沒有找到任何有效的方法。
任何人都可以看到方法嗎?
[我真正的程式碼正在產生一個tikzpicture
環境,所以我真的想使用\foreach
`tikz。
答案1
答案2
問題中的巨集問題:
\newcommand\Macro[1]{%
\foreach \x in {#1} {
\if\relax\detokenize{\x}\relax Empty!
\else x=\x.
\fi
}
}
是\detokenize
不擴展其參數並返回兩個標記\
和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