TikZ を使用して描画された小さな結び目に交差が表示されない

TikZ を使用して描画された小さな結び目に交差が表示されない

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}

再び結び目

関連情報