# texlive[46131] Master: tikz-karnaugh (24dec17)

commits+karl at tug.org commits+karl at tug.org
Sun Dec 24 23:44:24 CET 2017

Revision: 46131
http://tug.org/svn/texlive?view=revision&revision=46131
Author:   karl
Date:     2017-12-24 23:44:24 +0100 (Sun, 24 Dec 2017)
Log Message:
-----------
tikz-karnaugh (24dec17)

Modified Paths:
--------------
trunk/Master/tlpkg/bin/tlpkg-ctan-check
trunk/Master/tlpkg/libexec/ctan2tds
trunk/Master/tlpkg/tlpsrc/collection-pictures.tlpsrc

-----------
trunk/Master/texmf-dist/doc/latex/tikz-karnaugh/
trunk/Master/texmf-dist/doc/latex/tikz-karnaugh/tikz-karnaugh-doc.pdf
trunk/Master/texmf-dist/doc/latex/tikz-karnaugh/tikz-karnaugh-doc.tex
trunk/Master/texmf-dist/tex/latex/tikz-karnaugh/
trunk/Master/texmf-dist/tex/latex/tikz-karnaugh/tikz-karnaugh.tex
trunk/Master/tlpkg/tlpsrc/tikz-karnaugh.tlpsrc

===================================================================
+++ trunk/Master/texmf-dist/doc/latex/tikz-karnaugh/README.txt	2017-12-24 22:44:24 UTC (rev 46131)
@@ -0,0 +1,31 @@
+Copyright (C) 2017 by Luis Paulo Laus, <laus at utfpr.edu.br>
+------------------------------------------------------------
+
+The tikz-karnaugh package may be distributed and/or modified
+under the conditions of the LaTeX Project Public License,
+either version 1 of this license or (at your option) any later
+  http://www.latex-project.org/lppl.txt and version 1 or
+later is part of all distributions of LaTeX version 1999/12/01
+or later.
+
+ Version 1.0 of 23 December 2017
+
+------------------------------------------------------------
+
+The tikz-karnaugh package is a LaTeX used to draw Karnaugh maps.
+It uses TikZ to produce high quality graph up to 12 variables,
+but this limit depends on the TeX memory usage and can be
+different for you. It is very good for presentation since
+TikZ allows for a better control over the final appearance of
+the map. You can control colour, styles and distances.
+
+It can be considered an upgrade of Andreas W. Wieland's karnaugh
+package towards TikZ supporting. Also, complex maps with solution
+(prime implicants) pointed out can be generated with external
+java software.
+
+It supports both American and European styles, though American
+style requires a litter extra effort.
+
+------------------------------------------------------------

___________________________________________________________________
## -0,0 +1 ##
+native
\ No newline at end of property
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/tikz-karnaugh/tikz-karnaugh-doc.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/tikz-karnaugh/tikz-karnaugh-doc.pdf	2017-12-24 11:18:21 UTC (rev 46130)
+++ trunk/Master/texmf-dist/doc/latex/tikz-karnaugh/tikz-karnaugh-doc.pdf	2017-12-24 22:44:24 UTC (rev 46131)

Property changes on: trunk/Master/texmf-dist/doc/latex/tikz-karnaugh/tikz-karnaugh-doc.pdf
___________________________________________________________________
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
===================================================================
--- trunk/Master/texmf-dist/doc/latex/tikz-karnaugh/tikz-karnaugh-doc.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/tikz-karnaugh/tikz-karnaugh-doc.tex	2017-12-24 22:44:24 UTC (rev 46131)
@@ -0,0 +1,509 @@
+\documentclass[english]{article}
+\usepackage[T1]{fontenc}
+\usepackage[latin9]{inputenc}
+\usepackage{lmodern}
+\usepackage{tikz}
+\usepackage{url}
+\def\tikzname{Ti\emph{k}Z}%
+\input ../tex/tikz-karnaugh
+\sloppy
+\begin{document}
+\title{Typesetting Karnaugh Maps with \LaTeX{} and \tikzname{}}
+\author{Luis Paulo Laus\\e-mail: \texttt{laus at utfpr.edu.br}}
+\date{Version 1.0 of 22 December 2017}
+
+\maketitle
+
+
+\section{Abstract}
+
+Karnaugh maps are used to simplify logic equations leading to the most compact expression of two level for a given truth table. The drawing of them used to be a boring, annoying and error-prone task. This set of macros intend to simplify the task. They can typeset Karnaugh maps with up to twelve variables, which is more than you might likely need. You only have to provide a list of variable identifiers plus the truth table of your logic function(s). The macros also allow to mark the simplifications of your logic function directly within a Karnaugh map. These package is based on \verb|kvmacros.tex| from \verb|karnaugh| package referred herein as the original one''. The modifications carried out intended to use \tikzname{} instead of native \LaTeX{} commands allowing easier customisation, easier extension when you need to draw other elements along with the map and leading to high graph quality.
+
+\section{Introduction}
+
+Karnaugh maps and Veitch charts are used to simplify logic equations. They are map representations of logic functions, and in that they are equivalent. Veitch charts are not supported by this package, but it should not be a big problem to port Andreas W. Wieland's veitch macro, available in \verb|karnaugh| package, if you need it.
+Please note that this software, including its documentation, is based on Andreas W. Wieland's previous work and the author wished to register his acknowledgment.
+
+\subsection{Comparison with Other Packages}
+
+If you ask yourself why another Karnaugh map typesetting package?'' the answer is easy: because I was not completely happy with the packages available I know and those are:
+\begin{enumerate}
+\item \verb|karnaugh|: it is great package that uses native \LaTeX{} commands to draw the map. It supports Karnaugh maps and Veitch charts. It employs a recursive algorithm with no size limit (well, it works until you blow the memory out which will happen about ten to twelve variables) which leads to an interesting kind of symmetry. Remember, Karnaugh maps are all about symmetry. It is not customisable, for instance, one cannot change the distance between bars (the marks showing around the map with variable identifiers on them) and if the variable identifier is long it will overlap another bar. Also, I want to use \tikzname{} to draw colourful semi-transparent figures on to top of the map to point out groups (prime implicants) and, although it is possible, it is rather difficult and the results is not very good because they always look a bit of. I have a long-time experience with this package and I have also written a java program to draw the maps because, though typesetting simple maps is easy, to point out the prime implicants is not.
+\item \verb|karnaughmap|: it uses \tikzname{} so you got a lot of options for customisation. It is limited to eight variable which, to be honest, should be enough for anyone. The problem is that it only draws bars (those marking mentioned above) up to for four variables. Also, the order in with the variable list is inputted is different from the order employed by \verb|karnaugh|.
+\item \verb|askmaps|: this package generates configurable American style Karnaugh maps for 2, 3, 4 and 5 variables. In America, instead of bars denoting the one value of variables, they use Gray code on the top and left side of the map. This behaviour can be mimic with \verb|tikz-karnaugh|, though, in my twenty years of experience teaching the subject, I have found out that bars are much more intuitive. The \verb|askmaps| contains four macros, one for each number of variables, and it can be used to point out prime implicants in the very same way that \verb|karnaugh| does.
+\item \verb|karnaugh-map|: uses \tikzname{} to draw up to four maps of four variables leading to a 3D six variables map. It contains commands for drawing implicants on top of the map. Like \verb|askmaps|, this package uses Gray code instead of bars.
+\end{enumerate}
+
+
+\subsection{Introductory example}
+
+
+Let us start first with an introduction on how to use these macros:
+The first thing you have to do is to put the macro file \verb|tikz-karnaugh.tex| into a directory where \TeX{} will find it, i.e., you have to put it into a directory where your \texttt{TEXINPUTS} environment variable points to. You can then load them by typing \verb|\input tikz-karnaugh| somewhere in the preamble of your document. Also, you are going to need \tikzname{}. For this type \verb|\usepackage{tikz}|.
+
+Suppose now you have a logic function~$f$ with the following truth table:
+
+\begin{center}
+
+\begin{tabular}{lr}
+  \begin{tabular}[t]{r|cccc|c}
+Index&$a$&$b$&$c$&$d$&$f$\\
+\hline
+0&0&0&0&0&1\\
+1&0&0&0&1&1\\
+2&0&0&1&0&1\\
+3&0&0&1&1&0\\
+4&0&1&0&0&0\\
+5&0&1&0&1&1\\
+6&0&1&1&0&1\\
+7&0&1&1&1&0\\
+  \end{tabular}
+&
+  \begin{tabular}[t]{r|cccc|c}
+Index&$a$&$b$&$c$&$d$&$f$\\
+\hline
+8&1&0&0&0&0\\
+9&1&0&0&1&1\\
+10&1&0&1&0&1\\
+11&1&0&1&1&0\\
+12&1&1&0&0&0\\
+13&1&1&0&1&1\\
+14&1&1&1&0&1\\
+15&1&1&1&1&0\\
+  \end{tabular}
+\end{tabular}
+\end{center}
+
+This logic function can easily be put into a Karnaugh map by using the
+\verb|\karnaughmap| macro in a \tikzname{} environment (\verb|\begin{tikzpicture}|) or inline command (\verb|\tikz|). It has five parameters:
+\begin{enumerate}
+\item the number of variables in the  map;
+\item an identifier for the function;
+\item a list of variable identifiers for the variables; and
+\item the list of values of $f$ for each line in the truth table; and
+\item a set of \tikzname{} commands that will be drown before the function values so the values will appear on top of them.
+\end{enumerate}
+
+The variable identifiers in the third parameter are ordered from highest to lowest significance (the same way as in the truth table, with $a$ having a significance of $2^3=8$ and $d$ having a significance of $2^0=1$). The list of values of $f$ was read from lowest to highest index. The fifth parameter remains empty in this example, it will be discussed further on:
+
+\begin{verbatim}
+\tikz[karnaugh,kmindex/.style={red,font=\tiny}]%
+  \karnaughmap{4}{f(a,b,c,d):}{abcd}{1110011001100110}{};
+\end{verbatim}
+
+This produces the following Karnaugh map, where the indices in the upper left
+corner of each box correspond to the indices in the truth
+table:\footnote{The indices can easily be calculated from the variable values
+  in the truth table, i.e. line 11: the index equals $2^{3}\,a+2^{2}\,b+2^{1}\,c+2^{0}\,d=8\,a+4\,b+2\,d+1\,d=8+2+1=11$.}
+
+\begin{center}
+\tikz[karnaugh,kmindex/.style={red,font=\tiny}]%
+  \karnaughmap{4}{f(a,b,c,d):}{abcd}{1110011001100110}{};
+\end{center}
+
+The macros that read the variable list and the list of logic values (i.e., parameters \#3 and \#4) work recursively.
+
+Each entry has to be one character long, otherwise -- like a variable identifier enclosed in \$s -- you have to put it into braces: + +\begin{verbatim} +\begin{tikzpicture}[karnaugh] + \karnaughmap{4}{$f(a,b,c,d):$}{{$a$}{$b$}{$c$}{$d$}}% + {0110011001100110}{} +\end{tikzpicture} +\end{verbatim} + +Here, a \tikzname{} environment was used so there is no semicolon (;) in the end of \verb|\karnaughmap| macro. Also, the indices were omitted by removing \verb|,kmindex/.style={red,font=\tiny}| from the options list. This produces the following Karnaugh map: + +\begin{center} +\begin{tikzpicture}[karnaugh] + \karnaughmap{4}{$f(a,b,c,d):$}{{$a$}{$b$}{$c$}{$d$}}% + {0110011001100110}{} +\end{tikzpicture} +\end{center} + +\section{Marking simplifications} + +The already mentioned fifth parameter can be used if you want to draw something inside the Karnaugh map. For example, this is useful if you want to show how you simplified a logic function pointing out the prime implicants: + +\begin{verbatim} +\kmunitlength=2em +\begin{tikzpicture}[karnaugh,x=1\kmunitlength,y=1\kmunitlength, + thick,grp/.style={rounded corners=0.2\kmunitlength, + fill opacity=0.6,rectangle,draw}] + \karnaughmap{4}{$f(a,b,c,d)$}{{$a$}{$b$}{$c$}{$d$}}% + {0110011001100110}% + { + \node[grp,color=blue,fill=blue!30, + minimum width=0.9\kmunitlength, + minimum height=1.9\kmunitlength] (n000) at (0.5,2.0) {}; + \node[grp,color=blue,fill=blue!30, + minimum width=0.9\kmunitlength, + minimum height=1.9\kmunitlength] (n001) at (3.5,2.0) {}; + \node[grp,color=red,fill=red!30, + minimum width=1.9\kmunitlength, + minimum height=0.9\kmunitlength] (n100) at (2.0,3.5) {}; + \node[grp,color=red,fill=red!30, + minimum width=1.9\kmunitlength, + minimum height=0.9\kmunitlength] (n110) at (2.0,0.5) {}; + \draw[color=blue] (n000.north) to [bend left=25] (n001.north) + (n000.south) to [bend right=25] (n001.south); + \draw[color=red] (n100.west) to [bend right=25] (n110.west) + (n100.east) to [bend left=25] (n110.east); + } +\end{tikzpicture} +\end{verbatim} + +The corresponding Karnaugh map looks like this: + +\begin{center} +\kmunitlength=2em +\begin{tikzpicture}[karnaugh,x=1\kmunitlength,y=1\kmunitlength, + thick,grp/.style={rounded corners=0.2\kmunitlength,fill opacity=0.6, + rectangle,draw}] + \karnaughmap{4}{$f(a,b,c,d)$}{{$a$}{$b$}{$c$}{$d$}}% + {0110011001100110}% + { + \node[grp,color=blue,fill=blue!30,minimum width=0.9\kmunitlength, + minimum height=1.9\kmunitlength](n000) at (0.5,2.0) {}; + \node[grp,color=blue,fill=blue!30,minimum width=0.9\kmunitlength, + minimum height=1.9\kmunitlength](n001) at (3.5,2.0) {}; + \node[grp,color=red,fill=red!30,minimum width=1.9\kmunitlength, + minimum height=0.9\kmunitlength](n100) at (2.0,3.5) {}; + \node[grp,color=red,fill=red!30,minimum width=1.9\kmunitlength, + minimum height=0.9\kmunitlength](n110) at (2.0,0.5) {}; + \draw[color=blue] (n000.north) to [bend left=25] (n001.north) + (n000.south) to [bend right=25] (n001.south); + \draw[color=red] (n100.west) to [bend right=25] (n110.west) + (n100.east) to [bend left=25] (n110.east); + } +\end{tikzpicture} +\end{center} +and the corresponding expression is:$f(a,b,c,d) = {\color{blue}c\,\bar{d}} + {\color{red}\bar{c}\,d}.$ + +Instead of \LaTeX's graphics macros\footnote{As in the original software.} you can use \tikzname{} for this purpose. The Karnaugh map has its datum at the lower left point exactly. The length of a single cell within the Karnaugh map is equal to \verb|\kmunitlength|. + +\section{Other features} + +There are some more features that you can use. Possibly the most important is +that you can change the size of the diagrams by changing the size of the +boxes within the map, simply by typing: + +\begin{verbatim} +\kmunitlength=15mm +\begin{tikzpicture}[karnaugh] + \karnaughmap{4}{$f:$}{abcd}{0110011001100110}{} +\end{tikzpicture} +\end{verbatim} + +This results in the following Karnaugh map. The setting of the +\verb|\kmunitlength| remains active until you change it again;\footnote{Or, of + course, until you leave the group in which you redefined the value.} +the default \verb|\kmunitlength| is 8\,mm: + +\begin{center} +\kmunitlength=15mm +\begin{tikzpicture}[karnaugh] + \karnaughmap{4}{$f:$}{abcd}{0110011001100110}{} +\end{tikzpicture} +\end{center} + +Another feature is that you can switch on the indices inside the map like in the fisrt example by typing: + +\begin{verbatim} +\begin{tikzpicture}[karnaugh,kmindex/.style={red,font=\tiny}] + \karnaughmap{4}{$f:$}{abcd}{0110011001100110}{} +\end{tikzpicture} +\end{verbatim} + +\begin{center} +\kmunitlength=8mm +\begin{tikzpicture}[karnaugh,kmindex/.style={red,font=\tiny}] + \karnaughmap{4}{$f:$}{abcd}{0110011001100110}{} +\end{tikzpicture} +\end{center} + +Usually, the font size of the map's contents and indices should be suitable (\verb|\tiny| for \verb|kmindex/.style| and \verb|\normalsize| for \verb|kmcell/.style|). Those sizes, of course, can be adjusted. + +\section{If you use the original version of the macros\ldots} + +\ldots{} you will certainly have noticed a number of changes. The most important one is that now you control the appearance of cell, index, etc. by changing the style and not through macros. Also, you need a \tikzname{} picture environment. + + +\section{Dimensions and styles} + +The appearance of the Karnaugh map is controlled by some styles and dimensions as follows: +\begin{description} +\item [{kmbar/.style }] top and side bars related to the variables and denoting the rows and columns for which the respective variable is 1. The default value is \verb!black,|-|,thin! meaning they all will be represented as a black think line with T chapped tips. +\item [{kmbar label/.style }] style used for the variable name on the bars. The default value is \verb|black|. +\item [{kmvar/.style }] style used for the variable name (function) of the map. The default value is \verb|black|. +\item [{kmindex/.style}] style used for cell index. The default value is \verb|transparent| meaning they all will be omitted (invisible to be precise). +\item [{kmcell/.style}] style used for cell contents. The default value is \verb|black|. +\item [{kmlines/.style}] style used for the lines separating adjacent rows and columns. The default value is \verb|black|. +\item [{bar sep}] distance between the bar closer to the map and map itself. It depends mainly on the line tip used in \verb|kmlines/.style|. The default value is \verb|0.2\kmunitlength|. +\item [{kmbar top sep}] distance between two bars on the top of map. It depends mainly on the font height used in \verb|kmbar label/.style|. The default value is \verb|1\kmunitlength|. +\item [{kmbar left sep}] distance between two bars on the left of map. It depends mainly on the variable name which and the font size used in \verb|kmbar label/.style|. The default value is \verb|1\kmunitlength|. +\end{description} +For more on styles have a look in the \tikzname{} documentation. + +Let us see a more interesting and colourful example. +\begin{verbatim} +\kmunitlength=2.5em +\begin{tikzpicture}[karnaugh,x=1\kmunitlength,y=1\kmunitlength, + thick,grp/.style={rounded corners=0.2\kmunitlength, + fill opacity=0.6,rectangle,draw}, + kmbar/.style={blue,<->,double=white,semithick}, + bar left sep=1.2\kmunitlength, + bar sep=0.4\kmunitlength, + kmbar label/.style={red!70!black}, + kmindex/.style={orange,font=\tiny}, + kmcell/.style={cyan!80!black}, + kmlines/.style={brown,thin}, + kmvar/.style={green!70!black}] + \karnaughmap{6}{$z_{0}$}{% + {$x_{5}$}{$x_{2}$}{$x_{4}$}{$x_{1}$}{$x_{3}$}{$x_{0}$}}% + {--1{}1{}1{}-11-1{}1{}1-{}1{}{}1-1-{}1-{}-1-1{\color{red}1}% + --{}1{}-11{}-{}1--1{}1{}{}111-{}1{}--1}% + { + \node[grp,color=blue,fill=blue!30, + minimum width=1.9\kmunitlength, + minimum height=0.9\kmunitlength](n000) at (1.0,7.5) {}; + \node[grp,color=blue,fill=blue!30, + minimum width=1.9\kmunitlength, + minimum height=0.9\kmunitlength](n002) at (7.0,7.5) {}; + \node[grp,color=blue,fill=blue!30, + minimum width=1.9\kmunitlength, + minimum height=1.9\kmunitlength](n010) at (1.0,4.0) {}; + \node[grp,color=blue,fill=blue!30, + minimum width=1.9\kmunitlength, + minimum height=1.9\kmunitlength](n012) at (7.0,4.0) {}; + \node[grp,color=blue,fill=blue!30, + minimum width=1.9\kmunitlength, + minimum height=0.9\kmunitlength](n030) at (1.0,0.5) {}; + \node[grp,color=blue,fill=blue!30, + minimum width=1.9\kmunitlength, + minimum height=0.9\kmunitlength](n032) at (7.0,0.5) {}; + \draw[color=blue] (n000.east) to [bend left=25] (n002.west) + (n010.east) to [bend left=25] (n012.west) + (n030.east) to [bend right=25] (n032.west) + (n000.south) to [bend right=25] (n010.north) + (n002.south) to [bend left=25] (n012.north) + (n010.south) to [bend right=25] (n030.north) + (n012.south) to [bend left=25] (n032.north); + \node[grp,color=red,fill=red!30, + minimum width=0.8\kmunitlength, + minimum height=7.8\kmunitlength](n100) at (0.5,4.0) {}; + \node[grp,color=red,fill=red!30, + minimum width=0.8\kmunitlength, + minimum height=7.8\kmunitlength](n101) at (3.5,4.0) {}; + \draw[color=red] (n100.north) to [bend left=25] (n101.north) + (n100.south) to [bend right=25] (n101.south); + \node[grp,color=orange,fill=orange!30, + minimum width=1.9\kmunitlength, + minimum height=1.9\kmunitlength](n200) at (5.0,6.0) {}; + \node[grp,color=orange,fill=orange!30, + minimum width=1.9\kmunitlength, + minimum height=1.9\kmunitlength](n220) at (5.0,2.0) {}; + \draw[color=orange] (n200.west) to [bend right=25] (n220.west) + (n200.east) to [bend left=25] (n220.east); + \node[grp,color=teal,fill=teal!30, + minimum width=1.8\kmunitlength, + minimum height=1.8\kmunitlength](n300) at (6.0,6.0) {}; + \node[grp,color=teal,fill=teal!30, + minimum width=1.8\kmunitlength, + minimum height=1.8\kmunitlength](n320) at (6.0,2.0) {}; + \draw[color=teal] (n300.west) to [bend right=25] (n320.west) + (n300.east) to [bend left=25] (n320.east); + } +\end{tikzpicture} +\end{verbatim} + +The corresponding Karnaugh map looks like this: + +\begin{center} +\kmunitlength=2.5em +\begin{tikzpicture}[karnaugh,x=1\kmunitlength,y=1\kmunitlength, + thick,grp/.style={rounded corners=0.2\kmunitlength, + fill opacity=0.6,rectangle,draw}, + kmbar/.style={blue,<->,double=white,semithick}, + bar left sep=1.2\kmunitlength, + bar sep=0.4\kmunitlength, + kmbar label/.style={red!70!black}, + kmindex/.style={orange,font=\tiny}, + kmcell/.style={cyan!80!black}, + kmlines/.style={brown,thin}, + kmvar/.style={green!70!black}] + \karnaughmap{6}{$z_{0}$}{% + {$x_{5}$}{$x_{2}$}{$x_{4}$}{$x_{1}$}{$x_{3}$}{$x_{0}$}}% + {--1{}1{}1{}-11-1{}1{}1-{}1{}{}1-1-{}1-{}-1-1{\color{red}1}% + --{}1{}-11{}-{}1--1{}1{}{}111-{}1{}--1}% + { + \node[grp,color=blue,fill=blue!30, + minimum width=1.9\kmunitlength, + minimum height=0.9\kmunitlength](n000) at (1.0,7.5) {}; + \node[grp,color=blue,fill=blue!30, + minimum width=1.9\kmunitlength, + minimum height=0.9\kmunitlength](n002) at (7.0,7.5) {}; + \node[grp,color=blue,fill=blue!30, + minimum width=1.9\kmunitlength, + minimum height=1.9\kmunitlength](n010) at (1.0,4.0) {}; + \node[grp,color=blue,fill=blue!30, + minimum width=1.9\kmunitlength, + minimum height=1.9\kmunitlength](n012) at (7.0,4.0) {}; + \node[grp,color=blue,fill=blue!30, + minimum width=1.9\kmunitlength, + minimum height=0.9\kmunitlength](n030) at (1.0,0.5) {}; + \node[grp,color=blue,fill=blue!30, + minimum width=1.9\kmunitlength, + minimum height=0.9\kmunitlength](n032) at (7.0,0.5) {}; + \draw[color=blue] (n000.east) to [bend left=25] (n002.west) + (n010.east) to [bend left=25] (n012.west) + (n030.east) to [bend right=25] (n032.west) + (n000.south) to [bend right=25] (n010.north) + (n002.south) to [bend left=25] (n012.north) + (n010.south) to [bend right=25] (n030.north) + (n012.south) to [bend left=25] (n032.north); + \node[grp,color=red,fill=red!30, + minimum width=0.8\kmunitlength, + minimum height=7.8\kmunitlength](n100) at (0.5,4.0) {}; + \node[grp,color=red,fill=red!30, + minimum width=0.8\kmunitlength, + minimum height=7.8\kmunitlength](n101) at (3.5,4.0) {}; + \draw[color=red] (n100.north) to [bend left=25] (n101.north) + (n100.south) to [bend right=25] (n101.south); + \node[grp,color=orange,fill=orange!30, + minimum width=1.9\kmunitlength, + minimum height=1.9\kmunitlength](n200) at (5.0,6.0) {}; + \node[grp,color=orange,fill=orange!30, + minimum width=1.9\kmunitlength, + minimum height=1.9\kmunitlength](n220) at (5.0,2.0) {}; + \draw[color=orange] (n200.west) to [bend right=25] (n220.west) + (n200.east) to [bend left=25] (n220.east); + \node[grp,color=teal,fill=teal!30, + minimum width=1.8\kmunitlength, + minimum height=1.8\kmunitlength](n300) at (6.0,6.0) {}; + \node[grp,color=teal,fill=teal!30, + minimum width=1.8\kmunitlength, + minimum height=1.8\kmunitlength](n320) at (6.0,2.0) {}; + \draw[color=teal] (n300.west) to [bend right=25] (n320.west) + (n300.east) to [bend left=25] (n320.east); + } +\end{tikzpicture} +\end{center} + +You may notice that the zeros were omitted (replaced by \verb|{}| in the list). Also, in the cell~34 the one is red beause \verb|{\color{red}1}|. You can put almost anything inside a cell using curly brackets. The distance between bars on the left side was set to \verb|1.2\kmunitlength| to prevent overlapping between$x_3$(the label) and$x_4$bar and$x_4$and$x_5$bar, but the distance between the bars on top was left unchanged. The distance between the map and the bars closest to it was set to \verb|0.4\kmunitlength| to prevent overlapping between the bar tip (\tikz[baseline] \draw[blue,->,double=white,semithick] (0,0.6ex) -- (0.5cm,0.6ex);) and the map itself. If you want an American style map you can use \verb|bar sep| to leave space for the Gray coded numbers. + +The indices can be computed by $32\,x_{5}+8\,x_{4}+2\,x_{3}+16\,x_{2}+4\,x_{1}+1\,x_{0}$ which is a bit bizarre. The truth table values ought to be arranged according to this index order. This bizarreness is the price we pay to have the variables placed in positions which are more intuitive. See Section~ \ref{sec:remarks} for a software that can help on this matter. + +\section{American style} + +If you really want an American style map and you are not afraid of admitting it publicly, you can still use this package to typeset it. The first thing to do is to disable the bars and the function identifiers by making them transparent. Therefore, these options have to be included in the \tikzname{} command: +\begin{verbatim} + kmbar/.style={transparent}, + kmvar/.style={transparent} +\end{verbatim} + +Then you will need rows and columns labels in Gray code and a caption for the map. In the last example, these can be achieved by appending the following code in the fifth argument of the \verb|karnaughmap| macro: +\begin{verbatim} + \draw[brown,thin] (0,8) -- + node[below left,magenta]{$x_5,x_4,x_3$} + node[above right,violet]{$x_2,x_1,x_0$} +(-1,1) + node[above left,green!70!black] {$z_0$}; + \foreach \x/\l in % + {0/000,1/001,2/011,3/010,4/110,5/111,6/101,7/100} { + \node[violet] at (\x+0.5,8.2) {\l}; + \node[magenta] at (-0.4,7.5-\x) {\l}; + } +\end{verbatim} + +The result should be: + +\begin{center} +\kmunitlength=2.5em +\begin{tikzpicture}[karnaugh,x=1\kmunitlength,y=1\kmunitlength, + thick,grp/.style={rounded corners=0.2\kmunitlength, + fill opacity=0.6,rectangle,draw}, + kmbar/.style={transparent}, + bar left sep=0pt, + bar top sep=0pt, + bar sep=0pt, + kmindex/.style={orange,font=\tiny}, + kmcell/.style={cyan!80!black}, + kmlines/.style={brown,thin}, + kmvar/.style={transparent}] + \karnaughmap{6}{$z_{0}$}{% + {$x_{5}$}{$x_{2}$}{$x_{4}$}{$x_{1}$}{$x_{3}$}{$x_{0}$}}% + {--1{}1{}1{}-11-1{}1{}1-{}1{}{}1-1-{}1-{}-1-1{\color{red}1}% + --{}1{}-11{}-{}1--1{}1{}{}111-{}1{}--1}% + { + \node[grp,color=blue,fill=blue!30, + minimum width=1.9\kmunitlength, + minimum height=0.9\kmunitlength](n000) at (1.0,7.5) {}; + \node[grp,color=blue,fill=blue!30, + minimum width=1.9\kmunitlength, + minimum height=0.9\kmunitlength](n002) at (7.0,7.5) {}; + \node[grp,color=blue,fill=blue!30, + minimum width=1.9\kmunitlength, + minimum height=1.9\kmunitlength](n010) at (1.0,4.0) {}; + \node[grp,color=blue,fill=blue!30, + minimum width=1.9\kmunitlength, + minimum height=1.9\kmunitlength](n012) at (7.0,4.0) {}; + \node[grp,color=blue,fill=blue!30, + minimum width=1.9\kmunitlength, + minimum height=0.9\kmunitlength](n030) at (1.0,0.5) {}; + \node[grp,color=blue,fill=blue!30, + minimum width=1.9\kmunitlength, + minimum height=0.9\kmunitlength](n032) at (7.0,0.5) {}; + \draw[color=blue] (n000.east) to [bend left=25] (n002.west) + (n010.east) to [bend left=25] (n012.west) + (n030.east) to [bend right=25] (n032.west) + (n000.south) to [bend right=25] (n010.north) + (n002.south) to [bend left=25] (n012.north) + (n010.south) to [bend right=25] (n030.north) + (n012.south) to [bend left=25] (n032.north); + \node[grp,color=red,fill=red!30, + minimum width=0.8\kmunitlength, + minimum height=7.8\kmunitlength](n100) at (0.5,4.0) {}; + \node[grp,color=red,fill=red!30, + minimum width=0.8\kmunitlength, + minimum height=7.8\kmunitlength](n101) at (3.5,4.0) {}; + \draw[color=red] (n100.north) to [bend left=25] (n101.north) + (n100.south) to [bend right=25] (n101.south); + \node[grp,color=orange,fill=orange!30, + minimum width=1.9\kmunitlength, + minimum height=1.9\kmunitlength](n200) at (5.0,6.0) {}; + \node[grp,color=orange,fill=orange!30, + minimum width=1.9\kmunitlength, + minimum height=1.9\kmunitlength](n220) at (5.0,2.0) {}; + \draw[color=orange] (n200.west) to [bend right=25] (n220.west) + (n200.east) to [bend left=25] (n220.east); + \node[grp,color=teal,fill=teal!30, + minimum width=1.8\kmunitlength, + minimum height=1.8\kmunitlength](n300) at (6.0,6.0) {}; + \node[grp,color=teal,fill=teal!30, + minimum width=1.8\kmunitlength, + minimum height=1.8\kmunitlength](n320) at (6.0,2.0) {}; + \draw[color=teal] (n300.west) to [bend right=25] (n320.west) + (n300.east) to [bend left=25] (n320.east); + \draw[brown,thin] (0,8) -- node[below left,magenta]{$x_5,x_4,x_3$} node[above right,violet]{$x_2,x_1,x_0$} +(-1,1) node[above left,green!70!black] {$z_0$}; + \foreach \x/\l in {0/000,1/001,2/011,3/010,4/110,5/111,6/101,7/100} { + \node[violet] at (\x+0.5,8.2) {\l}; + \node[magenta] at (-0.4,7.5-\x) {\l}; + } + } +\end{tikzpicture} +\end{center} + +Note, however, that the index inside a cell does not math the Gray code value of the respective row and column. The indices can still be computed by $32\,x_{5}+8\,x_{4}+2\,x_{3}+16\,x_{2}+4\,x_{1}+1\,x_{0}.$ + +\section{Final remarks\label{sec:remarks}} + +This is not nearly all you need to know about the usage of these macros. In case you find a bug, or if you have comments or suggestions, please send me an e-mail. + +The maximum size map I could produce was a Karnaugh map with 12~variables; with bigger maps I only exceeded \TeX's main memory. This is due to the macros' recursive algorithm. Quite likely you will exceed \TeX's capacity with even smaller maps if they occur in large documents. + +If you need help to typeset Karnaugh maps with the marking for the solution on it you can try \verb| JQM - Java Quine McCluskey| for minimization of Boolean functions available on \url{https://sourceforge.net/projects/jqm-java-quine-mccluskey/}. It can generate the solution and create the corresponding map based on a given truth table. +One very useful feature of this software is that you can reorder de variables on the map to suite your particular application instead of rely exclusively on the macro to scatter your variables around. + +\end{document} + + Property changes on: trunk/Master/texmf-dist/doc/latex/tikz-karnaugh/tikz-karnaugh-doc.tex ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: trunk/Master/texmf-dist/tex/latex/tikz-karnaugh/tikz-karnaugh.tex =================================================================== --- trunk/Master/texmf-dist/tex/latex/tikz-karnaugh/tikz-karnaugh.tex (rev 0) +++ trunk/Master/texmf-dist/tex/latex/tikz-karnaugh/tikz-karnaugh.tex 2017-12-24 22:44:24 UTC (rev 46131) @@ -0,0 +1,300 @@ +% This is file tikz-karnaugh.tex', +%% Version 1.0 of 22nd December, 2017 +%% +%% Copyright (C) 2017 by Luis Paulo Laus, laus at utfpr.edu.br +%% +%% This package can be redistributed and/or modified under the terms +%% of the LaTeX Project Public License distributed from CTAN +%% archives in directory macros/latex/base/lppl.txt; either +%% version 1 of the License, or (at your option) any later version, +%% with The Package' referring to the software tikz-karnaugh.tex' and its +%% accompanying documentation and The Copyright Holder' referring to the +%% person Luis Paulo Laus. +%% +%% This software is based on Andreas W. Wieland's kvmacros.tex to whom +%% the author wished to express his gratitude. +%% +%% IMPORTANT NOTICE: +%% +%% For error reports, comments or suggestions in case of UNCHANGED +%% versions send mail to: +%% laus at utfpr.edu.br +%% +%% +\typeout{} +\typeout{Macros for typesetting Karnaugh maps} +\typeout{Version of 22nd December, 2017} +\typeout{by Luis Paulo Laus, laus at utfpr.edu.br} +\typeout{} +%% +%% Change History: +%% 22nd December, 2017: Original Version ported from kvmacros.tex +%% +%% +%% +%% Setting up some TikZ parameters for an Karnaugh Map +%% +\tikzset{ + karnaugh/.style={ + kmbar/.style={black,|-|,thin}, + kmbar label/.style={black}, + bar sep/.style={kmbar sep={##1}}, + bar top sep/.style={kmbar top sep={##1}}, + bar left sep/.style={kmbar left sep={##1}}, + kmindex/.style={transparent}, + karnaugh index/.style={kmindex/.style={##1}}, + kmcell/.style={black}, + kmvar/.style={black}, + kmlines/.style={thin}, + every karnaugh/.try + } +} + +\pgfkeys{/pgf/.cd, + kmbar sep/.initial=0.2\kmunitlength, + kmbar top sep/.initial=1\kmunitlength, + kmbar left sep/.initial=1\kmunitlength, +} + +%% +%% We need a fixed dimension for a single field in a Karnaugh map +%% and also an auxiliary dimension to place de bars. +%% +\newdimen\kmunitlength +\newdimen\kmtemplength +\kmunitlength=8mm +%% +%% First, we have to introduce some counters: +%% +%% \kmrecursiondepth is used to control the recursion of the +%% \karnaughmakemap. +%% +\newcount\kmrecursiondepth +%% +%% The \kmindexcounter is needed for the indices in the fields of the +%% diagrams. +%% +\newcount\kmindexcounter +%% +%% \kmxsize and \kmysize store the dimensions of an entire diagram. +%% +\newcount\kmxsize +\newcount\kmysize +%% +%% Some counters are necessary to compute the marks for the variable +%% identifiers: +%% +\newcount\kmvarno +\newcount\kmxvarno +\newcount\kmyvarno +\newcount\kmmarkstart +\newcount\kmmarklength +\newcount\kmmarknum +\newcount\kmmarkmove +\newcount\kmtemppos +%% +%% And we need a box to store the variable names: +%% +\newbox\kmbox +%% +%% Single fields in a diagram should be indexed, which makes the map easier to +%% use. This is the default. If you don't want indices, simply call +%% \kmnoindex. If you want indices back, call \kmindex: +%% +\def\kmnoindex{% +\def\kmcurrentindex{}} +%% +\def\kmindex{% + \def\kmcurrentindex{% + \the\kmindexcounter\global\advance\kmindexcounter by 1}% +} +%% +\kmindex +%% +%% We need a macro that computes the powers of two: +%% +\def\kmpoweroftwo#1#2{{% Computes #1=2^#2, both of which have to be counters + \ifnum#2>0 + \global\multiply#1 by 2 + \advance#2 by -1 + \kmpoweroftwo{#1}{#2} + \fi}} +%% +%% The macros \kmargumentstring, \kmgetchar and \kmgetonechar are needed to +%% process the variable-length parameters in \karnaughmap: +%% +\def\kmargumentstring#1{\gdef\kmdummystring{#1{}\noexpand\end}} +%% +\def\kmgetchar{\expandafter\kmgetonechar\kmdummystring} +%% +\def\kmgetonechar#1#2\end{{#1}\gdef\kmdummystring{#2\noexpand\end}}% +%% +%% The Macro \karnaughmakemap calls itself recursively until the parameter #1 +%% equals 1, whereupon it returns a single token from the list of arguments, +%% enclosed in a \makebox plus the index (if enabled) in a smaller \makebox: +%% +\def\karnaughmakemap#1#2#3#4{{% + \kmrecursiondepth #1\relax + \ifnum\kmrecursiondepth>1 + \divide\kmrecursiondepth by 2 + \edef\tempx{#3} + \edef\tempy{#4} + \kmtemppos=\tempx\relax + \advance\kmtemppos by \kmrecursiondepth + \edef\tempxs{\the\kmtemppos} + \kmtemppos=\tempy\relax + \advance\kmtemppos by \kmrecursiondepth + \edef\tempys{\the\kmtemppos} + + \ifcase#2 +%% +%% The parameter #2 of \karnaughmakemap is needed because the inner Karnaugh +%% maps need to be mirrored. This is achieved by the following case-statement, +%% which orders the inner Karnaugh maps properly: +%% +%% Case 0: top-left Karnaugh map + \karnaughmakemap{\kmrecursiondepth}{0}{\tempx}{\tempys}% + \karnaughmakemap{\kmrecursiondepth}{1}{\tempxs}{\tempys}% + \karnaughmakemap{\kmrecursiondepth}{2}{\tempx}{\tempy}% + \karnaughmakemap{\kmrecursiondepth}{3}{\tempxs}{\tempy}% + \or +%% Case 1: top-right Karnaugh map + \karnaughmakemap{\kmrecursiondepth}{1}{\tempxs}{\tempys}% + \karnaughmakemap{\kmrecursiondepth}{0}{\tempx}{\tempys}% + \karnaughmakemap{\kmrecursiondepth}{3}{\tempxs}{\tempy}% + \karnaughmakemap{\kmrecursiondepth}{2}{\tempx}{\tempy}% + \or +%% Case 2: bottom-left Karnaugh map + \karnaughmakemap{\kmrecursiondepth}{2}{\tempx}{\tempy}% + \karnaughmakemap{\kmrecursiondepth}{3}{\tempxs}{\tempy}% + \karnaughmakemap{\kmrecursiondepth}{0}{\tempx}{\tempys}% + \karnaughmakemap{\kmrecursiondepth}{1}{\tempxs}{\tempys}% + \or +%% Case 3: bottom-right Karnaugh map + \karnaughmakemap{\kmrecursiondepth}{3}{\tempxs}{\tempy}% + \karnaughmakemap{\kmrecursiondepth}{2}{\tempx}{\tempy}% + \karnaughmakemap{\kmrecursiondepth}{1}{\tempxs}{\tempys}% + \karnaughmakemap{\kmrecursiondepth}{0}{\tempx}{\tempys}% + \fi + \else + \node[kmcell] at (#3\kmunitlength,#4\kmunitlength){\kmgetchar};% + \node[kmindex,shift={(-0.3\kmunitlength,0.3\kmunitlength)}] at (#3\kmunitlength,#4\kmunitlength){\kmcurrentindex};% + \fi}}% +%% +%% \karnaughmaketopmark typesets the variable marks of a Karnaugh map that are +%% located on top of the diagram: +%% +\def\karnaughmaketopmark{% + \kmmarkstart=1 + \kmpoweroftwo{\kmmarkstart}{\kmxvarno} % \kmymarkstart is the start + % position for the \multiput + \kmmarklength=\kmmarkstart + \multiply\kmmarklength by 2 % \kmmarklength is the length of a mark + \kmmarkmove=\kmmarkstart + \multiply\kmmarkmove by 4 % This is the move distance for the \multiput. + \kmmarknum=\kmxsize + \divide\kmmarknum by \kmmarkmove % This is the number of repetitions for + % the \multiput. + %The highest-order variable mark needs a special treatment: + \ifnum\kmmarknum=0\kmmarknum=1\divide\kmmarklength by 2\fi + \advance\kmmarkmove by \kmmarkstart + \kmtemplength=\pgfkeysvalueof{/pgf/kmbar top sep} + \multiply \kmtemplength by \kmyvarno + \advance \kmtemplength by \pgfkeysvalueof{/pgf/kmbar sep} + \advance \kmtemplength by \kmysize\kmunitlength + \ifnum\kmmarknum=1 + \draw[kmbar,xshift=\kmmarkstart\kmunitlength,yshift=\kmtemplength] (0,0) -- node[above, kmbar label]{\kmgetchar} (\kmmarklength\kmunitlength,0); + \else + \setbox\kmbox=\hbox{\kmgetchar} + \foreach \x in {\kmmarkstart,\kmmarkmove,...,\kmxsize} + \draw[kmbar,xshift=\x\kmunitlength,yshift=\kmtemplength] (0,0) -- node[above, kmbar label]{\copy\kmbox} (\kmmarklength\kmunitlength,0); + \fi +} +%% +%% \karnaughmakeleftmark typesets the variable marks of a Karnaugh map that are +%% located on the left of the diagram: +%% +\def\karnaughmakeleftmark{% + \kmmarkstart=1 + \kmpoweroftwo{\kmmarkstart}{\kmyvarno} % \kmmarkstart is the start + % position for the \multiput + \kmmarklength=\kmmarkstart + \multiply\kmmarklength by 2 % \kmmarklength is the length of a mark + \kmmarkmove=\kmmarkstart + \multiply\kmmarkmove by 4 % This now is the move distance for the + % \multiput. + \kmmarknum=\kmysize + \divide\kmmarknum by \kmmarkmove % This now is the number of + % repetitions for the \multiput. + %The highest-order variable mark needs a special treatment: + \ifnum\kmmarknum=0\kmmarkstart=0\kmmarknum=1\divide\kmmarklength by 2\fi + \advance\kmmarkmove by \kmmarkstart + \kmtemplength=-\pgfkeysvalueof{/pgf/kmbar left sep} + \multiply \kmtemplength by \kmyvarno + \advance \kmtemplength by -\pgfkeysvalueof{/pgf/kmbar sep} + \ifnum\kmmarknum=1 + \draw[kmbar,yshift=\kmmarkstart\kmunitlength,xshift=\kmtemplength] (0,0) -- node[left,kmbar label]{\kmgetchar} (0,\kmmarklength\kmunitlength); + \else + \setbox\kmbox=\hbox{\kmgetchar} + \foreach \y in {\kmmarkstart,\kmmarkmove,...,\kmysize} + \draw[kmbar,yshift=\y\kmunitlength,xshift=\kmtemplength] (0,0) -- node[left,kmbar label]{\copy\kmbox} (0,\kmmarklength\kmunitlength); + \fi +} +%% \karnaughmakemarks calls \karnaughmaketopmark or \karnaughmakeleftmark +%% depending on whether \kmvarno is odd or even. +%% +\def\karnaughmakemarks{% + \ifnum\kmvarno>0 + \let\next=\karnaughmakemarks + \ifodd\kmvarno % We have to make a mark at the top + \advance\kmxvarno by -1 + \karnaughmaketopmark + \else % We have to make a mark at the left + \advance\kmyvarno by -1 + \karnaughmakeleftmark + \fi + \advance\kmvarno by -1 + \else + \let\next=\relax + \fi + \next +} +%% +%% \karnaughmap is the macro that a user calls if he wants to draw a +%% Karnaugh map: +%% +\def\karnaughmap#1#2#3#4#5{% +%% +%% #1 is the number of variables in the Karnaugh map +%% #2 is the identifier of the function +%% #3 is the list of identifiers of those variables +%% #4 is the list of tokens that have to be written into the map +%% + \kmvarno=#1 % \kmvarno is the total number of variables + \kmyvarno=#1 % \kmyvarno is the number of variable marks at the left + \divide\kmyvarno by 2 + \kmxvarno=#1 % \kmxvarno is the number of variable marks on top + \advance\kmxvarno by -\kmyvarno + \kmxsize=1 + \kmpoweroftwo{\kmxsize}{\kmxvarno} + \kmysize=1 + \kmpoweroftwo{\kmysize}{\kmyvarno} + \node[kmvar,above left] at (0,\kmysize\kmunitlength){#2};% + \foreach \x in {0,...,\kmxsize} + \draw[kmlines] (\x\kmunitlength,0) -- (\x\kmunitlength,\kmysize\kmunitlength); + \foreach \y in {0,...,\kmysize} + \draw[kmlines] (0,\y\kmunitlength) -- (\kmxsize\kmunitlength,\y\kmunitlength); + #5 + \kmargumentstring{#3} + \karnaughmakemarks + \pgftransformshift{\pgfpoint{0.5\kmunitlength}{0.5\kmunitlength}} + \kmvarno=#1 % \kmvarno is the total number of variables + \kmindexcounter=0 + \kmargumentstring{#4} + \karnaughmakemap{\the\kmysize}{0}{0}{0} + \ifodd\kmvarno + {\divide\kmxsize by 2 + \karnaughmakemap{\the\kmysize}{1}{\the\kmxsize}{0}} + \fi + \pgftransformreset +}% Property changes on: trunk/Master/texmf-dist/tex/latex/tikz-karnaugh/tikz-karnaugh.tex ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Modified: trunk/Master/tlpkg/bin/tlpkg-ctan-check =================================================================== --- trunk/Master/tlpkg/bin/tlpkg-ctan-check 2017-12-24 11:18:21 UTC (rev 46130) +++ trunk/Master/tlpkg/bin/tlpkg-ctan-check 2017-12-24 22:44:24 UTC (rev 46131) @@ -611,7 +611,7 @@ thumb thumbpdf thumbs thumby thuthesis ticket ticollege tikz-bayesnet tikz-cd tikz-3dplot tikz-dependency tikz-dimline - tikz-feynman tikz-inet tikz-kalender + tikz-feynman tikz-inet tikz-kalender tikz-karnaugh tikz-opm tikz-optics tikz-palattice tikz-qtree tikz-timing tikzcodeblocks tikzducks tikzinclude tikzmark tikzorbital tikzpagenodes tikzpeople tikzpfeile tikzposter tikzscale tikzsymbols Modified: trunk/Master/tlpkg/libexec/ctan2tds =================================================================== --- trunk/Master/tlpkg/libexec/ctan2tds 2017-12-24 11:18:21 UTC (rev 46130) +++ trunk/Master/tlpkg/libexec/ctan2tds 2017-12-24 22:44:24 UTC (rev 46131) @@ -1108,6 +1108,7 @@ 'ticket', "&MAKEflatten", 'ticollege', "&MAKEflatten", 'tikz-kalender',"&MAKEflatten", + 'tikz-karnaugh',"&MAKEflatten", 'time', "die 'skipping, use piff'", 'timeline', "die 'skipping, LaTeX 2.09, never in TL'", 'timescyr', "die 'skipping, monotype font is nonfree'", @@ -1840,11 +1841,12 @@ 'texosquery', '\.tex$|' . $standardtex, 'texproposal', 'NULL', 'texsis', '\.txs|TXS.*tex|texsis.tex', - 'thesis-ekf', 'images|\.cls', # not magyar.ldf + 'thesis-ekf', 'images|\.cls', # not magyar.ldf 'thesis-titlepage-fhac','LOGO.*|' .$standardtex,
- 'threeparttable',      '^..[^s].*\.sty', # not miscdoc.sty
+ 'threeparttable',      '^..[^s].*\.sty',	# not miscdoc.sty
'ticket',      '\.tdf|' . $standardtex, 'tikz-cd', 'tikz-cd.sty|tikzlibrarycd.code.tex', # not pgfmanual.sty + 'tikz-karnaugh', 'tikz-karnaugh\.tex$',
'tikz-qtree',  '(pgf|tikz-)(subpic|q?tree(-compat)?)\.(tex|sty)',
'tikzposter',  'tikzposter[^-].*\.tex|' . \$standardtex,
# tipa: we want to install all .sty except tipaman|boxchar|codelist.

Modified: trunk/Master/tlpkg/tlpsrc/collection-pictures.tlpsrc
===================================================================
--- trunk/Master/tlpkg/tlpsrc/collection-pictures.tlpsrc	2017-12-24 11:18:21 UTC (rev 46130)
+++ trunk/Master/tlpkg/tlpsrc/collection-pictures.tlpsrc	2017-12-24 22:44:24 UTC (rev 46131)
@@ -133,6 +133,7 @@
depend tikz-feynman
depend tikz-inet
depend tikz-kalender
+depend tikz-karnaugh
depend tikz-opm
depend tikz-optics
depend tikz-page