自动将倾斜节点放置在路径外侧

自动将倾斜节点放置在路径外侧

当我和这个答案,我在一起使用选项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}

那么节点就在“正确”的一侧,但是(正如预期的那样)却是颠倒的。

在此处输入图片描述

因为我不想手动放置abovebelow,有没有办法将节点放在上面和外面?或者有没有比更好的选择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}

问题是 TiZ 不知道如何处理绝对垂直的线。所以你可能需要稍微旋转它

    \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选择eastwest,最终结果是节点覆盖线。我们这里想要的是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]{!};

相关内容