TikZ:如何偶尔抑制加入选项?

TikZ:如何偶尔抑制加入选项?

我正在绘制一些图表,其中大多数节点都相互连接,但偶尔我想要休息一下。

以下是我的做法想法我可以做到(抱歉,它太大了):

\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 defaultOP 在评论中提到的一种可能的解决方案。解决方案背后的逻辑是使用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

相关内容