在 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也会发生相同的情况:
(可以通过使用包进行测试french
)babel
。
现在,真正的every node
样式是,every Node
它已手动包含在和中。 此外,我还删除了和的首字母,现在需要明确给出。every node
every label
every pin
.style
draw=none, fill=none
every label
every 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}