TikZ で結び目を描こうとしています。ここまでできました:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{knots}
\begin{document}
$\begin{tikzpicture}[domain=-2:2, scale=0.3]
\begin{knot} [clip width=4]
\strand (0,2) to [out=down, in=down, looseness=1.8] (1.5,0);
\strand (1.5,0) to [out=up, in=up, looseness=1.8] (0,-2);
\end{knot}
\draw[dashed] (0,0) circle (2cm);
\end{tikzpicture}$
\end{document}
重要なのは、各交差点で「上部と下部」が見えるようにする必要があることです (つまり、クリップ幅がゼロではない)。上記の例では、交差点は適切に機能しません。ただし、次のような別の (より大きな) ノットを描画すると、
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{knots}
\begin{document}
$\begin{tikzpicture}[domain=-2:2, scale=0.3]
\begin{knot}
\strand (-1.3,1.3) to [out=right, in=right, looseness=2.2] (-1.3,-1.3);
\strand (1.3,1.3) to [out=left, in=left, looseness=2.2] (1.3,-1.3);
\end{knot}
\draw[dashed] (0,0) circle (2cm);
\end{tikzpicture}$
\end{document}
すべて正常です。この異常な動作の原因は何でしょうか?
答え1
この問題の原因は、交差部分が 2 本のストランドの端に近すぎるため、「端の許容範囲」距離テストに合格できないことがほとんどです。これについては、後ほど詳しく説明します。
knots パッケージは、すべての可能な交差を確実に取得するために、いくつかの複雑な処理を実行します。これは複雑すぎる場合があるため、より広範なルーチンの一部をオフにするオプションがあります。また、一部はデフォルトで有効になっていません。これを機能させるには、環境ignore endpoint intersections=false
にオプション オプションを追加する必要がありますknot
。
\begin{knot}
オプション環境の開始との間にスペースを入れてはいけないことに注意してください。
\documentclass{article}
%\url{http://tex.stackexchange.com/q/217719/86}
\usepackage{tikz}
\usetikzlibrary{knots}
\begin{document}
\begin{tikzpicture}[domain=-2:2, scale=0.3]
\begin{knot}[
clip width=4,
ignore endpoint intersections=false,
]
\strand (0,2) to [out=down, in=down, looseness=1.8] (1.5,0);
\strand (1.5,0) to [out=up, in=up, looseness=1.8] (0,-2);
\end{knot}
\draw[dashed] (0,0) circle (2cm);
\end{tikzpicture}
\end{document}
ここで何が起こっているのか調査したところ、ライブラリにバグが1つか2つ見つかり、githubのバージョン。
更新日: 2014-12-15ここで私を困惑させたのは、なぜignore endpoint intersections
この特定の交差点は、エンドポイントではないため、に関連するテストの影響を受けており、knot
これがエンドポイントにならないようにコードを計画したと思っていました (パスが断片に分割されると、エンドポイントになることがあります)。つまり、エンドポイント テストでは、ストランドの端に近すぎると見なされる交差点は無視されます。コメントにある代替ソリューションによって、ゲームのscale=0.3
本質が明らかになりました。 によってダイアグラムが非常に小さくなり、その内部のほぼすべてのポイントが、ストランドのエンドポイントの既定の許容範囲内になります (パスが 2 つのストランドに分割されているため、 にエンドポイントがあることに注意してください(1.5,0)
。また、 キーを使用してここで 1 つのストランドを使用することもできますconsider self intersections
が、それでもエンドポイントの問題が残ることに注意してください)。上記のソリューションは、「ストランドの端に近づいているか?」テストをオフにすることで機能します。代替案は、許容値を減らすことでテストをより厳密にすることです。幸いなことに、元のパッケージを書いたときにそのことを思いつきました (それ以来忘れていましたが!)。end tolerance=<dimen>
テストを改良するためのキーがあります。つまり、次のようになります。
\begin{tikzpicture}[domain=-2:2, scale=.3]
\begin{knot}[
clip width=4,
end tolerance=1pt,
]
\strand (0,2) to [out=down, in=down, looseness=1.8]
(1.5,0);
\strand (1.5,0) to [out=up, in=up, looseness=1.8]
(0,-2);
\end{knot}
\draw[dashed] (0,0) circle (2cm);
\end{tikzpicture}
も動作します。
答え2
これは機能しますが、理由はわかりません。
\documentclass[tikz, border=5pt, mult, varwidth]{standalone}
\usetikzlibrary{knots}
\begin{document}
\begin{tikzpicture}[domain=-2:2, scale=0.3]
\begin{knot} [clip width=4]
\strand (0,2) to [out=down, in=down, looseness=1.8] (1.5,0);
\strand (1.5,0) to [out=up, in=up, looseness=1.8] (0,-2);
\strand (1.5,0) to [out=up, in=up, looseness=1.8] (0,-2);
\end{knot}
\draw[dashed] (0,0) circle (2cm);
\end{tikzpicture}
\end{document}
または、knot=colour
およびknot gap=factor
スタイルを使用します。
\documentclass[tikz, border=5pt, mult, varwidth]{standalone}
\usetikzlibrary{knots}
\begin{document}
\begin{tikzpicture}[domain=-2:2, scale=0.3, knot gap=7]
\draw [knot=black] (0,2) to [out=down, in=down, looseness=1.8] (1.5,0) ;
\draw [knot=black] (1.5,0) to [out=up, in=up, looseness=1.8] (0,-2);
\draw[dashed] (0,0) circle (2cm);
\end{tikzpicture}
\end{document}