我想使用\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
并比较它找到的两个不可扩展标记;在第一个循环中\nm
是na1
,所以发生的事情是
\if na1{dots}\else node[dot](\nm){}\fi
并且,由于n
和a
不同,因此遵循“else”分支。当\nm
是dots
:d
和o
不同时,也会发生相同的情况。
您需要的是不同的测试:
\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}