我已经使用 LaTeX 几年了,但对这个tikz
软件包还很陌生。特别是,我想在我的文档中添加卡诺图。我已经找到了一个让我满意的解决方案(可以在这里找到:如何在 LaTeX 或 ConTeXt 中绘制卡诺图?),我想稍微调整一下,让布尔参数出现在第一个单元格中,我希望它像这个例子一样被对角线分割:删除表格的垂直线。
有人能帮助我吗?提前谢谢!
答案1
我在建议的代码中添加了填充颜色删除表格的垂直线\implicantcantons
。虽然我必须承认(在 16 个位置的地图上分组 4 个角)需要一些改进,但它对所有组都适用。
编辑:我还添加了 2x2 卡诺图和命令\implicantsol
来标记孤立元素。
编辑 2:解决了 的问题\implicantcantons
。现在四个角组已正确填充。第一个例子毫无意义,它只是显示了几个分组选项。
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix,calc}
%isolated term
%#1 - Optional. Space between node and grouping line. Default=0
%#2 - node
%#3 - filling color
\newcommand{\implicantsol}[3][0]{
\draw[rounded corners=3pt, fill=#3, opacity=0.3] ($(#2.north west)+(135:#1)$) rectangle ($(#2.south east)+(-45:#1)$);
}
%internal group
%#1 - Optional. Space between node and grouping line. Default=0
%#2 - top left node
%#3 - bottom right node
%#4 - filling color
\newcommand{\implicant}[4][0]{
\draw[rounded corners=3pt, fill=#4, opacity=0.3] ($(#2.north west)+(135:#1)$) rectangle ($(#3.south east)+(-45:#1)$);
}
%group lateral borders
%#1 - Optional. Space between node and grouping line. Default=0
%#2 - top left node
%#3 - bottom right node
%#4 - filling color
\newcommand{\implicantcostats}[4][0]{
\draw[rounded corners=3pt, fill=#4, opacity=0.3] ($(rf.east |- #2.north)+(90:#1)$)-| ($(#2.east)+(0:#1)$) |- ($(rf.east |- #3.south)+(-90:#1)$);
\draw[rounded corners=3pt, fill=#4, opacity=0.3] ($(cf.west |- #2.north)+(90:#1)$) -| ($(#3.west)+(180:#1)$) |- ($(cf.west |- #3.south)+(-90:#1)$);
}
%group top-bottom borders
%#1 - Optional. Space between node and grouping line. Default=0
%#2 - top left node
%#3 - bottom right node
%#4 - filling color
\newcommand{\implicantdaltbaix}[4][0]{
\draw[rounded corners=3pt, fill=#4, opacity=0.3] ($(cf.south -| #2.west)+(180:#1)$) |- ($(#2.south)+(-90:#1)$) -| ($(cf.south -| #3.east)+(0:#1)$);
\draw[rounded corners=3pt, fill=#4, opacity=0.3] ($(rf.north -| #2.west)+(180:#1)$) |- ($(#3.north)+(90:#1)$) -| ($(rf.north -| #3.east)+(0:#1)$);
}
%group corners
%#1 - Optional. Space between node and grouping line. Default=0
%#2 - filling color
\newcommand{\implicantcantons}[2][0]{
\draw[rounded corners=3pt, opacity=.3] ($(rf.east |- 0.south)+(-90:#1)$) -| ($(0.east |- cf.south)+(0:#1)$);
\draw[rounded corners=3pt, opacity=.3] ($(rf.east |- 8.north)+(90:#1)$) -| ($(8.east |- rf.north)+(0:#1)$);
\draw[rounded corners=3pt, opacity=.3] ($(cf.west |- 2.south)+(-90:#1)$) -| ($(2.west |- cf.south)+(180:#1)$);
\draw[rounded corners=3pt, opacity=.3] ($(cf.west |- 10.north)+(90:#1)$) -| ($(10.west |- rf.north)+(180:#1)$);
\fill[rounded corners=3pt, fill=#2, opacity=.3] ($(rf.east |- 0.south)+(-90:#1)$) -| ($(0.east |- cf.south)+(0:#1)$) [sharp corners] ($(rf.east |- 0.south)+(-90:#1)$) |- ($(0.east |- cf.south)+(0:#1)$) ;
\fill[rounded corners=3pt, fill=#2, opacity=.3] ($(rf.east |- 8.north)+(90:#1)$) -| ($(8.east |- rf.north)+(0:#1)$) [sharp corners] ($(rf.east |- 8.north)+(90:#1)$) |- ($(8.east |- rf.north)+(0:#1)$) ;
\fill[rounded corners=3pt, fill=#2, opacity=.3] ($(cf.west |- 2.south)+(-90:#1)$) -| ($(2.west |- cf.south)+(180:#1)$) [sharp corners]($(cf.west |- 2.south)+(-90:#1)$) |- ($(2.west |- cf.south)+(180:#1)$) ;
\fill[rounded corners=3pt, fill=#2, opacity=.3] ($(cf.west |- 10.north)+(90:#1)$) -| ($(10.west |- rf.north)+(180:#1)$) [sharp corners] ($(cf.west |- 10.north)+(90:#1)$) |- ($(10.west |- rf.north)+(180:#1)$) ;
}
%Empty Karnaugh map 4x4
\newenvironment{Karnaugh}%
{
\begin{tikzpicture}[baseline=(current bounding box.north),scale=0.8]
\draw (0,0) grid (4,4);
\draw (0,4) -- node [pos=0.7,above right,anchor=south west] {cd} node [pos=0.7,below left,anchor=north east] {ab} ++(135:1);
%
\matrix (mapa) [matrix of nodes,
column sep={0.8cm,between origins},
row sep={0.8cm,between origins},
every node/.style={minimum size=0.3mm},
anchor=8.center,
ampersand replacement=\&] at (0.5,0.5)
{
\& |(c00)| 00 \& |(c01)| 01 \& |(c11)| 11 \& |(c10)| 10 \& |(cf)| \phantom{00} \\
|(r00)| 00 \& |(0)| \phantom{0} \& |(1)| \phantom{0} \& |(3)| \phantom{0} \& |(2)| \phantom{0} \& \\
|(r01)| 01 \& |(4)| \phantom{0} \& |(5)| \phantom{0} \& |(7)| \phantom{0} \& |(6)| \phantom{0} \& \\
|(r11)| 11 \& |(12)| \phantom{0} \& |(13)| \phantom{0} \& |(15)| \phantom{0} \& |(14)| \phantom{0} \& \\
|(r10)| 10 \& |(8)| \phantom{0} \& |(9)| \phantom{0} \& |(11)| \phantom{0} \& |(10)| \phantom{0} \& \\
|(rf) | \phantom{00} \& \& \& \& \& \\
};
}%
{
\end{tikzpicture}
}
%Empty Karnaugh map 2x4
\newenvironment{Karnaughvuit}%
{
\begin{tikzpicture}[baseline=(current bounding box.north),scale=0.8]
\draw (0,0) grid (4,2);
\draw (0,2) -- node [pos=0.7,above right,anchor=south west] {bc} node [pos=0.7,below left,anchor=north east] {a} ++(135:1);
%
\matrix (mapa) [matrix of nodes,
column sep={0.8cm,between origins},
row sep={0.8cm,between origins},
every node/.style={minimum size=0.3mm},
anchor=4.center,
ampersand replacement=\&] at (0.5,0.5)
{
\& |(c00)| 00 \& |(c01)| 01 \& |(c11)| 11 \& |(c10)| 10 \& |(cf)| \phantom{00} \\
|(r00)| 0 \& |(0)| \phantom{0} \& |(1)| \phantom{0} \& |(3)| \phantom{0} \& |(2)| \phantom{0} \& \\
|(r01)| 1 \& |(4)| \phantom{0} \& |(5)| \phantom{0} \& |(7)| \phantom{0} \& |(6)| \phantom{0} \& \\
|(rf) | \phantom{00} \& \& \& \& \& \\
};
}%
{
\end{tikzpicture}
}
%Empty Karnaugh map 2x2
\newenvironment{Karnaughquatre}%
{
\begin{tikzpicture}[baseline=(current bounding box.north),scale=0.8]
\draw (0,0) grid (2,2);
\draw (0,2) -- node [pos=0.7,above right,anchor=south west] {b} node [pos=0.7,below left,anchor=north east] {a} ++(135:1);
%
\matrix (mapa) [matrix of nodes,
column sep={0.8cm,between origins},
row sep={0.8cm,between origins},
every node/.style={minimum size=0.3mm},
anchor=2.center,
ampersand replacement=\&] at (0.5,0.5)
{
\& |(c00)| 0 \& |(c01)| 1 \\
|(r00)| 0 \& |(0)| \phantom{0} \& |(1)| \phantom{0} \\
|(r01)| 1 \& |(2)| \phantom{0} \& |(3)| \phantom{0} \\
};
}%
{
\end{tikzpicture}
}
%Defines 8 or 16 values (0,1,X)
\newcommand{\contingut}[1]{%
\foreach \x [count=\xi from 0] in {#1}
\path (\xi) node {\x};
}
%Places 1 in listed positions
\newcommand{\minterms}[1]{%
\foreach \x in {#1}
\path (\x) node {1};
}
%Places 0 in listed positions
\newcommand{\maxterms}[1]{%
\foreach \x in {#1}
\path (\x) node {0};
}
%Places X in listed positions
\newcommand{\indeterminats}[1]{%
\foreach \x in {#1}
\path (\x) node {X};
}
\begin{document}
\begin{Karnaugh}
\contingut{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
\implicant{0}{2}{red}
\implicant{5}{15}{purple}
\implicantdaltbaix[3pt]{3}{10}{blue}
\implicantcantons[2pt]{orange}
\implicantcostats{4}{14}{green}
\end{Karnaugh}
%
\begin{Karnaughvuit}
\minterms{3,4}
\maxterms{0,1,6,7}
\indeterminats{2,5}
\implicant{3}{2}{green}
\implicant{4}{5}{}
\end{Karnaughvuit}
%
\begin{Karnaughquatre}
\minterms{1,2}
\maxterms{0,3}
\implicantsol{1}{green}
\implicantsol{2}{red}
\end{Karnaughquatre}
\end{document}
答案2
几天前(11 月 26 日),Mattias Jacobsson 上传了他的karnaugh-map
包到 CTAN。现在我的替代答案您可以使用真实的包。
karnaugh-map
也是基于 TikZ 的,可以绘制 2 到 6 个变量的地图,默认地图的数量为 4 个。5 个和 6 个变量的地图使用两个(或四个)4 个变量子图绘制。implicant
命令可以指定应用于哪个子图。
下面的代码展示了使用此新工具的一些示例。
\documentclass[tikz, border=2mm]{standalone}
\usepackage{karnaugh-map}
\begin{document}
\begin{karnaugh-map}
\manualterms{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
\implicant{0}{2}
\implicant{5}{15}
\implicantedge{1}{3}{9}{11}
\implicantcorner
\implicantedge{4}{12}{6}{14}
\end{karnaugh-map}
\begin{karnaugh-map}[4][2][1][$X_1X_0$][$X_2$]
\minterms{3,4}
\maxterms{0,1,6,7}
\indeterminants{2,5}
\implicant{3}{2}
\implicant{4}{5}
\end{karnaugh-map}
\begin{karnaugh-map}[2][2][1][$b$][$a$]
\minterms{1,2}
\maxterms{0,3}
\implicant{1}{1}
\implicant{2}{2}
\end{karnaugh-map}
\begin{karnaugh-map}[4][4][4]
\implicant{0}{0}[0,1,2,3]
\end{karnaugh-map}
\end{document}