我要做的是为我的学生写一些涉及逻辑公式的练习,例如:
学生应该在维恩图。在课程结束时,我真的很想为他们打印出正确的答案。我在论坛帖子中找到了一个很好的资源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}
看起来像:
有人能帮我绘制/定义一些处理补语的表达式吗?一个很好的例子可能是:
它看起来应该是这样的:(图片来自维基百科)
我并不坚持红色:)
我想使用最简单的解决方案,因为我想借助以下方法批量生成练习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 也可以处理它们。