测试数组中空白元素的正确方法

测试数组中空白元素的正确方法

我正在尝试测试已定义列表(数组)中的元素是否为“空”。我尝试使用\empty宏,或在引号内放置空格,但似乎都不起作用。我正在使用构造etoolbox \ifboolexprwith测试每个元素是否为空test(我也测试了\notblank相同的结果),但我不确定错误是出在条件评估中还是出在\pgfmathparse从数组中检索元素的构造中。

因此,检查元素是否为空并分支到else条件部分的正确方法是什么。

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{etoolbox}

\pagestyle{empty}

\begin{document}
\begin{tikzpicture}
\def\n{5}
\def\weights{{"1","2","3","4","","n"}}
\foreach \i [count=\c] in {0,...,\n}{
  \pgfmathparse{\weights[\i]} \let\label\pgfmathresult
  \ifboolexpr{ not test{\ifstrempty{\label}} }{%
    \node at (0,\c) {$l_{\label}$};
  }{ %
    \node at (0,\c) {empty};
  }
}
\end{tikzpicture}
\end{document}

答案1

下面我定义了一个宏\GetNthMember来获取nth列表的成员。如果节点不存在或者是"",则显示为红色:

在此处输入图片描述

笔记:

  • 当您将列表成员定义为时,它们不为空""。它们具有两个双引号的值。
  • 如果消除列表成员周围的双引号,则可以测试空成员的一种方法是:

    \IfEq{<string to test>}{}{<true code>}{<false code>}
    

    或者如果您仍然喜欢使用双引号,您可以进行比较:

    \IfEq{<string to test>}{""}{<true code>}{<false code>}
    

    我确信还有其他方法可以测试空字符串,但我发现包裹xstring对我来说效果很好。

  • 下面的代码将列表的第一个元素视为数字 1。如果您希望从零开始,则需要调整代码。

代码:

\documentclass{article}
\usepackage{xstring}
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{etoolbox}


\newcommand*{\GetNthMember}[3]{%
    % #1 = macro to assign value to
    % #2 = list
    % #3 = n
    \edef\List{#2}%
    \edef#1{}%
    \foreach [count=\c] \Member in \List {%
        \IfEq{\c}{#3}{%
            \xdef#1{\Member}%
            \breakforeach%
            %\typeout{****Found Member #3 = #1}%
        }{}%
    }%
}%

\newcommand*{\NodeColor}{}%

\begin{document}
\begin{tikzpicture}[ultra thick]
\def\n{5}
\def\weights{"1","2","3","4","","n"}
\foreach \i  in {0,...,\n}{
    \GetNthMember{\MyLabel}{\weights}{\i}%
    \def\NodeColor{blue}%
    \IfStrEq{\MyLabel}{}{\def\NodeColor{red}}{}%
    \IfStrEq{\MyLabel}{""}{\def\NodeColor{red}}{}%
    \node [shape=rectangle, draw=\NodeColor] at (\i,0) {\strut\MyLabel};
}
\end{tikzpicture}
\end{document}

答案2

我认为这是一个更简单的解决方案:

\documentclass{article}

\usepackage{tikz}
\usepackage{xifthen}

\pagestyle{empty}
\begin{document}
    \begin{tikzpicture}
    \def\wt{1,2,3,4,,6}
    \newcounter{cnt}
    \foreach \x in \wt{
        \addtocounter{cnt}{1}
        \node at (0,\thecnt) {\ifthenelse{\equal{\x}{}}{empty}{\x}};
    }
    \end{tikzpicture}
\end{document}

输出

答案3

(为了完整性,使用彼得的回答pgfmathparse数组检索方法。

这个xstring包在我的情况下是有效的。使用pgf检索元素的方式(虽然不知道这是否是最佳或正确的方式),这是实现该技巧的代码:

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{etoolbox}
\usepackage{xstring}

\pagestyle{empty}

\begin{document}
\begin{tikzpicture}
\def\n{5}
\def\weights{{"1","2","3","4","","n"}}

\foreach \i [count=\c] in {0,...,\n}{
  \pgfmathparse{\weights[\i]} \let\lbl\pgfmathresult
  \IfStrEq{\lbl}{}{%
    \node at (0,\c) {empty};%
  }{%
    \node at (0,\c) {$l_{\lbl}$};%
  }%
}

\end{tikzpicture}
\end{document}

相关内容