如何在 LaTeX 中绘制维恩图(尤其是:补语)

如何在 LaTeX 中绘制维恩图(尤其是:补语)

我要做的是为我的学生写一些涉及逻辑公式的练习,例如:

A \杯 B

学生应该在维恩图。在课程结束时,我真的很想为他们打印出正确的答案。我在论坛帖子中找到了一个很好的资源latex-community.org,这对我用 tikz 制作一些维恩图有很大帮助,但在可视化补语方面遇到了一些问题,比如 ~A。

下面可以看到上面链接的论坛上 TeX 文件的简单修改版本,它产生了以下表达式:

在此处输入图片描述

\documentclass{letter}
  \usepackage{tikz}
  \def\firstcircle{(90:1.75cm) circle (2.5cm)}
  \def\secondcircle{(210:1.75cm) circle (2.5cm)}
  \def\thirdcircle{(330:1.75cm) circle (2.5cm)}
  \begin{document}
    \begin{tikzpicture}
      \begin{scope}
    \clip \secondcircle;
    \fill[cyan] \thirdcircle;
      \end{scope}
      \begin{scope}
    \clip \firstcircle;
    \fill[cyan] \thirdcircle;
      \end{scope}
      \draw \firstcircle node[text=black,above] {$A$};
      \draw \secondcircle node [text=black,below left] {$B$};
      \draw \thirdcircle node [text=black,below right] {$C$};
    \end{tikzpicture}
  \end{document}

看起来像:

在此处输入图片描述

有人能帮我绘制/定义一些处理补语的表达式吗?一个很好的例子可能是:

$\overline{A \cap B}$

它看起来应该是这样的:(图片来自维基百科

在此处输入图片描述

我并不坚持红色:)

我想使用最简单的解决方案,因为我想借助以下方法批量生成练习R。因此,我们欢迎任何有关 gnuplot、R 或任何其他开源软件包的建议。谢谢!


更新(2011/01/25):根据答案添加详细信息。

谢谢@Leo Liu,你帮了我大忙!我稍微修改了你建议的代码,以便能够为两个圆圈外的区域着色(在H宇宙),但不知道如何为该多边形设置背景。代码:

\begin{tikzpicture}[fill=gray]
% left hand
\scope
\clip (-2,-2) rectangle (2,2)
      (1,0) circle (1);
\fill (0,0) circle (1);
\endscope
% right hand
\scope
\clip (-2,-2) rectangle (2,2)
      (0,0) circle (1);
\fill (1,0) circle (1);
\endscope
% outline
\draw (0,0) circle (1) (0,1)  node [text=black,above] {$A$}
      (1,0) circle (1) (1,1)  node [text=black,above] {$B$}
      (-2,-2) rectangle (3,2) node [text=black,above] {$H$};
\end{tikzpicture}

生成的图像如下:

在此处输入图片描述

我还将在不久的将来寻找even odd rule目前对我来说没有意义但看起来非常简单和有希望的东西!

答案1

绘制维恩图有多种方法。最简单的方法$\overline{A \cap B}$可能是:

\tikz \fill[even odd rule] (0,0) circle (1) (1,0) circle (1);

这个问题的关键even odd rule在于TikZ(基于PostScript和PDF)。

使用奇偶规则

此外,您还可以使用\clip来填充集合的补集,而不使用even odd rule

\begin{tikzpicture}[fill=gray]
% left hand
\scope
\clip (-1,-1) rectangle (2,1)
      (1,0) circle (1);
\fill (0,0) circle (1);
\endscope
% right hand
\scope
\clip (-1,-1) rectangle (2,1)
      (0,0) circle (1);
\fill (1,0) circle (1);
\endscope
% outline
\draw (0,0) circle (1)
      (1,0) circle (1);
\end{tikzpicture}

使用剪辑

这里我们发现TikZ缺少一个\unfill由 MetaPost 提供的命令,因此我们必须使用一个额外的矩形来剪切路径。



对于更新的问题:

$A \cap B$好吧,我必须说,如果填充白色,这会更容易:

\begin{tikzpicture}
\filldraw[fill=gray] (-2,-2) rectangle (3,2);
\scope % A \cap B
\clip (0,0) circle (1);
\fill[white] (1,0) circle (1);
\endscope
% outline
\draw (0,0) circle (1)
      (1,0) circle (1);
\end{tikzpicture}

填充白色

然而,使用剪切来填充这样的区域并不容易(警告:使用起来有点困难,仅供娱乐):

\begin{tikzpicture}[fill=gray]
% left hand
\scope
\clip (-2,-2) rectangle (0.5,2)
      (1,0) circle (1);
\clip (-2,-2) rectangle (0.5,2);
\fill (-2,-2) rectangle (3,2);
\endscope
% right hand
\scope
\clip (0.5,-2) rectangle (3,2)
      (0,0) circle (1);
\clip (0.5,-2) rectangle (3,2);
\fill (-2,-2) rectangle (3,2);
\endscope
% outline
\draw (-2,-2) rectangle (3,2);
\draw (0,0) circle (1)
      (1,0) circle (1);
\end{tikzpicture}

提示:

  • 在一个命令中使用多个路径的结果\clip取决于方向的路径。

剪切路径方向的解释

  • 再次使用另一个\clip来去除正在填充的半圆。

答案2

Till Tantau 和 Kjell Magne Fauske 绘制的具有透明度的维恩图示例,摘自TikZ 示例库

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes,backgrounds}
\begin{document}
\pagestyle{empty}
\def\firstcircle{(0,0) circle (1.5cm)}
\def\secondcircle{(60:2cm) circle (1.5cm)}
\def\thirdcircle{(0:2cm) circle (1.5cm)}
\begin{tikzpicture}
    \begin{scope}[shift={(3cm,-5cm)}, fill opacity=0.5]
        \fill[red] \firstcircle;
        \fill[green] \secondcircle;
        \fill[blue] \thirdcircle;
        \draw \firstcircle node[below] {$A$};
        \draw \secondcircle node [above] {$B$};
        \draw \thirdcircle node [below] {$C$};
    \end{scope}
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案3

xelatex如果你需要 pdf 的话,运行它

\documentclass{minimal}

\usepackage{pstricks}

\begin{document}

\begin{pspicture}(6,4)
\psset{linewidth=1.5pt}
\psframe[fillcolor=red!30,fillstyle=solid](6,4)
\psclip{\pscircle(2,2){1.5}}
  \pscircle[fillcolor=white,fillstyle=solid](4,2){1.5}
\endpsclip
\pscircle(4,2){1.5}\pscircle(2,2){1.5}
\end{pspicture}

\end{document}

在此处输入图片描述

答案4

如果您使用 MetaPost 或 Asymptote,将会有不同的方法:buildcycle

例如,渐近线:

size(200);
defaultpen(black+1);

pair A = (0,0), B = (1,0);
path inter = buildcycle(arc(A,1,-90,90), arc(B, 1,90,270));
path outer = box((-2,-2), (3,2));

fill(outer, mediumgray); unfill(inter);
// or use:
//     fill(outer ^^ inter, evenodd+mediumgray);
draw(outer ^^ circle(A,1) ^^ circle(B,1));

结果

而且你不需要使用任何语言来绘制维恩图。Inkscape 也可以处理它们。

相关内容