强制在结点包 TikZ 中设置单个销钉角度

强制在结点包 TikZ 中设置单个销钉角度

我正在尝试使用 knots 包绘制一个结,但交叉标签是垂直向上的,这在大多数交叉处看起来都很糟糕。这是我的代码:

\begin{tikzpicture}
\begin{knot}[draft mode=crossings, clip width=10pt,consider self intersections,end tolerance=1pt]
\strand[ultra thick]
(0,0.3) to[out=180,in=90]
(-1.2,-1.5) to[out=-90,in=180]
(1,-3.5) to[out=0,in=0,looseness=2]
(0,-1) to[out=180,in=180,looseness=2]
(-1,-3.5) to[out=0,in=-90]
(1.2,-1.5) to[out=90,in=0] (0,0.3);
\end{knot}
\end{tikzpicture}

坏三叶草!

我怎样才能单独更改引脚?

提前致谢!

答案1

作者knots软件包并没有花太多心思考虑这些标签——它们最初只是为了帮助布置结点并确定要翻转哪些交叉点。我猜你想在最终文档中使用它们。

因此,最好的解决方案是修改现有库,以允许自定义每个标签的样式。例如修改定义,\knot_render:以便当前显示的部分:

\bool_if:NTF \l__knot_draft_bool
    {
      \tl_set:Nn \l__knot_node_tl {
        \exp_not:N \node[coordinate,
          pin={[knot~ diagram/draft/crossing~ label]
            {\int_use:N \l__knot_intersections_int}}]
      }
    }

被改为如下形式:

\bool_if:NTF \l__knot_draft_bool
    {
      \tl_set:Nn \l__knot_node_tl {
        \exp_not:N \node[coordinate,
          pin={[knot~ diagram/draft/crossing~ label, knot~ diagram/draft/crossing~ \int_use:N \l__knot_intersections_int \c_space_tl label/.try]
            {\int_use:N \l__knot_intersections_int}}]
      }
    }

然后您可以定义类似的样式draft/crossing 1 label,它们会在正确的标签上执行。

不修改原始包,另一种方法是尝试修补样式crossing~ label以执行依赖于交叉数的附加样式。这样做的困难在于,到crossing~ label执行时,计数器\l__knot_intersections_int不再可用。因此,我们必须插入一个新的计数器(这增加了额外的麻烦,因为事实证明标签的布局相反!真的,编写这个包的人做出了一些有趣的决定。)

无论如何,这里有一些可以运行的代码。使用时请自担风险!

\documentclass{article}
%\url{https://tex.stackexchange.com/q/440528/86}
\usepackage{tikz}
\usetikzlibrary{knots}

\ExplSyntaxOn

\int_new:N \l__knot_current_intersection_int

\tikzset{
  knot~ diagram/draft/crossing~ label/.append~ style={
    knot~ diagram/draft/do~ next~ label
  },
  knot~ diagram/draft/do~ next~ label/.code={
    \pgfkeysalso{knot~ diagram/draft/crossing~ \int_eval:n {\l__knot_intersections_int -  \l__knot_current_intersection_int}~ label/.try}
    \int_gincr:N \l__knot_current_intersection_int
  },
  knot~ diagram/reset~ label~ counter/.code={
    \int_gzero:N \l__knot_current_intersection_int
  }
}

\ExplSyntaxOff

\begin{document}

\begin{tikzpicture}
\begin{knot}[
  reset label counter,
  draft mode=crossings,
  clip width=10pt,
  consider self intersections,
  end tolerance=1pt,
  draft/crossing 3 label/.style={
    text=red,
    pin position=45,
  },
  draft/crossing 1 label/.style={
    text=green,
    pin position=135,
  }
]
\strand[ultra thick]
(0,0.3) to[out=180,in=90]
(-1.2,-1.5) to[out=-90,in=180]
(1,-3.5) to[out=0,in=0,looseness=2]
(0,-1) to[out=180,in=180,looseness=2]
(-1,-3.5) to[out=0,in=-90]
(1.2,-1.5) to[out=90,in=0] (0,0.3);
\end{knot}
\end{tikzpicture}

\end{document}

得出的结果为:

标记三叶草

作为附言,我已将此问题注册为spath3问题跟踪器,网址为https://github.com/loopspace/spath3/issues/1

相关内容