当我和这个答案,我在一起使用选项sloped
和时遇到了一些意外行为below
。此代码
\documentclass[tikz, border=2mm]{standalone}
\begin{document}
\begin{tikzpicture}
\foreach \C in {1,...,5}
{ \draw[-latex] (\C*72-72:5) -- (\C*72:5) node[sloped, below, pos=0.66] {XYZ};
}
\end{tikzpicture}
\end{document}
生成一个五角星,其所有边上都有节点,其中的文本会自动旋转,永远不会颠倒:
然而,带有红框的两个节点不仅旋转以易于阅读,而且现在也位于路径的“错误”一侧。如果我另外使用allow upside down
这样的选项
\documentclass[tikz, border=2mm]{standalone}
\begin{document}
\begin{tikzpicture}
\foreach \C in {1,...,5}
{ \draw[-latex] (\C*72-72:5) -- (\C*72:5) node[sloped, below, pos=0.66, allow upside down] {XYZ};
}
\end{tikzpicture}
\end{document}
那么节点就在“正确”的一侧,但是(正如预期的那样)却是颠倒的。
因为我不想手动放置above
或below
,有没有办法将节点放在上面和外面?或者有没有比更好的选择below
,比如某种指定“沿路径查看时将节点放在右侧”的键?
答案1
allow upside down
在基本层转换中使用的键集,\ifpgfallowupsidedownattime
因此如果没有相当大的黑客攻击就很难影响这种行为。
因此,最好根据线的角度手动有条件地设置节点锚点,在这种情况下这很容易获得:
\documentclass[tikz,border=5]{standalone}
\begin{document}
\begin{tikzpicture}
\foreach \C in {1,...,5}
\draw[-latex] (\C*72-72:5) -- (\C*72:5)
node[sloped, pos=0.66, anchor={\C*72 > 180 ? 90 : 270}] {XYZ};
\end{tikzpicture}
\end{document}
答案2
(抱歉,我忽略了你的第二个代码)
除了sloped
系统之外,您还可以使用auto
可选的swap
\documentclass[tikz,border=2mm]{standalone}
\begin{document}
\tikz{
\foreach \C in {1,...,5}
\draw[-latex](\C*72-72:5)--(\C*72:5)node[sloped,auto,swap,pos=.66]{XYZ};
}
\end{document}
问题是 Ti钾Z 不知道如何处理绝对垂直的线。所以你可能需要稍微旋转它
\draw[rotate=3,-latex](\C*72-72:5)--(\C*72:5)node[rotate=3,sloped,auto,swap,pos=.66]{XYZ};
现在它是\C
独立的。
如果发现旋转令人烦恼,这里有一个解决方案:
基本上,auto
只不过是一个锚点选择过程。如果输入角度约为 的倍数,它会选择边缘处的锚点90
。如果输入角度远非 的倍数,它会选择角落处的锚点90
。
auto
因此,混合和的问题sloped
是,对于垂直线,auto
选择east
或west
,最终结果是节点覆盖线。我们这里想要的是auto
选择south
或的愚蠢者north
。
\makeatletter
\def\tikz@install@auto@anchor@leftsloped{\let\tikz@do@auto@anchor=\tikz@auto@anchor@on\def\tikz@auto@anchor@direction{leftsloped}}
\def\tikz@install@auto@anchor@rightsloped{\let\tikz@do@auto@anchor=\tikz@auto@anchor@on\def\tikz@auto@anchor@direction{rightsloped}}
\def\tikz@auto@anchor@leftsloped{\tikz@auto@pre\tikz@auto@anchor@sloped\tikz@auto@post}
\def\tikz@auto@anchor@rightsloped{\tikz@auto@pre\tikz@auto@anchor@prime@sloped\tikz@auto@post}
\def\tikz@auto@anchor@sloped{
\ifdim\pgf@x<0pt
\def\tikz@anchor{north}
\else
\def\tikz@anchor{south}
\fi
}
\def\tikz@auto@anchor@prime@sloped{
\ifdim\pgf@x<0pt
\def\tikz@anchor{south}
\else
\def\tikz@anchor{north}
\fi
}
\tikzset{
auto sloped/.style={auto=leftsloped,sloped},
auto sloped'/.style={auto=rightsloped,sloped},
}
\tikz
\foreach \C in {1,...,5}
\draw[-latex](\C*72-72:5)--(\C*72:5)node[auto sloped,pos=.66]{XYZ};
\tikz
\foreach \C in {1,...,5}
\draw[-latex](\C*72-72:5)--(\C*72:5)node[auto sloped,pos=.66]{XYZ};
\tikz
\foreach \C in {1,...,10}
\draw[-latex](\C*36-18:5)--(\C*36+18:5)node[auto sloped,pos=.66]{XYZ};
\tikz
\foreach \C in {1,...,10}
\draw[-latex](\C*36-18:5)--(\C*36+18:5)node[auto sloped',pos=.66]{XYZ};
它适用于任意曲线
\tikz\draw(0,0)..controls+(right:3.5cm)and+(right:3.5cm)..(0,3)node foreach\p in{0,0.01,...,1}[pos=\p,auto sloped',red]{X};
\tikz\draw(0,0)..controls+(5,-3)and(-2,6)..(3,3)node foreach\p in{0,0.01,...,1}[pos=\p,auto sloped',red]{!};