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