TikZ:\foreach 内的条件节点

TikZ:\foreach 内的条件节点

我想使用\foreach构造来生成几对节点,但其中一对节点我想做一些不同的事情。这是我尝试过的:

\begin{tikzpicture}[dot/.style={fill,circle,inner sep=1.5pt}]
    \foreach \x/\nm/\lbl in {0/na1/$\lnot a_1$, 1/na2/$\lnot a_2$, 2/na3/$\lnot a_3$, 3/dots/$\cdots$, 4/nan/$\lnot a_n$}
    \draw (\x,0) \if\nm{dots}\else node[dot](\nm){}\fi node[left=2pt]{\lbl};
\end{tikzpicture}

编译正常,但“dots”节点旁边仍有一个点。我该怎么做?

(此外,有没有更好的方法来命名圆形节点?使用circle(name)似乎不起作用,所以我只是使用node[circle](name)。)

答案1

当你这样做

\if\nm{dots}\else node[dot](\nm){}\fi

所发生的情况是,TeX 会扩展\nm并比较它找到的两个不可扩展标记;在第一个循环中\nmna1,所以发生的事情是

\if na1{dots}\else node[dot](\nm){}\fi

并且,由于na不同,因此遵循“else”分支。当\nmdotsdo不同时,也会发生相同的情况。

您需要的是不同的测试:

\begin{tikzpicture}[dot/.style={fill,circle,inner sep=1.5pt}]
  \def\test{dots}
  \foreach \x/\nm/\lbl in {0/na1/$\lnot a_1$, 1/na2/$\lnot a_2$, 2/na3/$\lnot a_3$, 3/dots/$\cdots$, 4/nan/$\lnot a_n$}
  \draw (\x,0) \ifx\nm\test\else node[dot](\nm){}\fi node[left=2pt]{\lbl};
\end{tikzpicture}

因此 TeX 会将 的含义\nm与 的含义进行比较\test

另一个可以工作且不需要定义的测试\test

\ifnum\pdfstrcmp{\nm}{dots}=0 \else node[dot](\nm){}\fi

它有一个限制:你需要 pdflatex 才能工作。如果你计划将代码与 XeLaTeX 或 LuaLaTeX 一起使用,请在序言中说明

\usepackage{pdftexcmds}
\makeatletter
\let\unistrcmp\pdf@strcmp
\makeatother

并使用\unistrcmp代替\pdfstrcmp

原因是 XeTeX 以名称提供命令\strcmp,而 LuaTeX 根本没有提供。如果引擎是 pdfTeX,则包会\pdf@strcmp定义,如果引擎是 XeTeX,则包会定义,如果引擎是 LuaTeX,则包会定义 Lua 函数。但是名称中包含 -free 版本,因此我们提供了一个-free 版本。\pdfstrcmp\strcmp@@

答案2

您可以使用该xifthen包:

\documentclass[parskip]{scrartcl}
\usepackage[margin=15mm]{geometry}
\usepackage{tikz}
\usepackage{xifthen}

\begin{document}

\begin{tikzpicture}

\foreach \x in {1,...,10}
{ \node[circle,draw] (\x 1) at (0,\x) {\x};
    \node[circle,draw] (\x 2)at (2,\x) {\x};
    \ifthenelse{\NOT 4 = \x \AND \NOT 7 = \x}{\draw (\x 1) -- (\x 2);}{}
}

\end{tikzpicture}

\end{document}

这个例子意味着如果 x 不是 4,也不是 7,则画一条线,输出:

在此处输入图片描述

答案3

functional包中,我们可以将 Tom Bombadil 的答案重写如下:

\documentclass[parskip]{scrartcl}
\usepackage[margin=15mm]{geometry}
\usepackage{tikz}
\usepackage{functional}
\begin{document}

\begin{tikzpicture}
\IntStepInline{1}{1}{10}{
  \node[circle,draw] (#1 1) at (0,#1) {#1};
  \node[circle,draw] (#1 2) at (2,#1) {#1};
  \BoolVarOrTF{\IntCompare{4}={#1}}{\IntCompare{7}={#1}}{}{
    \draw (#1 1) -- (#1 2);
  }
}
\end{tikzpicture}

\end{document}

相关内容