![创建结图的包](https://linux22.com/image/236756/%E5%88%9B%E5%BB%BA%E7%BB%93%E5%9B%BE%E7%9A%84%E5%8C%85.png)
我想知道是否有人可以推荐软件/包来创建漂亮的结图(希望附有他们过去制作的图像的链接)。
我最近使用了 xy-pic,但主要想了解其他选项。
答案1
我有一个使用这个的原型包TikZ/PGF。目前,它有点基础,因为它最初设计用于绘制非常具体的链接图,后来我才开始提取更通用的部分。尽管如此,它可以生成相当不错的结图(我认为),我很高兴听到关于如何改进它的想法。您可以从我的主页(当它更加完善时我会把它放到 CTAN 上)。
以下是一些示例,希望能激发您的兴趣。首先,这些示例的序言如下:
\documentclass{article}
\usepackage{brunnian}
\usetikzlibrary{%
arrows%
}
\tikzset{every path/.style={red,line width=2pt},every node/.style={transform shape,knot crossing,inner sep=1.5pt},>=triangle 60,text node/.style={rectangle,transform shape=false,black}}
接下来是三叶草
\begin{tikzpicture}
\foreach \brk in {0,1,2} {
\begin{scope}[rotate=\brk * 120]
\node (k\brk) at (0,-1) {};
\end{scope}
}
\draw (0,0) \foreach \brk in {0,1,2} {let \n0=\brk, \n1={int(Mod(\brk+1,3))}, \n2={int(Mod(\brk+2,3))} in (k\n0) .. controls (k\n0.16 south east) and (k\n1.16 south west) .. (k\n1.center) .. controls (k\n1.4 north east) and (k\n2.4 north west) .. (k\n2)} (k2);
\end{tikzpicture}
这很容易延伸到例如五叶草:
\begin{tikzpicture}
\foreach \brk in {0,...,4} {
\begin{scope}[rotate=\brk * 72]
\node (k\brk) at (0,-1.5) {};
\end{scope}
}
\draw (0,0) \foreach \brk in {0,...,4} {let \n0=\brk, \n1={int(Mod(\brk+1,5))}, \n2={int(Mod(\brk+2,5))} in (k\n0) .. controls (k\n0.16 south east) and (k\n1.16 south west) .. (k\n1.center) .. controls (k\n1.4 north east) and (k\n2.4 north west) .. (k\n2)} (k2);
\end{tikzpicture}
\begin{tikzpicture}
\foreach \brk in {0,...,4} {
\begin{scope}[rotate=-\brk * 72]
\node (k\brk) at (0,-1.5) {};
\pgfmathtruncatemacro{\brl}{\brk+97}
\node[text node] at (0,2) {\(\char\brl\)};
\end{scope}
}
\node[text node] at (0,0) {\(f\)};
\node[text node] at (126:2.5) {\(g\)};
\draw (0,0) \foreach \brk in {0,...,4} {let \n0=\brk, \n1={int(Mod(\brk-1,5))}, \n2={int(Mod(\brk-2,5))} in (k\n0) .. controls (k\n0.16 south east) and (k\n1.16 south west) .. (k\n1.center) .. controls (k\n1.4 north east) and (k\n2.4 north west) .. (k\n2)} (k2);
\end{tikzpicture}
(K) 不确定这个叫什么,它明显是 8 字结的延伸:
\begin{tikzpicture}
\node[rotate=45] (tl) at (-1,1) {};
\node[rotate=-45] (tr) at (1,1) {};
\edef\twists{10}
\foreach \brk in {0,...,\twists} {
\node (m\brk) at (0,-1 - \brk) {};
}
\foreach \brk in {1,...,\twists} {
\pgfmathparse{int(\brk - 1)}
\edef\brl{\pgfmathresult}
\draw (m\brk) .. controls (m\brk.4 north west) and (m\brl.4 south west) .. (m\brl.center);
\draw (m\brk.center) .. controls (m\brk.4 north east) and (m\brl.4 south east) .. (m\brl);
}
\draw (m0) .. controls (m0.8 north west) and (tl.3 south west) .. (tl.center);
\draw (m0.center) .. controls (m0.8 north east) and (tr.3 south east) .. (tr);
\draw (tl.center) .. controls (tl.16 north east) and (tr.16 north west) .. (tr);
\draw (m\twists) .. controls (m\twists.32 south east) and (tr.32 north east) .. (tr.center);
\draw (m\twists.center) .. controls (m\twists.32 south west) and (tl.32 north west) .. (tl);
\draw (tl) -- (tr.center);
\end{tikzpicture}
也有 Reidemeister 动作的例子。大多数图片列在这个 nLab 页面使用此包完成,然后通过 导出到 SVG tex4ht
。这一页都是使用这个包完成的。特别是下面的这个怪物!
答案2
运行xelatex
或使用包auto-pst-pdf
或运行latex
-> dvips
->ps2pdf
\documentclass{article}
\usepackage{pst-knot}
\begin{document}
\begin{pspicture}(-2,-2)(5,2)
\psKnot[linewidth=3pt,linecolor=red](0,0){3-1}
\psKnot[linewidth=3pt,linecolor=blue](4,0){4-1}
\end{pspicture}
\end{document}
3-1
文档解释了和的含义4-1
答案3
这个问题很老了,所以只是为了记录。MetaPost 包菲齐科可能不是绘制结的最实用或最稳定的工具,但它生成的图像看起来有些花哨。所有示例都在 ConTeXt 中,但相同的代码也可以在 LuaLaTeX 或独立中使用:
\startMPcode
input fiziko.mp;
path p;
p := (dir(90)*4/3cm) {dir(0)} .. tension 3/2
.. (dir(90 + 120)*4/3cm){dir(90 + 30)} .. tension 3/2
.. (dir(90 - 120)*4/3cm){dir(-90 - 30)} .. tension 3/2
.. cycle;
% p := pathSubdivide(p, 6);
addStrandToKnot (primeOne) (p, 1/5cm, "l", "1, -1, 1");
draw knotFromStrands (primeOne);
\stopMPcode
\startMPcode
input fiziko.mp;
path p;
p := (0, 2cm) .. (1/2cm, 3/2cm) .. (-1/2cm, 0) .. (1/2cm, -2/3cm) .. (4/3cm, 0) .. (0, 3/2cm) .. (-4/3cm, 0) .. (-1/2cm, -2/3cm) .. (1/2cm, 0) .. (-1/2cm, 3/2cm) .. cycle ;
% p := pathSubdivide(p, 6) shifted (4cm, -1/2cm);
addStrandToKnot (primeTwo) (p, 1/6cm, "l", "1, -1, 1, -1, 1");
draw knotFromStrands (primeTwo);
\stopMPcode
\startMPcode
input fiziko.mp;
path p[];
p1 := (fullcircle scaled 2cm) shifted (-1/2cm, 0);
p2 := p1 shifted (1cm, 0);
p3 := (-2cm, 0) -- (2cm, 0);
% p3 := pathSubdivide(p3, 4);
addStrandToKnot (someKnot) (p1, 1/6cm, "l", "0, 1, 0, 1");
addStrandToKnot (someKnot) (p2, 1/6cm, "l", "");
addStrandToKnot (someKnot) (p3, 1/6cm, "l", "1, -1, 1, -1");
draw knotFromStrands (someKnot);
\stopMPcode
在 中addStrandToKnot (primeOne) (p, 1/5cm, "l", "1, -1, 1");
,primeOne
是结的名称。p
是一条应沿其绘制线束的路径(请注意pathSubdivide
,该路径应包含一些合理数量的点;更新: 通过最近的更新,大多数情况下不需要细分路径来处理结点),1/5cm
是线的粗细,"l"
是阴影的类型(可以是"l"
,"t"
或"e"
,后者只是空轮廓,它的工作速度更快,但"t"
目前效果不是很好),"1, -1, 1"
是“层”的列表,其中交叉点按路径上出现的顺序排列(在默认的“零”级别之上或之下)。
并knotFromStrands (primeOne)
实际绘制所有线条并返回一张图片。
更新:
自上述图像生成以来,默认阴影设置已更改,现在的输出看起来会有所不同。这些设置可以通过defineMinStrokeWidth
宏进行更改,宏决定阴影笔触宽度(默认为1/5pt
)和defineLightDirection
决定“光”来自何处(默认为-1/8pi, 1/8pi
)。例如,第一个结点
defineLightDirection(1/8pi, -1/6pi);
defineMinStrokeWidth(1/5pt);
看起来是这样的:
答案4
(界面只是问我“你确定要添加完后还有回答?”)
这spath3
(该knots
库实际上是其中的一部分)现已扩展了一套新的例程,这些例程可用于绘制结点。这些例程的工作原理是在一条路径与另一条路径相交的点处切割一条路径,并在这些点处插入间隙,因此它特别适合背景不均匀的情况,或者旨在为图表的不同部分设置不同样式的情况(例如,说明 3 种颜色)。
以下是三叶草示例。有关更多示例,请参阅文档 (texdoc spath3
) 或查看github。
\documentclass{article}
%\url{https://tex.stackexchange.com/q/17181/86}
\usepackage{tikz}
\usetikzlibrary{spath3, intersections, hobby}
\begin{document}
\begin{tikzpicture}[
use Hobby shortcut,
every trefoil component/.style={ultra thick, draw, red},
trefoil component 1/.style={blue},
]
\path[spath/save=trefoil] ([closed]90:2) foreach \k in {1,...,3} { .. (-30+\k*240:.5) .. (90+\k*240:2) } (90:2);
\tikzset{spath/knot={trefoil}{8pt}{1,3,5}}
\end{tikzpicture}
\end{document}