TikZ 中的每个非标签节点

TikZ 中的每个非标签节点

在 TikZ 中我们可以使用every node/.style=...和,every label/.style=...但是有没有办法说类似的东西every non label/.style=...,以便我可以定义非标签和标签节点的样式而不会相互干扰?

答案1

没有巧妙的、没有黑客式的解决方案,因为我认为这是个糟糕的问题。这是错误的使用every node

这种情况出现在 pgfmanual 的一些教程中。首先 Andrew 发表了这样的评论: 关键的 every label 在每个节点之后被调用并且需要用 pgfmanual 中的文本来完成:

/tikz/label=[⟨options⟩]⟨angle⟩:⟨text⟩ (no default)当将此选项赋予节点操作时,它会在当前节点完成后将另一个节点添加到路径中。这个额外的节点将包含文本 ⟨text⟩。

换句话说,标签是另一个节点,因此受到一些干扰是正常的。

你需要做什么?你可以使用棘手或不成熟的方法,也可以使用更自然的代码来避免这个问题。

every node我认为更好的方法是为特定节点定义样式

\documentclass[11pt]{scrartcl}
\usepackage{tikz}
\usetikzlibrary{shadows}
\begin{document} 

 \begin{tikzpicture} [every node/.style = {circle},
                      every special node/.style = {},
                      special node/.style={draw = blue!50,
                                           fill = blue!20,
                                           thick,
                                           every special node}]

\tikzset{every special node/.style={circular drop shadow=red!20}} 
\tikzset{every label/.style={red}}  % by default draw=none  except if every node uses "draw"

 \node[special node,label={0:A}] {B}; 
 \end{tikzpicture}
\end{document}  

在此处输入图片描述

答案2

有点棘手。密钥every node在每个节点上都尝试过。密钥every label称为因此every node可以撤消every node在 中执行的任何操作every label,但你必须准确记住设置的内容并知道如何撤消它。

这是实现此目的的一种方法。它利用标签始终从属于节点的事实,并且(据我所知),没有其他节点从属于它们(这对于矩阵或链来说可能有点奇怪 - 未经测试)。所以我们想要一个键,比如说every non label,它在父节点上执行,但不在任何子节点(标签)上执行。一种方法是让键every non label在执行时清除自身。这确保它不会向下传播。当我们在组(节点组)中执行此操作时,即使在同一路径上,此清除也只会影响子节点而不会影响兄弟节点(即其他适当节点)。

根据您具体执行的操作,可能需要小心处理与其他键的交互。例如,如果您将一个label键放在一个every node键中,则必须确保消隐键先出现。

\documentclass{article}
%\url{http://tex.stackexchange.com/q/49096/86}
\usepackage{tikz}
\usetikzlibrary{shadows}

\tikzset{
  clear label/.style={
    append after command={
      [every non label/.style={}]
    }
  },
  every node/.style={
    every non label,
    clear label
  },
  every non label/.style={
    circular drop shadow,
  }
}

\begin{document}
\begin{tikzpicture}
\node[label=hello] {world};
\node[label=hello] at (0,-2) {world};
\path (0,-4)  node[label=hello] {world} (1,-4) node[label=hello] {world};
\end{tikzpicture}
\end{document}

结果:

非标签节点样式

答案3

此特定示例的另一个 hackish 解决方案是通过清空密钥来删除阴影preaction。这是我从这个问题

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shadows,shapes.geometric}
\makeatletter
\tikzset{every node/.style ={draw,shape=ellipse,circular drop shadow,blue},
every label/.style={yellow,draw=none,fill=red,shape=trapezium,fill opacity=0.5},
every label/.add code={}{\let\tikz@preactions\pgfutil@empty}
} 
\makeatother
\begin{document}
\begin{tikzpicture} 
\node[label={0:Trapezium}] {Ellipse}; 
\end{tikzpicture} 
\end{document}

在此处输入图片描述

由于常规选项可以被覆盖,我猜,只有前置和后置操作才能保持持久,从这个简单的例子中可以看出,我们只是挤进了一个无辜的“你知道吗,忘掉我之前说的关于预防措施的事吧”行。看起来它确实能完成工作。您也可以为后续操作添加一行。不过,我可以想象可能会遗漏一些持久选项。

答案4

解决问题的方法略有不同(并且来自减少 TikZ 标签上方的空白every node),我将重新定义标签和图钉,以便通过将此样式设置为空,使它们实际上没有可用的样式:

\patchcmd\tikz@@parse@label@nonactive{\bgroup[}{\bgroup[every node/.style=,}{}{}
\patchcmd\tikz@@parse@pin@nonactive{\bgroup[}{\bgroup[every node/.style=,}{}{}

…@active对于active也会发生相同的情况:(可以通过使用包进行测试frenchbabel

现在,真正的every node样式是,every Node它已手动包含在和中。 此外,我还删除了和的首字母,现在需要明确给出。every nodeevery labelevery pin
.styledraw=none, fill=noneevery labelevery pin

如果这仍然存在于这些样式中,而不是.style使用.prefix style.append style(无论需要什么)。

风格every node and pin和 一样every non label

代码

\documentclass[tikz]{standalone}
%\usepackage[french]{babel}
\usepackage{etoolbox}
\makeatletter
  \c@pgf@counta=\catcode`\:
  \catcode`\:=\active\relax
  \patchcmd\tikz@@parse@label@active{\bgroup[}{\bgroup[every node/.style=,}{}{}
  \patchcmd\tikz@@parse@pin@active{\bgroup[}{\bgroup[every node/.style=,}{}{}
  \catcode`\:=\c@pgf@counta
\patchcmd\tikz@@parse@label@nonactive{\bgroup[}{\bgroup[every node/.style=,}{}{}
\patchcmd\tikz@@parse@pin@nonactive{\bgroup[}{\bgroup[every node/.style=,}{}{}
\makeatother
\tikzset{
  every node/.style ={every Node/.try, every node and label/.try, every node and pin/.try},
  every label/.style={every Node/.try, every node and label/.try, every label and pin/.try},
  every pin/.style  ={every Node/.try, every node and pin/.try,   every label and pin/.try},
  Nodes/.style      ={every Node/.append style={#1}}}
\begin{document}
\tikzset{Nodes=draw}
\tikz\node[label=bar, pin=below:pin] {foo};
\tikz[nodes=circle]\node[label=bar, pin=below:pin] {foo};
\tikz[Nodes=circle]\node[label=bar, pin=below:pin] {foo};
\end{document}

输出

在此处输入图片描述在此处输入图片描述在此处输入图片描述

相关内容