Tikz:样式取决于以前的样式

Tikz:样式取决于以前的样式

我想创建一个依赖于其他样式值的样式,例如“如果当前松散度大于 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 loosenessout 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 loosenessin 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}

输出

在此处输入图片描述

相关内容