![强制在结点包 TikZ 中设置单个销钉角度](https://linux22.com/image/379345/%E5%BC%BA%E5%88%B6%E5%9C%A8%E7%BB%93%E7%82%B9%E5%8C%85%20TikZ%20%E4%B8%AD%E8%AE%BE%E7%BD%AE%E5%8D%95%E4%B8%AA%E9%94%80%E9%92%89%E8%A7%92%E5%BA%A6.png)
我正在尝试使用 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