我正在尝试测试已定义列表(数组)中的元素是否为“空”。我尝试使用\empty
宏,或在引号内放置空格,但似乎都不起作用。我正在使用构造etoolbox
\ifboolexpr
with测试每个元素是否为空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}