如何偵測 tikz \foreach 語句中的「空」元素

如何偵測 tikz \foreach 語句中的「空」元素

我想定義一個巨集,將其內容輸入到 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

像這樣的東西嗎?

\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不擴展其參數並返回兩個標記\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

相關內容