我正在绘制一些图表,其中大多数节点都相互连接,但偶尔我想要休息一下。
以下是我的做法想法我可以做到(抱歉,它太大了):
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{chains}
\begin{document}
\begin{tikzpicture}[%
start chain=going below,
every node/.style={%
join,
on grid,
on chain,
draw,
align=center,
},
every join/.style={->,draw}
]
\tikzset{
none/.style={draw=none},
}
\node (a0) {A0};
\node {B0};
\node [join=by none,right=of a0] (a1) {A1};
\node {B1};
\end{tikzpicture}
\end{document}
从输出中可以看出,join=by none
对从 B0 到 A1 的不需要的连接没有影响:
有没有办法实现这一点,无论是作为特定选项(例如no join
)还是作为样式选项?我搜索了手册.pdf但什么也没找到。
答案1
不幸的是,该join
选项不只是设置一些可以更改的选项,它还使用附加命令append after command
。因此,设置join
两次会导致多次连接。这就是连接多个节点的方法(例如\node [join=with node 1, join=with node 2] {...}
)。所以你真正需要做的是删除所有append after command
命令。
现在你可能实际上不想这样做,因为这可能会造成附带损害。(谁知道你依赖的其他选项在append after command
内部也使用什么?)尽管如此,我相信直接回答人们的问题,即使我认为他们不应该使用该答案。所以,这里有一个最小的工作示例,它抑制了其中一个节点上的连接选项:
\documentclass[varwidth,convert]{standalone}
\usepackage{tikz}
\usetikzlibrary{chains}
\begin{document}
\makeatletter
\tikzset{reset after command/.code={\def\tikz@after@path{}}}
\makeatother
\begin{tikzpicture}[start chain=going below,
every node/.style={fill=blue!10, draw=blue!20, on chain, join=by ->},
node distance=1em,
]
\node {here};
\node {are};
\node[reset after command] {some};
\node {nodes};
\end{tikzpicture}
\end{document}
答案2
编辑:如果背景不是白色怎么办? egreg 提问
所以我模拟了一个有背景的场景来验证逻辑。
代码
\documentclass[border=0.3cm]{standalone}
\usepackage{tikz}
\usetikzlibrary{chains,backgrounds}
\begin{document}
\begin{tikzpicture}[%
start chain=going below,
every node/.style={%
join,
on grid,
on chain,
draw,
align=center,
},
every join/.style={->,draw}
]
\tikzset{
none/.style={->,cyan,line width=5pt}, % remove line width see the artifact
}
\node (a0) {A0};
\node {B0};
\begin{scope}[every join/.style={->, shorten <=5pt,shorten >=5pt}]
\node [join=by none,right=of a0] (a1) {A1};
\begin{pgfonlayer}{background}
\draw[fill=cyan] (-0.5,-1.5) rectangle (1.5,0.5);
\end{pgfonlayer}
\end{scope}
\node {B1};
\end{tikzpicture}
\end{document}
这是reverse the default
OP 在评论中提到的一种可能的解决方案。解决方案背后的逻辑是使用scope
环境通过绘制较短的连接线来反转默认值,然后绘制一条带有white
颜色的粗线来擦除短线。擦除操作由none
宏定义。
\begin{scope}[every join/.style={->, shorten <=5pt,shorten >=5pt}]
<node commands>
\end{scope}
none/.style={->,white,line width=5pt}, % remove line width see the artifact
代码
\documentclass[border=0.3cm]{standalone}
\usepackage{tikz}
\usetikzlibrary{chains}
\begin{document}
\begin{tikzpicture}[%
start chain=going below,
every node/.style={%
join,
on grid,
on chain,
draw,
align=center,
},
every join/.style={->,draw}
]
\tikzset{
none/.style={->,white,line width=5pt}, % remove line width see the artifact
}
\node (a0) {A0};
\node {B0};
\begin{scope}[every join/.style={->, shorten <=5pt,shorten >=5pt}]
\node [join=by none,right=of a0] (a1) {A1};
\end{scope}
\node {B1};
\end{tikzpicture}
\end{document}
答案3
一种方法是使用白色(或类似颜色):
\node [join= by {white,->},right=of a0] (a1) {A1};
等效地使用你的方法:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{chains}
\begin{document}
\begin{tikzpicture}[%
start chain=going below,
every node/.style={%
join,
on grid,
on chain,
draw,
align=center,
},
every join/.style={->,draw}
]
\tikzset{
none/.style={draw=white},
}
\node (a0) {A0};
\node {B0};
\node [join= by {none},right=of a0] (a1) {A1};
\node {B1};
\end{tikzpicture}
\end{document}
得出
唉,文物还在。
join
或者在单个节点上使用选项,例如
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{chains}
\begin{document}
\begin{tikzpicture}[%
start chain=going below,
every node/.style={%
%join,
on grid,
on chain,
draw,
align=center,
},
mynode/.style={%
join
},
every join/.style={->,draw}
]
\node[mynode] (a0) {A0};
\node[mynode] {B0};
\node [right=of a0] (a1) {A1}; %% no join here
\node[mynode] {B1};
\end{tikzpicture}
\end{document}
我们可以在除不需要连接的节点之外的每个节点中mynode
添加,而不是定义。join