如何在 Latex 中绘制以下 Kochen-Specker 图

如何在 Latex 中绘制以下 Kochen-Specker 图

Kochen-Specker 图

我需要在关于 Kochen-Specker 定理的论文中绘制下图。因此,我能够使用基本图片环境以某种方式非常不优雅的方式创建下图:

\documentclass{article}

\begin{document}





\begin{picture}(150,100)
\put(30,80){\circle*{5}}%point 1
\put(30,0){\circle*{5}}%point 2
\put(150,50){\circle*{5}}%point 3
\put(30,20){\circle*{5}}%point 4
\put(20,50){\circle*{5}}%point 5
\put(40,50){\circle*{5}}%point 6
\put(10,65){\circle*{5}}%point 7
\put(50,65){\circle*{5}}%point 8
\put(10,35){\circle*{5}}%point 9
\put(50,35){\circle*{5}}%point 10

\qbezier(30,80)(30,80)(150,50)
\qbezier(30,80)(30,80)(50,65)
\qbezier(30,80)(30,80)(10,65)
\qbezier(30,0)(30,0)(30,20)
\qbezier(30,0)(30,0)(150,50)
\qbezier(30,20)(30,20)(150,50)
\qbezier(30,20)(30,20)(10,35)
\qbezier(30,20)(30,20)(50,35)
\qbezier(20,50)(20,50)(40,50)
\qbezier(20,50)(20,50)(10,65)
\qbezier(20,50)(20,50)(10,35)
\qbezier(40,50)(40,50)(50,65)
\qbezier(40,50)(40,50)(50,35)
\qbezier(10,65)(10,65)(10,35)
\qbezier(50,65)(50,65)(50,35)

\end{picture} 

\end{document}

关于如何使用 Tikz 使其变得更美观,有什么建议吗?

答案1

与您想要创建的每个图表一样,您需要问自己两个问题:

  1. 我的节点应该是什么样子的?
  2. 我如何定位我的节点?
  3. 我该如何连接它们?

节点的出现

在您的情况下,您的节点只是完全着色的圆圈,或者没有着色的圆圈。

在 TikZ 中,这可以通过使用fill选项。(手册认为这是对路径的操作,但请记住基本上所有节点都有自己的路径。)

由于你的节点看起来像点,我定义了一种dot风格

因为节点通常包含文本 PGF/TikZ 也要确保节点的边框在inner sep文本周围有填充,但这使得指定节点的大小(特别是圆圈的大小)有点烦人,这就是我将其设置为零的原因。

为了让生活更轻松一点,我还定义了两个键*o分别代表填充的点和未填充的点:

dot/.style={circle, draw, inner sep=+0pt, minimum size=+5pt},
*/.style={dot, fill},
o/.style={dot},

TikZ 图片的进一步设置是thick设置不同的行宽(默认为thin)。

放置节点

放置节点有多种方法,最简单(但有时不是最好的)的方法就是明确地将它们放置在坐标坐标系其设置如下X向右移动 1 厘米,向上移动 1cm。这可以通过xy钥匙

连接节点

现在您已放置好节点,接下来要做的就是连接它们。

我不会使用多个语句,而是\draw (<node 1>) -- (<node 2>);使用edge路径操作这有点特殊,但对于这个例子,你只需要知道像

(<node 1>) edge (<node 2>) edge (<node 3>) edge (<node …>) edge (<node n>)

大致可以转换为

\draw (<node 1>) -- (<node 2>);
\draw (<node 1>) -- (<node 3>);
\draw (<node 1>) -- (<node n>);

这意味着您只需指定(<node 1>)一次。

但是文本又如何呢?

由于节点只是点,因此我们希望在节点旁边添加标签以识别它们。TikZ 有一个实用的工具:标签
(它们也是节点,但可以相对于它们指定的节点放置。)

通常,它是一个像这样使用的键:(label = [<options>] <direction> : <text>选项和方向是可选的)。但这很快就会让人厌烦。TikZ 还有quotes图书馆它会"<text>" <options>变成一个标签(或者一个大头针或者其他东西,如果它用在边缘或者图片的选项中的话)。

所有标签都继承了every label quotes我设置的样式,因此所有这些标签都设置为数学模式。这意味着我可以将$实际文本放在周围。

代码

\documentclass[tikz]{standalone}
\usetikzlibrary{quotes}
\begin{document}
\begin{tikzpicture}[
  dot/.style={circle, draw, inner sep=+0pt, minimum size=+5pt},
  */.style={dot, fill},
  o/.style={dot},
  thick,
  every label quotes/.append style={execute at begin node=$, execute at end node=$}
]
\node[o, "a_0"            ] (a0) at ( 0, 3) {};
\node[*, "a_1" left       ] (a1) at (-2, 1) {};
\node[*, "a_2" right      ] (a2) at ( 2, 1) {};
\node[*, "a_3" left       ] (a3) at (-2,-1) {};
\node[*, "a_4" right      ] (a4) at ( 2,-1) {};
\node[o, "a_5" below right] (a5) at (-1, 0) {};
\node[o, "a_6" below left ] (a6) at ( 1, 0) {};
\node[o, "a_7" below left ] (a7) at ( 0,-3) {};
\node[*, "a_8" right      ] (a8) at ( 5, 0) {};
\node[*, "a_9" left       ] (a9) at ( 0,-4) {};
\path (a0) edge (a1) edge (a2) edge (a8)
      (a1) edge (a3) edge (a5)
      (a2) edge (a4) edge (a6)
      (a3) edge (a5) edge (a7)
      (a4) edge (a6) edge (a7)
      (a5) edge (a6)
      (a7) edge (a8) edge (a9)
      (a8) edge (a9);
\end{tikzpicture}
\end{document}

输出

在此处输入图片描述

答案2

您也可以坚持使用picture环境,但我可能会改用更先进的pict2e软件包:

\documentclass{article}
\usepackage{xcolor, pict2e}

\begin{document}
\begin{picture}(150,100)
\footnotesize

\Line(30,80)(150,50)
\Line(30,80)(50,65)
\Line(30,80)(10,65)
\Line(30,0)(30,20)
\Line(30,0)(150,50)
\Line(30,20)(150,50)
\Line(30,20)(10,35)
\Line(30,20)(50,35)
\Line(20,50)(40,50)
\Line(20,50)(10,65)
\Line(20,50)(10,35)
\Line(40,50)(50,65)
\Line(40,50)(50,35)
\Line(10,65)(10,35)
\Line(50,65)(50,35)

\color{white}
\put(30,80){\circle*{5}}
\put(20,50){\circle*{5}}
\put(40,50){\circle*{5}}
\put(30,20){\circle*{5}}

\color{black}
\put(30,80){\circle{5}}
\put(20,50){\circle{5}}
\put(40,50){\circle{5}}
\put(30,20){\circle{5}}
\put(10,65){\circle*{5}}
\put(50,65){\circle*{5}}
\put(10,35){\circle*{5}}
\put(50,35){\circle*{5}}
\put(150,50){\circle*{5}}
\put(30,0){\circle*{5}}

\put(30,85){$a_0$}
\put(-3,63){$a_1$}
\put(55,63){$a_2$}
\put(-3,33){$a_3$}
\put(55,33){$a_4$}
\put(20,42){$a_5$}
\put(32,42){$a_6$}
\put(17,18){$a_7$}
\put(155,48){$a_8$}
\put(17,-2){$a_9$}
\end{picture} 
\end{document}

在此处输入图片描述

相关内容