我想创建一个依赖于其他样式值的样式,例如“如果当前松散度大于 2,则不要更改它,否则将其设置为 2”。我还想知道是否有办法知道给定的样式(如A
这里)是否以前应用过。
例如,这里我想让最后一根电线弯曲得更厉害一些:
梅威瑟:
\documentclass{article}
\usepackage{tikz}
\begin{document}
Last wire should be more bended:
\begin{tikzpicture}[
A/.style={in=0,out=0,looseness=1.2},
B/.style={in=0,out=0,looseness=3},
bn/.style={looseness=2} % Goal: min(current looseness, 2)
]
\draw[A] (0,0) to (0,1);
\draw[B] (1,0) to (1,1);
\draw[A,bn] (2,0) to (2,1);
\draw[B,bn] (3,0) to (3,1);
\end{tikzpicture}
\end{document}
编辑
我设法解决了第二个问题,但没有解决第一个问题。
因此,按照 SebGlav 的想法,我设法使用\pgfkeyssetvalue
(在 a 中创建新变量.code
)、\pgfkeysalso
(在 a 中应用样式.code
)和\pgfkeysifdefined
检查键是否存在来检查样式是否稍后应用。可以读取键的值,我猜
\documentclass{article}
\usepackage{tikz}
\begin{document}
Last wire should be more bended:
\begin{tikzpicture}[
A/.style={in=0,out=0,looseness=1.2},
B/.code={%
% Create a dummy key to check later
\pgfkeyssetvalue{BIsUsed}{abc}%
\tikzset{% Set the style of B
in=0,out=0,looseness=4
}
},
bn/.code={
\pgfkeysifdefined{BIsUsed}{%
\tikzset{% Style to apply if B was enabled before:
%fill=red,
}%
}{% Style to apply if B was NOT enabled before
\tikzset{%
looseness=2,
%fill=blue,
}
}%
}
]
\draw[A] (0,0) to (0,1);
\draw[B] (1,0) to (1,1);
\draw[A,bn] (2,0) to (2,1);
\draw[B,bn] (3,0) to (3,1);
\end{tikzpicture}
\end{document}
对于第一个问题,我尝试过,但它告诉我这\pgfk@looseness
是一个未定义的控制序列。
\documentclass{article}
\usepackage{tikz}
\usepackage{ifthen}
\begin{document}
Last wire should be more bended:
\begin{tikzpicture}[
A/.style={in=0,out=0,looseness=1.2},
B/.code={%
in=0,out=0,looseness=4
},
bn/.code={
\ifthenelse{\pgfkeysvalueof{looseness} < 2}{}{%
\pgfkeysalso{% Style to apply if B was enabled before:
looseness=2
}%
}{}
}
]
\draw[A] (0,0) to (0,1);
\draw[B] (1,0) to (1,1);
\draw[A,bn] (2,0) to (2,1);
\draw[B,bn] (3,0) to (3,1);
\end{tikzpicture}
\end{document}
答案1
问题是 不是looseness
值键。(如果是,则需要使用\pgfkeysvalueof{/tikz/looseness}
)。
该looseness
键或多或少只是和的快捷方式in looseness
,out looseness
而且这些也不是普通的值键。
它们调用一个宏来评估给定的值并将其存储在宏中,同时还激活进一步的计算。只要给他们就可以激活整个弯曲的说辞:
\tikz\draw (0,0) to[looseness=1] (2,2);
这已经用默认值绘制了一条弯曲的线out = 45
,而且in = 135
- 您猜对了 - 它也不是纯值键。
存储值的宏是\tikz@to@set@out@looseness
您\tikz@to@set@in@looseness
可以检查和/或甚至设置为全局的宏,但即使没有bn
设置样式,它们也会为所有后续路径设置。
但是,我们可以将代码附加到looseness
密钥上:
looseness/.append code={\gdef\tikzLooseness{#1}},
并以此方式访问先前设置looseness
,因为bn
我们只需执行
bn/.code={%
\pgfmathifthenelse{\tikzLooseness<2}{2}{\tikzLooseness}%
\tikzset{looseness=\pgfmathresult}%
}
(不需要该ifthen
包,我们有内置的 PGFmath。)
注意事项:
looseness
当之后给出时,您可以再次覆盖bn
。out looseness
且in looseness
尚未打补丁。- ization
\global
并不好,但是我找不到一个很好的钩子来在之后立即设置一个宏\path <…>;
。
代码
\documentclass[tikz]{standalone}
\def\tikzLooseness{1}% TikZ default
\tikzset{
bn/.code={%
\pgfmathifthenelse{\tikzLooseness<2}{2}{\tikzLooseness}%
\tikzset{looseness=\pgfmathresult}%
},
looseness/.append code={\gdef\tikzLooseness{#1}},
}
\makeatother
\begin{document}
\begin{tikzpicture}[
A/.style={in=0, out=0, looseness=1.2},
B/.style={in=0, out=0, looseness=4},
n/.style={insert path={node[below, font=\tiny, node contents={#1}]}}
]
\draw[help lines] (0,0) grid[step=.5] (2.5,1);
\draw[A, dashed] (0,0) [n=A] to +(90:1);
\draw[B, dashed] (1,0) [n=B] to +(90:1) [thick];
\draw[A, bn] (0,0) to +(90:1);
\draw[B, bn] (1,0) to +(90:1);
\end{tikzpicture}
\end{document}