如何覆盖`/tikz/rotate`的先前设置的值?

如何覆盖`/tikz/rotate`的先前设置的值?

我正在为特定的节点集合编写自己的样式,其中大多数节点我希望以相同的方式旋转。因此我定义了以下样式:

my node style/.style={rotate=60,draw}

请注意,为了 MWE,这个示例非常简单。

然后我按tikzpicture如下方式使用它:

\documentclass{article}
\usepackage{tikz}
\begin{document}

\begin{tikzpicture}[my node style/.style={rotate=60,draw}]
  \node (L) at (-1.5in,0) {using my node style};
  \node[my node style] (A) at (0,0) {this is node A};
  \draw[arrows=->] (L) -- (A);
\end{tikzpicture}

\end{document}

但是有几个节点我想要本质上相同的样式,但是旋转不同:

\documentclass{article}
\usepackage{tikz}
\begin{document}

\begin{tikzpicture}[my node style/.style={rotate=60,draw}]
  \node (L) at (-1.5in,0) {using my node style};
  \node[my node style] (A) at (0,0) {this is node A};
  \draw[arrows=->] (L) -- (A);

  \node (M) at (-1.5in,-1in) {not the expected effect};
  \node[my node style,rotate=-60,anchor=west,text width=2in] (B) at (0,-1in) {this is node B which I expected to be rotated $-60^\circ$};
  \draw[arrows=->] (M) -- (B);
\end{tikzpicture}

\end{document}

结果是

在此处输入图片描述

完全出乎我的意料。

这是多次调用的预期效果吗rotate
多次调用的效果应该rotate是累加的吗?如何覆盖它而不必编写一个全新的密钥?

答案1

该键的效果rotate是附加的,因此多次使用该rotate键会导致变换矩阵按给定值的总和进行旋转(尽管旋转不一定立即应用)。

以下概述了非加性旋转的可能机制:

\documentclass[tikz, border=5]{standalone}
\makeatletter
\let\tikz@rotate@angle=\pgfutil@empty
\tikzset{%
  Rotate/.code={%
    \ifx\tikz@rotate@angle\pgfutil@empty%
      \tikz@addtransform{\pgftransformrotate{\tikz@rotate@angle}}%
    \fi%
    \def\tikz@rotate@angle{#1}%
  }
}
\begin{document}
\begin{tikzpicture}[node style/.style={draw, Rotate=60}]
\draw [help lines] (-1,-1) grid (3,1); 
\node [node style]             at (0,0) {A};
\node [node style, Rotate=-60] at (1,0) {B};
\node [node style, Rotate=0]   at (2,0) {C};
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

这是预期结果。您为每个名为 的节点定义一个旋转my node style。因此我希望每个节点都默认旋转。如果所有这些节点中的一个节点必须比其他节点旋转得少或多,则它应该相对于其他节点,因为您首先将其定义为相似。这使得小旋转变得容易得多。特别是如果您在样式定义中进行了一些计算。

我检查了 的相同行为yshift=2cm。第一个凸起 2 厘米,第二个凸起 4 厘米。所以我敢说这是故意的。

为了证明我的假设,我只是将旋转键两次添加到一个节点,然后它们加起来。

% arara: pdflatex

\documentclass{article}
\usepackage{tikz}

\begin{document}    
    \begin{tikzpicture}
    \node[rotate=10,rotate=-10,draw] (A) at (0,0) {this is node A};
    \end{tikzpicture}
\end{document}

在此处输入图片描述


为了灵活,我只需定义一种新样式,例如fresh rotate。我想,有比我的更漂亮的方式定义 TikZ 值\newcommand*,但你明白我的意思:

% arara: pdflatex

\documentclass{article}
\usepackage{tikz}
\newcommand*{\defaultRot}{60}

\begin{document}    
    \begin{tikzpicture}[my node style/.style={rotate=\defaultRot,draw}
    ,fresh rotate/.style={rotate=-\defaultRot,rotate=#1}]
    \node[my node style] (A) at (0,0) {this is node A};
    \node[my node style, fresh rotate=-60] (B) at (3,0) {this is node B};
    \end{tikzpicture}
\end{document}

在此处输入图片描述

答案3

这里有另一种表示法。my node style有一个带有默认值的参数,可以轻松更改。

我不知道它是否rotate具有添加剂。

\documentclass{article}
\usepackage{tikz}
\begin{document}

\begin{tikzpicture}[my node style/.style={rotate=#1,draw}, my node style/.default=60]
  \node (L) at (-1.5in,0) {using my node style};
  \node[my node style] (A) at (0,0) {this is node A};
  \draw[arrows=->] (L) -- (A);

  \node (M) at (-1.5in,-1in) {not the expected effect};
  \node[my node style=-60,text width=2in] (B) at (0,-1in) {this is node B which I expected to be rotated $-60^\circ$};
  \draw[arrows=->] (M) -- (B);
\end{tikzpicture}

\end{document}

在此处输入图片描述

答案4

您可以通过设置来参数化您的样式[my node style/.style={rotate=#1,draw}],然后使用所需的参数调用该样式。(参见 pgf-manual 43.4.4)

\begin{tikzpicture}[my node style/.style={rotate=#1,draw}]
\node (L) at (-1.5in,0) {using my node style};
\node[my node style=60] (A) at (0,0) {this is node A};
\draw[arrows=->] (L) -- (A);

\node (M) at (-1.5in,-1in) {not the expected effect};
\node[my node style=-60,text width=2in] (B) at (0,-1in) {this is node B which I expected  to be rotated $-60^\circ$};
\draw[arrows=->] (M) -- (B);
\end{tikzpicture}

相关内容