我想做的事:绘制一个用凸起装饰的节点,但装饰从节点的右侧开始(即与平常相反)。
我为什么要这么做:我将有一个节点隐藏凸起部分连接得很奇怪,但我希望能够选择建立此连接的位置。幸运的是,我只需要“节点左侧”和“节点右侧”。
我认为解决方案是:我想我可以使用shape border rotate
,这样只有边界将会旋转。定义:
\newcommand{\drawprost}[2][加油!]{ \节点[绘制, 装饰,装饰={凹凸,镜子}, #2, postaction={装饰,装饰={标记,标记=在位置 1 处 {\arrow[线宽=5pt,蓝色]{>}}}}] {#1};}
现在以下两个命令可以按预期工作:
\drawprost{形状=梯形,形状边框旋转=180} \drawprost{shape=trapezium,shape border rotate=0}
第二幅图中丑陋的蓝色箭头被旋转了 180 度。但是,如果没有shape=trapezium
或shape=ellipse
,这就会失败。
一个丑陋的解决方案: 我想到唯一的解决方案是(使用ellipse
,否则我甚至没有解决方案):
\drawprost[\phantom{恭喜!}]{rotate=180,shape=椭圆,label=center:恭喜!}
也就是说,phantom
标签,并重新绘制它。
问题:有没有更好的方法?如果能找到一种方法,将装饰的起点(旋转)移到任意给定点,那就更好了 :-)
完整代码
\documentclass{文章} \usepackage{tikz} \usetikzlibrary{装饰,装饰。路径变形,形状,装饰。标记} \开始{文档} \开始{tikzpicture} \newcommand{\drawprost}[2][加油!]{ \节点[绘制, 装饰,装饰={凹凸,镜子}, #2, postaction={装饰,装饰={标记,标记=在位置 1 处 {\arrow[线宽=5pt,蓝色]{>}}}}] {#1};} \newlength\yshift %只有使用梯形我才能获得预期的结果。 \foreach \shape in {,shape=梯形,shape=椭圆} \foreach \rotate in {0, 180} { \expandafter\drawprost\expandafter{% \shape,yshift=\yshift,形状边框旋转=\rotate}; \global\advance\yshift -2厘米 } %我想要的是: \drawprost[\phantom{恭喜!}]{yshift=\yshift,rotate=180,shape=ellipse,label=center:恭喜!} \结束{tikzpicture} \结束{文档}
答案1
困难的根源在于 TikZ 中的椭圆以特定方式构造。它们是从 x 轴开始并绕其中心逆时针行进的路径。绝大多数情况下,确切的参数化并不重要。你似乎找到了一种情况!
在实际问题中,您只希望能够镜像椭圆,因此从负 x 轴开始绘制它(问题标题表明了一种更灵活的方法)。这实际上并不太难,因为我们可以利用椭圆的对称性。关键是为其提供负 x 半径,因为这样它将从负 x 轴开始(并顺时针进行,但我们也可以通过取反 y 半径来纠正这一点)。为此,我们中断从节点形状到绘制命令的调用并翻转 x 半径的符号。最简单的方法是重新定义宏以执行取\pgfpathellipse
反,然后调用原始宏。以下代码执行此操作。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations,shapes,decorations.markings}
\makeatletter
\let\origpgfpathellipse=\pgfpathellipse
\def\revpgfpathellipse#1#2#3{%
#2%
\pgf@xa=-\pgf@x
\origpgfpathellipse{#1}{\pgfqpoint{\pgf@xa}{0pt}}{#3}}
\makeatother
\tikzset{
reversed ellipse/.style={
ellipse,
reverse the ellipse%
},
reverse the ellipse/.code={
\let\pgfpathellipse=\revpgfpathellipse
}
}
\begin{document}
\begin{tikzpicture}
\node[ellipse,
draw,
postaction={
decorate,
decoration={
markings,
mark=at position 1 with {
\arrow[line width=5pt,blue]{>}
}
}
}
] at (0,0) {hello world};
\node[reversed ellipse,
draw,
postaction={
decorate,
decoration={
markings,
mark=at position 1 with {
\arrow[line width=5pt,blue]{>}
}
}
}
] at (0,-2) {hello world};
\end{tikzpicture}
\end{document}
结果如下:
(箭头被剪掉了,但你可以看到它的位置)
答案2
您可以将标签移动为宏的一部分,然后\phantom
在宏内指定允许计算节点的宽度:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations,decorations.pathmorphing,shapes,decorations.markings}
\newcommand{\drawprost}[2][Prost!]{
\node [draw,
decorate,decoration={bumps,mirror},
#2, label=center:#1,
postaction={decorate,decoration={markings,mark=at position 1 with
{\arrow[line width=5pt,blue]{>}}}}]
{\phantom{#1}};}
\begin{document}
\begin{tikzpicture}
\drawprost[Prost!]{rotate=180,shape=ellipse}
\end{tikzpicture}
\end{document}