% \iffalse meta-comment
%
% Copyright (C) 2015 by Michael Vonbun <
[email protected]>
% ---------------------------------------------------------
%
% This file may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.2
% of this license or (at your option) any later version.
% The latest version of this license is in:
%
%
http://www.latex-project.org/lppl.txt
%
% and version 1.2 or later is part of all distributions of LaTeX
% version 1999/12/01 or later.
%
% \fi
%
% \iffalse
%<*driver>
\ProvidesFile{karnaughmap.dtx}
%</driver>
%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<package>\ProvidesPackage{karnaughmap}
%<*package>
[2015/04/20 v2.0 draw karnaugh maps using tikz]
%</package>
%
%<*driver>
\documentclass{ltxdoc}
\usepackage{xkvview}
\usepackage{hyperref}
\usepackage{karnaughmap}[2013/12/06]
\EnableCrossrefs
\CodelineIndex
\RecordChanges
\begin{document}
\DocInput{karnaughmap.dtx}
\PrintChanges
\PrintIndex
\end{document}
%</driver>
% \fi
%
% \CheckSum{751}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
% Digits \0\1\2\3\4\5\6\7\8\9
% Exclamation \! Double quote \" Hash (number) \#
% Dollar \$ Percent \% Ampersand \&
% Acute accent \' Left paren \( Right paren \)
% Asterisk \* Plus \+ Comma \,
% Minus \- Point \. Solidus \/
% Colon \: Semicolon \; Less than \<
% Equals \= Greater than \> Question mark \?
% Commercial at \@ Left bracket \[ Backslash \\
% Right bracket \] Circumflex \^ Underscore \_
% Grave accent \` Left brace \{ Vertical bar \|
% Right brace \} Tilde \~}
%
%
% \changes{v1.0}{2013/08/29}{Initial version}
% \changes{v1.0a}{2013/08/29}{Added a to do section}
% \changes{v1.1}{2013/08/29}{Added binary indices}
% \changes{v1.2}{2013/08/30}{Added negated labels
% and adjusted the positioning of variable and function labels.}
% \changes{v1.3}{2013/09/04}{Made the table color adjustable.}
% \changes{v1.4}{2013/12/06}{Added a colored box highlight macro.}
% \changes{v2.0}{2015/04/20}{Minor touchup for publication.}
%
% \GetFileInfo{karnaughmap.dtx}
%
% \DoNotIndex{\newcommand,\newenvironment,\else,\fi}
%
%
% \title{The \textsf{karnaughmap} package\thanks{This document
% corresponds to \textsf{karnaughmap}~\fileversion, dated \filedate.}}
% \author{Michael Vonbun \\ \texttt{
[email protected]}}
%
% \maketitle
%
% \section{Introduction}% \iffalse TODO: SEC:Intoduction \fi
%
% This package uses TikZ to typeset Karnaugh maps in an easy way.
% Though the map size is restricted to four variables (as for \fileversion),
% it is easier and customizable compared to \textsf{karnaugh.tex}.
%
% \section{Installation}% \iffalse TODO: SEC:Installation \fi
%
% Install this package like any other \LaTeX~package.\\
%
% \noindent
% The end of this file contains the installation file (.ins) code in case
% the provided ins-file got lost.\\
%
% \noindent
% For style creation run |latex karnaughmap.ins|.
% For doc/manual creation run |latex karnaughmap.dtx| afterwards.
%
% \section{Dependencies}% \iffalse TODO: SEC:Dependencies \fi
%
% As of \textsf{karnaughmap}~\fileversion~this package depends on
% \begin{itemize}
% \item \textsf{tikz}
% \item \textsf{xkeyval}
% \item \textsf{ifthen}
% \item \textsf{xstring}
% \end{itemize}
%
% \section{Usage}% \iffalse TODO: SEC:Usage \fi
%
% \subsection{Karnaugh Map Macros}% \iffalse TODO: SUBSEC:Karnaugh Map Macros \fi
%
% \DescribeMacro{\karnaughmap} |\karnaughmap|\oarg{key=value}\marg{entries}
%
% Use this macro inside of a |tikzpicture|-environment to typeset a Karnaugh map
% of a corresponding truth table.\\
%
% \paragraph{Example}
% Assume the truth table with inputs $a$ and $b$ and output $z$ is
% \begin{center}
% \begin{tabular}{ccc}
% $a$ & $b$ & $z$ \\\hline
% 0 & 0 & 0 \\
% 0 & 1 & 0 \\
% 1 & 0 & * \\
% 1 & 1 & 1
% \end{tabular}
% \end{center}
%
% \begin{minipage}[t]{0.45\textwidth}%
% Then, the corresponding Karnaugh map with default layout is:\\
% \begin{tikzpicture}[thick]
% \karnaughmap{00*1}
% \end{tikzpicture}\\
% \end{minipage}
% \hfill
% \begin{minipage}[t]{0.45\textwidth}%
% Which was typeset using:\\
% |\begin{tikzpicture}[thick] |\\
% | \karnaughmap{00*1} |\\
% |\end{tikzpicture} |
% \end{minipage}
%
% To produce empty maps, there are two possibilities.
% First is to use the key |defaultmap| described later and omit the mandatory input,
% the second is by providing a scalar mandatory argument that is equal the number of cells desired,
% i.e. 4,8, or 16.
%
% \begin{minipage}[t]{0.45\textwidth}%
% \begin{center}
% |\karnaughmap{4}|\\
% \begin{tikzpicture}[thick]
% \karnaughmap{4}
% \end{tikzpicture}\\
% \end{center}
% \end{minipage}
% \hfill
% \begin{minipage}[t]{0.45\textwidth}%
% \begin{center}
% |\karnaughmap[defaultmap=4]{}|\\
% \begin{tikzpicture}[thick]
% \karnaughmap[defaultmap=4]{}
% \end{tikzpicture}\\
% \end{center}
% \end{minipage}\\
%
% \medskip
%
% Note that it is also possible to provide the input string with blanks:
%
% \noindent
% |\begin{tikzpicture}[thick]|\\
% | \karnaughmap{1100 0101}|\\
% |\end{tikzpicture}|\\
%
% \begin{center}
% \begin{tikzpicture}[thick]
% \karnaughmap{1100 0101}
% \end{tikzpicture}\\
% \end{center}
%
% This is especially useful when larger maps are typeset as it increases
% readability of the \LaTeXe code.\\
%
%
% \DescribeMacro{\karnaughmapcolorfield} |\karnaughmapcolorfield|\oarg{key=value}\marg{map size}\marg{field string}\marg{color}
%
% Use this macro inside of a |tikzpicture|-environment to color a Karnaugh map of size |map size|.
% Use hexadecimal values to address a certain field of the map in the |field string|.\\
%
% \noindent
% |\begin{tikzpicture}[thick]|\\
% |\karnaughmapcolorfield{2}{01}{teal!50}%|\\
% |\karnaughmapcolorfield{2}{3}{violet!50}%|\\
% |\karnaughmap{4}|\\
% |\end{tikzpicture}|\\
%
% \begin{center}
% \begin{tikzpicture}[thick]
% \karnaughmapcolorfield{2}{01}{teal!50}%
% \karnaughmapcolorfield{2}{3}{violet!50}%
% \karnaughmap{4}
% \end{tikzpicture}\\
% \end{center}%
%
% The keys for this macro allow for two different styles:
% \emph{filled} |fill| and \emph{outlined} |outline|.
% The default is filled.
% In addition, TikZ keys are forwarded to the |\draw| or |\fill| command,
% allowing a good adjustment of styles.\\
%
% \noindent
% |\begin{tikzpicture}[thick]|\\
% |\karnaughmapcolorfield[outline]{2}{01}{teal!50}%|\\
% |\karnaughmapcolorfield[outline,ultra thick]{2}{3}{violet!50}%|\\
% |\karnaughmap{4}|\\
% |\end{tikzpicture}|\\
%
% \begin{center}
% \begin{tikzpicture}[thick]
% \karnaughmapcolorfield[outline]{2}{01}{teal!50}%
% \karnaughmapcolorfield[outline,ultra thick]{2}{3}{violet!50}%
% \karnaughmap{4}
% \end{tikzpicture}\\
% \end{center}%
%
%
%
%
%
%
%
% \subsection{Style Customizations}% \iffalse TODO: SUBSEC:Style Customizations \fi
%
% For style customization a key-value system is provided.
%
% \DescribeMacro{\setkarnaughmap} |\setkarnaughmap|\oarg{key=value}
% This is the interface function for setting the keys.
% To restore the defaults call |\setkarnaughmap|.
%
% The defaults are\\
% | \setkarnaughmap[omitzeros, defaultmap=16, |\\
% | function=z, variables=abcd, dontcare=*]|.
%
% \paragraph{Key-Value List} The following table is an overview over all options provided.
% The exact behavior and description of the keys are described below.
%
% \xkvview{family=karnaughmap}
%
% \paragraph{Selective Entry Printing}
% The following keys control the printing of different types of Karnaugh map cell entries.
%
% \DescribeMacro{omitzeros} |omitzeros|\oarg{=\textbf{true}/false}
% Toggle between printing and omitting zero-valued entries in the Karnaugh map.
% \begin{center}
% |\karnaughmap[omitzeros=false]{00*1}|\\
% \begin{tikzpicture}[thick]
% \karnaughmap[omitzeros=false]{00*1}
% \end{tikzpicture}\\
% \end{center}
%
% \DescribeMacro{omitones} |omitones|\oarg{=true/\textbf{false}}
% Toggle between printing and omitting one-valued entries in the Karnaugh map.
% \begin{center}
% |\karnaughmap[omitzeros=false,omitones]{00*1}|\\
% \begin{tikzpicture}[thick]
% \karnaughmap[omitzeros=false,omitones]{00*1}
% \end{tikzpicture}\\
% \end{center}
%
% \DescribeMacro{omitdontcares} |omitdontcares|\oarg{=true/\textbf{false}}
% Toggle between printing and omitting don't care entries in the Karnaugh map.
% \begin{center}
% |\karnaughmap[omitzeros=false,omitdontcares]{00*1}|\\
% \begin{tikzpicture}[thick]
% \karnaughmap[omitzeros=false,omitdontcares]{00*1}
% \end{tikzpicture}\\
% \end{center}
%
% \paragraph{Karnaugh Map Style}
% The following keys control the printing of different types of Karnaugh map labels.
%
% \DescribeMacro{omitbinaries} |omitbinaries|\oarg{true/\textbf{false}}
% Toggle between printing and omitting the binary encoding on top and left of the Karnaugh map.
% \begin{center}
% |\karnaughmap[omitbinaries]{00*1}|\\
% \begin{tikzpicture}[thick]
% \karnaughmap[omitbinaries]{00*1}
% \end{tikzpicture}\\
% \end{center}
%
% \DescribeMacro{omitvariables} |omitvariables|\oarg{=true/\textbf{false}}
% Toggle between printing and omitting the variable labeling of rows and columns around the Karnaugh map.
% \begin{center}
% |\karnaughmap[omitvariables]{00*1}|\\
% \begin{tikzpicture}[thick]
% \karnaughmap[omitvariables]{00*1}
% \end{tikzpicture}\\
% \end{center}
%
% \DescribeMacro{omitidx} |omitidx|\oarg{=true/\textbf{false}}
% Toggle between printing and omitting index values besides the cell entries in the Karnaugh map.
% \begin{center}
% |\karnaughmap[omitidx]{00*1}|\\
% \begin{tikzpicture}[thick]
% \karnaughmap[omitidx]{00*1}
% \end{tikzpicture}\\
% \end{center}
%
% \DescribeMacro{binaryidx} |binaryidx|\oarg{=true/\textbf{false}}
% Toggle between decimal and binary indices.
% \begin{center}
% |\karnaughmap[binaryidx]{00*1}|\\
% \begin{tikzpicture}[thick]
% \karnaughmap[binaryidx]{00*1}
% \end{tikzpicture}\\
% \end{center}
%
% \DescribeMacro{omitnegated} |omitnegated|\oarg{=\textbf{true}/false}
% Toggle between typesetting the negated in addition to the non-negated variable labels.
% \begin{center}
% |\karnaughmap[omitnegated=false]{00*1}|\\
% \begin{tikzpicture}[thick]
% \karnaughmap[omitnegated=false]{00*1}
% \end{tikzpicture}\\
% \end{center}
%
% \paragraph{Map Customizations}
% The following keys can be used to customize the Karnaugh maps in various ways.
%
% \DescribeMacro{defaultmap} |defaultmap|\oarg{=\textbf{16}}
% Set the default map size (4,8, or 16), i.e. this map size is used if the mandatory argument of
% |\karnaughmap{}| is empty. Thus, empty maps can be produced.
% \begin{center}
% |\karnaughmap[defaultmap=4]{}|, |\karnaughmap[defaultmap=8]{}|\\
% \begin{tikzpicture}[thick]
% \karnaughmap[defaultmap=4]{}
% \end{tikzpicture}
% \begin{tikzpicture}[thick]
% \karnaughmap[defaultmap=8]{}
% \end{tikzpicture}\\
% \end{center}
% Note that the same functionality can be achieved by providing a scalar mandatory input
% \begin{center}
% |\karnaughmap{4}|, |\karnaughmap[defaultmap=8]{}|\\
% \begin{tikzpicture}[thick]
% \karnaughmap{4}
% \end{tikzpicture}
% \begin{tikzpicture}[thick]
% \karnaughmap{8}
% \end{tikzpicture}\\
% \end{center}
%
% \DescribeMacro{function} |function|\oarg{=\textbf{z}}
% Set the function label used to label the Karnaugh map.
% \begin{center}
% |\karnaughmap[function={f(a,b)}]{00*1}|\\
% \begin{tikzpicture}[thick]
% \karnaughmap[function={f(a,b)}]{00*1}
% \end{tikzpicture}\\
% \end{center}
% \begin{center}
% |\karnaughmap[function=]{00*1}|\\
% \begin{tikzpicture}[thick]
% \karnaughmap[function=]{00*1}
% \end{tikzpicture}\\
% \end{center}
%
% \DescribeMacro{variables} |variables|\oarg{=\textbf{abcd}}
% Set the variable names used in the Karnaugh map.
% Note that you have to provide a single string of variables
% or variables embraced by curly braces.
% \begin{center}
% |\karnaughmap[variables=kl]{00*1}|\\
% \begin{tikzpicture}[thick]
% \karnaughmap[variables=kl]{00*1}
% \end{tikzpicture}\\
% \end{center}
%
% \begin{center}
% |\karnaughmap[variables={{s_2}{s_1}{s_0}{a}}]{01** 10** 0101 **00}|\\
% \begin{tikzpicture}[thick]
% \karnaughmap[variables={{s_2}{s_1}{s_0}{a}}]{01** 10** 0101 **00}
% \end{tikzpicture}\\
% \end{center}
%
%
%
% \DescribeMacro{dontcare} |dontcare|\oarg{=\textbf{*}}
% Set the don't care character.
% This is only needed if you provide the |omitdontcares| key and use
% don't care characters other than |*| in the |\karnaughmap{x}| inputstring.
% \begin{center}
% |\karnaughmap[dontcare=X,omitdontcares,omitzeros=false]{00X1}|\\
% \begin{tikzpicture}[thick]
% \karnaughmap[dontcare=X,omitdontcares,omitzeros=false]{00X1}
% \end{tikzpicture}\\
% \end{center}
%
% \DescribeMacro{color} |color|\oarg{=\textbf{black}}
% Set the color of the \emph{entire} Karnaugh map, including labels, entries, etc.
% \begin{center}
% |\karnaughmap[color=teal]{00*1}|\\
% \begin{tikzpicture}[thick]
% \karnaughmap[color=teal]{00*1}
% \end{tikzpicture}\\
% \end{center}
%
% \DescribeMacro{draw} |draw|\oarg{=\textbf{same as color}}
% Set the color of the Karnaugh map \emph{only}, i.e. the lines that are drawn.
% The labels are not affected.
% \begin{center}
% |\karnaughmap[draw=teal]{00*1}|\\
% \begin{tikzpicture}[thick]
% \karnaughmap[draw=teal]{00*1}
% \end{tikzpicture}\\
% \end{center}
%
% \DescribeMacro{labelcolor} |labelcolor|\oarg{=\textbf{same as color}}
% Set the color of the labels of the Karnaugh map \emph{only}.
% The lines are not affected.
% \begin{center}
% |\karnaughmap[labelcolor=teal]{00*1}|\\
% \begin{tikzpicture}[thick]
% \karnaughmap[labelcolor=teal]{00*1}
% \end{tikzpicture}\\
% \end{center}
%
% \paragraph{Multiple Karnaugh Maps in one TikZ Picture}
% To typeset more than one Karnaugh map into one TikZ Picture,
% use |xshift| and |yshift|, just as usual n TikZ.
%
% \DescribeMacro{xshift} |xshift|\oarg{=\textbf{0}}
% Shift the Karnaugh map in x-direction within the TikZ picture.
% \begin{center}
% |\karnaughmap{4}\karnaughmap[xshift=5cm]{4}|\\
% \begin{tikzpicture}[thick]
% \karnaughmap{4}
% \karnaughmap[xshift=5cm]{4}
% \end{tikzpicture}\\
% \end{center}
%
% \DescribeMacro{yshift} |yshift|\oarg{=\textbf{0}}
% Shift the Karnaugh map in x-direction within the TikZ picture.
% \begin{center}
% |\karnaughmap{4}\karnaughmap[yshift=5cm]{4}|\\
% \begin{tikzpicture}[thick]
% \karnaughmap{4}
% \karnaughmap[yshift=5cm]{4}
% \end{tikzpicture}\\
% \end{center}
%
% \section{Examples}% \iffalse TODO: SEC:Examples \fi
% \subsection{Basic Usage Examples:}% \iffalse TODO: SUBSEC:Basic Examples \fi
% \begin{center}
% |\karnaughmap[defaultmap=16,binaryidx,omitnegated=false]{}|\\
% \begin{tikzpicture}[thick]
% \karnaughmap[defaultmap=16,binaryidx,omitnegated=false,function={f(a,b,c,d)}]{}
% \end{tikzpicture}\\
% \end{center}
%
% \begin{center}
% |\karnaughmap[defaultmap=4,binaryidx,omitnegated=false,color=teal]{}|\\
% \begin{tikzpicture}[thick]
% \karnaughmap[defaultmap=4,binaryidx,omitnegated=false,color=teal]{}
% \end{tikzpicture}\\
% \end{center}
%
%
% \noindent
% |\karnaughmap{4}|
% \begin{center}
% \begin{tikzpicture}[thick]
% \karnaughmap{4}
% \end{tikzpicture}\\
% \end{center}
%
%
% \subsection{Field coloring}% \iffalse TODO: SUBSEC:Field Coloring \fi
% \noindent
% |\begin{tikzpicture}[thick]|\\
% |\foreach \x [count=\xi] in {0,1,2,3} {%|\\
% | \pgfmathparse{-20+30*\xi}%|\\
% | \karnaughmapcolorfield{2}{\x}{teal!\pgfmathresult}%|\\
% |}%|\\
% |\karnaughmap{2}|\\
% |\end{tikzpicture}|\\
%
% \begin{center}
% \begin{tikzpicture}[thick]
% \foreach \x [count=\xi] in {0,1,2,3} {%
% \pgfmathparse{-20+30*\xi}
% \karnaughmapcolorfield{2}{\x}{teal!\pgfmathresult}%
% }%
% \karnaughmap{4}
% \end{tikzpicture}\\
% \end{center}
%
%
% \noindent
% |\begin{tikzpicture}[thick]|\\
% |\foreach \x [count=\xi] in {0,1,2,3} {%|\\
% | \pgfmathparse{-20+30*\xi}%|\\
% | \karnaughmapcolorfield{3}{\x}{teal!\pgfmathresult}%|\\
% |}%|\\
% |\foreach \x [count=\xi] in {4,5,6,7} {%|\\
% | \pgfmathparse{-20+30*\xi}%|\\
% | \karnaughmapcolorfield{3}{\x}{purple!\pgfmathresult}%|\\
% |}%|\\
% |\karnaughmap{8}|\\
% |\end{tikzpicture}|\\
%
% \begin{center}
% \begin{tikzpicture}[thick]
% \foreach \x [count=\xi] in {0,1,2,3} {%
% \pgfmathparse{-20+30*\xi}%
% \karnaughmapcolorfield{3}{\x}{teal!\pgfmathresult}%
% }%
% \foreach \x [count=\xi] in {4,5,6,7} {%
% \pgfmathparse{-20+30*\xi}%
% \karnaughmapcolorfield{3}{\x}{purple!\pgfmathresult}%
% }%
% \karnaughmap{8}
% \end{tikzpicture}\\
% \end{center}
%
%
% \noindent
% |\begin{tikzpicture}[thick]|\\
% |\foreach \x [count=\xi] in {0,1,2,3} {%|\\
% | \pgfmathparse{-20+30*\xi}%|\\
% | \karnaughmapcolorfield{4}{\x}{teal!\pgfmathresult}%|\\
% |}%|\\
% |\foreach \x [count=\xi] in {4,5,6,7} {%|\\
% | \pgfmathparse{-20+30*\xi}%|\\
% | \karnaughmapcolorfield{4}{\x}{purple!\pgfmathresult}%|\\
% |}%|\\
% |\foreach \x [count=\xi] in {8,9,a,b} {%|\\
% | \pgfmathparse{-20+30*\xi}%|\\
% | \karnaughmapcolorfield{4}{\x}{olive!\pgfmathresult}%|\\
% |}%|\\
% |\foreach \x [count=\xi] in {c,d,e,f} {%|\\
% | \pgfmathparse{-20+30*\xi}%|\\
% | \karnaughmapcolorfield{4}{\x}{violet!\pgfmathresult}%|\\
% |}%|\\
% |\karnaughmap[defaultmap=16]{}%|\\
% |\end{tikzpicture}|\\
%
% \begin{center}
% \begin{tikzpicture}[thick]
% \foreach \x [count=\xi] in {0,1,2,3} {%
% \pgfmathparse{-20+30*\xi}%
% \karnaughmapcolorfield{4}{\x}{teal!\pgfmathresult}%
% }%
% \foreach \x [count=\xi] in {4,5,6,7} {%
% \pgfmathparse{-20+30*\xi}%
% \karnaughmapcolorfield{4}{\x}{purple!\pgfmathresult}%
% }%
% \foreach \x [count=\xi] in {8,9,a,b} {%
% \pgfmathparse{-20+30*\xi}%
% \karnaughmapcolorfield{4}{\x}{olive!\pgfmathresult}%
% }%
% \foreach \x [count=\xi] in {c,d,e,f} {%
% \pgfmathparse{-20+30*\xi}%
% \karnaughmapcolorfield{4}{\x}{violet!\pgfmathresult}%
% }%
% \karnaughmap[defaultmap=16]{}
% \end{tikzpicture}\\
% \end{center}
%
%
% \section{Field Allocation Reference}\iffalse TODO: SEC: Field Alloc Reference \fi
% This package provides maps with full control up to \emph{4} variables,
% which is equivalent to a map size of \emph{16} fields.\\
% For bigger maps, the package provides just basic typesetting,
% i.e. just the column and row encoding and the, possibly filled matrix.\\
% However, the biggest map supported yet has 256 fields.\\
%
% The reference can be read as follows:
% the first row contains the value of the rows,
% the columns are then likewise enumerated.
% By this procedure, you can check if everything went right (debugging)
% and got an easy reference.
%
% \subsection{2 Variables -- 4 Fields}
% \noindent
% |\begin{tikzpicture}[thick]|\\
% | \karnaughmap[variables=ab]{o1 11 }|\\
% |\end{tikzpicture}|
%
% \begin{tikzpicture}[thick]
% \karnaughmap[variables=ab]{o1 11 }
% \end{tikzpicture}
%
%
% \subsection{3 Variables -- 8 Fields}
% \noindent
% |\begin{tikzpicture}[thick]|\\
% | \karnaughmap[variables=abc]{o1 11 21 31 }|\\
% |\end{tikzpicture}|
%
% \begin{tikzpicture}[thick]
% \karnaughmap[variables=abc]{o1 11 21 31 }
% \end{tikzpicture}
%
%
% \subsection{4 Variables -- 16 Fields}
% \noindent
% |\begin{tikzpicture}[thick]|\\
% | \karnaughmap[variables=abcd]{o123 1123 2123 3123 }|\\
% |\end{tikzpicture}|
%
% \begin{tikzpicture}[thick]
% \karnaughmap[variables=abcd]{o123 1123 2123 3123 }
% \end{tikzpicture}
%
%
% \subsection{5 Variables -- 32 Fields}
% \noindent
% |\begin{tikzpicture}[thick]|\\
% | \karnaughmap[variables=abcde]{0000 0001 0010 0011 0100 0101 0110 1111}|\\
% |\end{tikzpicture}|
%
% \begin{tikzpicture}[thick]
% \karnaughmap[variables=abcde]{o123 1123 2123 3123 4123 5123 6123 7123}
% \end{tikzpicture}
%
%
% \subsection{6 Variables -- 64 Fields}
% \noindent
% |\begin{tikzpicture}[thick]|\\
% | \karnaughmap[variables=abcdef]{o1234567 11234567 21234567 31234567 |\\
% | 41234567 51234567 61234567 71234567 }|\\
% |\end{tikzpicture}|
%
% \begin{tikzpicture}[thick]
% \karnaughmap[variables=abcdef]{o1234567 11234567 21234567 31234567
% 41234567 51234567 61234567 71234567 }
% \end{tikzpicture}
%
%
% \subsection{7 Variables -- 128 Fields}
% \noindent
% |\begin{tikzpicture}[thick]|\\
% | \karnaughmap[variables=abcdefg]{o1234567 11234567 21234567 31234567 |\\
% | 41234567 51234567 61234567 71234567 |\\
% | 81234567 91234567 a1234567 b1234567 |\\
% | c1234567 d1234567 e1234567 f1234567 }|\\
% |\end{tikzpicture}|
%
% \hspace*{-4cm}
% \begin{tikzpicture}[thick]
% \karnaughmap[variables=abcdefg]{o1234567 11234567 21234567 31234567
% 41234567 51234567 61234567 71234567
% 81234567 91234567 a1234567 b1234567
% c1234567 d1234567 e1234567 f1234567 }
% \end{tikzpicture}
%
%
% \subsection{8 Variables -- 256 Fields}
% \noindent
% |\begin{tikzpicture}[thick]|\\
% | \karnaughmap[variables=abcdefg]{o123456789abcdef 1123456789abcdef |\\
% | 2123456789abcdef 3123456789abcdef |\\
% | 4123456789abcdef 5123456789abcdef |\\
% | 6123456789abcdef 7123456789abcdef |\\
% | 8123456789abcdef 9123456789abcdef |\\
% | a123456789abcdef b123456789abcdef |\\
% | c123456789abcdef d123456789abcdef |\\
% | e123456789abcdef f123456789abcdef }|\\
% |\end{tikzpicture}|
%
% \hspace*{-4cm}
% \begin{tikzpicture}[thick]
% \karnaughmap[variables=abcdefg]{o123456789abcdef 1123456789abcdef 2123456789abcdef 3123456789abcdef
% 4123456789abcdef 5123456789abcdef 6123456789abcdef 7123456789abcdef
% 8123456789abcdef 9123456789abcdef a123456789abcdef b123456789abcdef
% c123456789abcdef d123456789abcdef e123456789abcdef f123456789abcdef }
% \end{tikzpicture}
%
%
%
%
%
%
% \section{Macros for Internal Usage}% \iffalse TODO: SEC:Macros for Internal Usage \fi
% These macros are not intended to be used by the user,
% rather these are auxiliary functions invoked by the main macro |\karnaughmap{x}|.
%
% Nevertheless, for documentation these macros are described here briefly.
%
%
% \StopEventually{}
%
% \section{Implementation}% \iffalse TODO: SEC:Implementation \fi
%
% \subsection{Load Dependencies}% \iffalse TODO: SUBSEC:Load Dependencies \fi
% \begin{macrocode}
\RequirePackage{tikz}
\RequirePackage{xkeyval}
\RequirePackage{ifthen}
\RequirePackage{xstring}
% \end{macrocode}
%
% \subsection{Allocate Counters}% \iffalse TODO: SUBSEC:Allocate Counters \fi
% \begin{macrocode}
\newcounter{karnaughmapIdxCounter}
\newcounter{karnaughmapStrCounter}
\setcounter{karnaughmapIdxCounter}{0}
\setcounter{karnaughmapStrCounter}{0}
% \end{macrocode}
%
% \subsection{Key-Val Interface}% \iffalse TODO: SUBSEC:Key-Val Interface \fi
% \paragraph{Switches}
% Simple switches are used to control basic layout options of the Karnaugh map.\\
%
% These boolean switches control if specific entries
% -- i.e. zeros, ones, and don't cares -- are printed or not (omitted).
% \begin{macrocode}
\define@boolkeys{karnaughmap}{omitzeros, omitones, omitdontcares}[true]
% \end{macrocode}
%
% These boolean switches control the layout of the Karnaugh map.
% The |omitbinaries| switch is used to control if binary encoding is typeset left and on top of the Karnaugh map.
% The |omitvariables| switch is used to control if the Karnaugh map is labeled with the variables.
% The |omitidx| switch controls the typesetting of decimal indices within the cells of the Karnaugh map.
% The |binaryidx| switch controls whether the indices are decimal or binary.
% The |omitnegated| switch controls whether the negated variable labels are typeset as well.
% \begin{macrocode}
\define@boolkeys{karnaughmap}{omitbinaries, omitvariables, omitidx, binaryidx, omitnegated}[true]
% \end{macrocode}
%
% These boolean switches control the behavior of the highlighting function.
%
% \begin{macrocode}
\define@boolkey{karnaughmap}{outline}[true]{\setkeys{karnaughmap}{fill=false}}
\define@boolkeys{karnaughmap}{fill}[true]
\define@cmdkey{karnaughmap}{opacity}[0.5]{}
% \end{macrocode}
%
% \paragraph{Customizations}
% In contrast to the boolean switches these keys are used to customize the Karnaugh map.\\
%
% This key controls the default size of the Karnaugh map.
% It is set to 16, i.e. a 4 variable map is typeset.
% \begin{macrocode}
\define@cmdkey{karnaughmap}{defaultmap}[16]{}
% \end{macrocode}
%
% This key controls the Karnaugh map function label.
% The default is 'z'.
% \begin{macrocode}
\define@cmdkey{karnaughmap}{function}[z]{}
% \end{macrocode}
%
% This key controls the variables.
% Provide the variables as a string.
% Maybe more control over variables will be added in a later version.
% The default is 'abcd'
% \begin{macrocode}
\define@cmdkey{karnaughmap}{variables}[abcd]{}
% \end{macrocode}
%
% Define the standard "`Don't Care"' character.
% The default is '*'.
% \begin{macrocode}
\define@cmdkey{karnaughmap}{dontcare}[*]{}
% \end{macrocode}
%
% Define the color.
% For desired functionality both the draw and color have to be set.
% \begin{macrocode}
\define@key{karnaughmap}{color}[black]{%
\colorlet{karnaughmapColor}{#1}%
\colorlet{karnaughmapMapColor}{#1}}
% \end{macrocode}
%
% Define the draw color, i.e. the color of the map itself.
% Default is the same as color.
% \begin{macrocode}
\define@key{karnaughmap}{draw}[karnaughmapColor]{\colorlet{karnaughmapMapColor}{#1}}
% \end{macrocode}
%
% Define the label color.
% By setting the color only, the draw remains unchanged.
% \begin{macrocode}
\define@key{karnaughmap}{labelcolor}[karnaughmapColor]{%
\colorlet{karnaughmapColor}{#1}}
% \end{macrocode}
%
% Define the shifts.
% \begin{macrocode}
\define@cmdkeys{karnaughmap}{xshift,yshift}[0]
% \end{macrocode}
%
% \paragraph{Set Key Defaults}
% The default is a map with full information,
% i.e. binary and variable labels as well as decimal indices.
% The zeros are omitted by default.\\
%
% \begin{macro}{\setkarnaughmap}
% Simple interface function.
% \begin{macrocode}
\newcommand{\setkarnaughmap}[1][]{%
\ifthenelse{\equal{#1}{}}{%
% \end{macrocode}
%
% Change the default behavior by uncommenting the specific key.
% \begin{macrocode}
\setkeys{karnaughmap}{%
% \end{macrocode}
% omitones,
% omitdontcares,
% omitbinaries,
% omitvariables,
% omitidx,
% binaryidx
% \begin{macrocode}
omitzeros, omitnegated}
% \end{macrocode}
%
% The key-definition defaults are assigned here.
% See the definition of the keys above for the defaults.
% \begin{macrocode}
\setkeys{karnaughmap}{defaultmap, function, variables, dontcare, color, draw, labelcolor, xshift, yshift}
% \end{macrocode}
%
% If the optional input is provided set the keys accordingly.
% \begin{macrocode}
}{
\setkeys{karnaughmap}{#1}
}}
% \end{macrocode}
% \end{macro}
%
% Assign the defaults during style file call.
% \begin{macrocode}
\setkarnaughmap
% \end{macrocode}
%
%
%
% \subsection{Auxiliary Functions}% \iffalse TODO: SUBSEC:Auxiliary Functions \fi
% These function are called by the main function to facilitate code execution.
%
% \begin{macro}{\karnaughmapPrintIndex}
% |\karnaughmapPrintIndex|\oarg{numBits}
%
% This macro typesets the indices inside the cells.
% If the switch |binaryidx| is true binary instead of decimal indices are typeset.
% The number provided as optional argument is used to determine the number of bits used.
%
% Every time the macro is called, it prints the counter value
% of counter |karnaughmapIdxCounter| and increments the counter thereafter.
%
% The size of the indices is very small (scriptsize).
% \begin{macrocode}
\newcommand{\karnaughmapPrintIndex}[1][4]{%
\scriptsize%
\ifKV@karnaughmap@binaryidx
% \end{macrocode}
%
% Typeset binary indices.
% \begin{macrocode}
\ifthenelse{\equal{#1}{2}}{%
\ifcase\value{karnaughmapIdxCounter}%
00\or 01\or 10\or 11
\fi
}{}%
\ifthenelse{\equal{#1}{3}}{%
\ifcase\value{karnaughmapIdxCounter}%
000\or 001\or 010\or 011\or 100\or 101\or 110\or 111
\fi
}{}%
\ifthenelse{\equal{#1}{4}}{%
\ifcase\value{karnaughmapIdxCounter}%
0000\or 0001\or 0010\or 0011\or 0100\or 0101\or 0110\or 0111\or
1000\or 1001\or 1010\or 1011\or 1100\or 1101\or 1110\or 1111
\fi
}{}%
\else
% \end{macrocode}
%
% Typeset decimal indices.
% \begin{macrocode}
$\thekarnaughmapIdxCounter$%
\fi
\stepcounter{karnaughmapIdxCounter}%
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\karnaughmapPrintValue}
% |\karnaughmapPrintValue|\marg{inputstring}
%
% This macro typesets the entries of the Karnaugh map.
% Every time the macro is called, it increments the counter |karnaughmapStrCounter|
% and prints the character at position of the counter value of its mandatory input.
% \begin{macrocode}
\newcommand{\karnaughmapPrintValue}[2][]{%
\stepcounter{karnaughmapStrCounter}%
\StrChar{#2}{\thekarnaughmapStrCounter}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\karnaughmapPrintCellContents}
% |\karnaughmapPrintCellContents|\oarg{node-position}\marg{x-offset}\marg{y-offset}\\
% \marg{size}\marg{rowsize}\marg{function}
%
% This macro is used to provide the positions of the cells of the map,
% as they are not straight forward (e.g. order is 0-1-3-2 for first column of 4x4 maps).
% It takes 5 mandatory and one optional arguments as specified above.
%
% By default, it evaluates |function| as contents of a node at the top left
% of each cell of a Karnaugh map of size |size| with |rowsize| rows.
% By providing the bias (x- and y-offset), the provided point is shifted accordingly.
% The alignment of the node is controlled by the optional argument.
% \begin{macrocode}
\newcommand{\karnaughmapPrintCellContents}[6][]{%
% \end{macrocode}
% If map is 2x2, the order is pretty simple:\\
% 0 2 \\
% 1 3
% \begin{macrocode}
\ifthenelse{\equal{#4}{4}}{%
\def\karnaughmapPCCColumnSpecifier{++( 0,-1) node[#1] {#6}}%
\path (0, #5)
++(#2,#3) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(+1,+1) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
;
}{}
% \end{macrocode}
% If map is 2x4, the order is more complex:\\
% 0 2 6 4 \\
% 1 3 7 5
% \begin{macrocode}
\ifthenelse{\equal{#4}{8}}{%
\def\karnaughmapPCCColumnSpecifier{++( 0,-1) node[#1] {#6}}%
\path (0, #5)
++(#2,#3) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(+1,+1) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(+2,+1) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(-1,+1) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
;
}{}
% \end{macrocode}
% If map is 4x4, the same ordering as before is present in both x- and y-direction:\\
% 0 4 12 8 \\
% 1 5 13 9 \\
% 3 7 15 11 \\
% 2 6 14 10
% \begin{macrocode}
\ifthenelse{\equal{#4}{16}}{%
\def\karnaughmapPCCColumnSpecifier{%
++( 0,-1) node[#1] {#6}
++( 0,-2) node[#1] {#6}
++( 0,+1) node[#1] {#6}
}%
\path (0, #5)
++(#2,#3) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(+1,+2) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(+2,+2) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(-1,+2) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
;
}{}
% \end{macrocode}
%
% If map is 4x8, the ordering as before has to be extended in x-direction,
% but from the middle in reverse order:\\
% 0 4 12 8 24 28 20 16 \\
% 1 5 13 9 25 29 21 17 \\
% 3 7 15 11 27 31 23 29 \\
% 2 6 14 10 26 30 22 18
% \begin{macrocode}
\ifthenelse{\equal{#4}{32}}{%
\def\karnaughmapPCCColumnSpecifier{%
++( 0,-1) node[#1] {#6}
++( 0,-2) node[#1] {#6}
++( 0,+1) node[#1] {#6}
}%
\path (0, #5)
++(#2,#3) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(+1,+2) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(+2,+2) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(-1,+2) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(+5,+2) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(-1,+2) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(-2,+2) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(+1,+2) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
;
}{}
% \end{macrocode}
%
% If map is 8x8, the ordering as before has to be extended in y-direction, too.\\
% 0 8 24 16 48 56 40 32 \\
% 1 9 25 17 49 57 41 33 \\
% 3 11 27 19 51 59 43 35 \\
% 2 10 26 18 50 58 42 34 \\
% 6 14 30 22 54 62 46 38 \\
% 7 15 31 23 55 63 47 39 \\
% 5 13 29 21 53 61 45 37 \\
% 4 12 28 20 52 60 44 36
% \begin{macrocode}
\ifthenelse{\equal{#4}{64}}{%
\def\karnaughmapPCCColumnSpecifier{%
++( 0,-1) node[#1] {#6}
++( 0,-2) node[#1] {#6}
++( 0,+1) node[#1] {#6}
++( 0,-5) node[#1] {#6}
++( 0,+1) node[#1] {#6}
++( 0,+2) node[#1] {#6}
++( 0,-1) node[#1] {#6}
}%
\path (0, #5)
++(#2,#3) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(+1,+5) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(+2,+5) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(-1,+5) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(+5,+5) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(-1,+5) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(-2,+5) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(+1,+5) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
;
}{}
% \end{macrocode}
%
% If map is 8x16, the ordering is:\\
% 0 8 24 16 48 56 40 32 \\
% 1 9 25 17 49 57 41 33 \\
% 3 11 27 19 51 59 43 35 \\
% 2 10 26 18 50 58 42 34 \\
% 6 14 30 22 54 62 46 38 \\
% 7 15 31 23 55 63 47 39 \\
% 5 13 29 21 53 61 45 37 \\
% 4 12 28 20 52 60 44 36
% \begin{macrocode}
\ifthenelse{\equal{#4}{128}}{%
\def\karnaughmapPCCColumnSpecifier{%
++( 0,-1) node[#1] {#6}
++( 0,-2) node[#1] {#6}
++( 0,+1) node[#1] {#6}
++( 0,-5) node[#1] {#6}
++( 0,+1) node[#1] {#6}
++( 0,+2) node[#1] {#6}
++( 0,-1) node[#1] {#6}
}%
\path (0, #5)
++(#2,#3) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(+1,+5) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(+2,+5) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(-1,+5) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(+5,+5) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(-1,+5) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(-2,+5) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(+1,+5) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(+10,+5) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(-1,+5) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(-2,+5) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(+1,+5) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(-5,+5) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(+1,+5) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(+2,+5) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(-1,+5) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
;
}{}
% \end{macrocode}
%
% If map is 16x16, the ordering is:\\
% 0 8 24 16 48 56 40 32 \\
% 1 9 25 17 49 57 41 33 \\
% 3 11 27 19 51 59 43 35 \\
% 2 10 26 18 50 58 42 34 \\
% 6 14 30 22 54 62 46 38 \\
% 7 15 31 23 55 63 47 39 \\
% 5 13 29 21 53 61 45 37 \\
% 4 12 28 20 52 60 44 36
% \begin{macrocode}
\ifthenelse{\equal{#4}{256}}{%
\def\karnaughmapPCCColumnSpecifier{%
++( 0,-1) node[#1] {#6}
++( 0,-2) node[#1] {#6}
++( 0,+1) node[#1] {#6}
++( 0,-5) node[#1] {#6}
++( 0,+1) node[#1] {#6}
++( 0,+2) node[#1] {#6}
++( 0,-1) node[#1] {#6}
++( 0,-10) node[#1] {#6}
++( 0,+1) node[#1] {#6}
++( 0,+2) node[#1] {#6}
++( 0,-1) node[#1] {#6}
++( 0,+5) node[#1] {#6}
++( 0,-1) node[#1] {#6}
++( 0,-2) node[#1] {#6}
++( 0,+1) node[#1] {#6}
}%
\path (0, #5)
++(#2,#3) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(+1,+10) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(+2,+10) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(-1,+10) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(+5,+10) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(-1,+10) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(-2,+10) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(+1,+10) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(+10,+10) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(-1,+10) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(-2,+10) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(+1,+10) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(-5,+10) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(+1,+10) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(+2,+10) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
++(-1,+10) node[#1] {#6}
\karnaughmapPCCColumnSpecifier
;
}{}
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\karnaughmapHighlightField}
% Macro that defines the highlighting.
% |\karnaughmapHighlightField|\oarg{key=value}\marg{coordinates}\marg{color name}
%
%
% \end{macro}
% \begin{macrocode}
\newcommand{\karnaughmapHighlightField}[3][]{%
\ifKV@karnaughmap@fill
\path[fill=#3,opacity=\cmdKV@karnaughmap@opacity,#1] (#2) rectangle ++(1,1);%
\fi
\ifKV@karnaughmap@outline
\draw[#3,#1] (#2) ++ (0.1,0.1) rectangle ++(0.8,0.8);%
\fi
}
% \end{macrocode}
% \begin{macro}{\karnaughmapShadeMapfieldTWO}
% Macro to shade square two input karnaugh map fields.\\
% |\karnaughmapShadeMapfieldTWO|\oarg{key=value}\marg{decimal field number}\marg{color name}
%
% Optional macro is used as key-val interface for option processing,
% mandatory ones specify the color used for highlighting and
% the fields that are to be highlighted as decimal integers from $1$ to $2^{\textrm{map size}}-1$.
% \begin{macrocode}
\newcommand{\karnaughmapShadeMapfieldTWO}[3][]{%
\begin{scope}[scale=1]
\ifthenelse{\equal{#2}{0}}{\karnaughmapHighlightField[#1]{0,1}{#3}}{}%
\ifthenelse{\equal{#2}{1}}{\karnaughmapHighlightField[#1]{0,0}{#3}}{}%
\ifthenelse{\equal{#2}{2}}{\karnaughmapHighlightField[#1]{1,1}{#3}}{}%
\ifthenelse{\equal{#2}{3}}{\karnaughmapHighlightField[#1]{1,0}{#3}}{}%
\end{scope}
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\karnaughmapShadeMapfieldTHREE}
% Macro to shade three input karnaugh map fields.\\
% |\karnaughmapShadeMapfieldTHREE|\oarg{key=value}\marg{decimal field number}\marg{color name}
%
% Optional macro is used as key-val interface for option processing,
% mandatory ones specify the color used for highlighting and
% the fields that are to be highlighted as decimal integers from $1$ to $2^{\textrm{map size}}-1$.
% \begin{macrocode}
\newcommand{\karnaughmapShadeMapfieldTHREE}[3][]{%
\begin{scope}[scale=1]
\ifthenelse{\equal{#2}{0}}{\karnaughmapHighlightField[#1]{0,1}{#3}}{}%
\ifthenelse{\equal{#2}{1}}{\karnaughmapHighlightField[#1]{0,0}{#3}}{}%
\ifthenelse{\equal{#2}{2}}{\karnaughmapHighlightField[#1]{1,1}{#3}}{}%
\ifthenelse{\equal{#2}{3}}{\karnaughmapHighlightField[#1]{1,0}{#3}}{}%
\ifthenelse{\equal{#2}{4}}{\karnaughmapHighlightField[#1]{3,1}{#3}}{}%
\ifthenelse{\equal{#2}{5}}{\karnaughmapHighlightField[#1]{3,0}{#3}}{}%
\ifthenelse{\equal{#2}{6}}{\karnaughmapHighlightField[#1]{2,1}{#3}}{}%
\ifthenelse{\equal{#2}{7}}{\karnaughmapHighlightField[#1]{2,0}{#3}}{}%
\end{scope}
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\karnaughmapShadeMapfieldFOUR}
% Macro to shade square four input karnaugh map fields.\\
% |\karnaughmapShadeMapfieldFOUR|\oarg{key=value}\marg{decimal field number}\marg{color name}
%
% Optional macro is used as key-val interface for option processing,
% mandatory ones specify the color used for highlighting and
% the fields that are to be highlighted as decimal integers from $1$ to $2^{\textrm{map size}}-1$.
% \begin{macrocode}
\newcommand{\karnaughmapShadeMapfieldFOUR}[3][]{%
\begin{scope}[scale=1]%
% \end{macrocode}
% 1st column
% \begin{macrocode}
\ifthenelse{\equal{#2}{0}}{\karnaughmapHighlightField[#1]{0,3}{#3}}{}%
\ifthenelse{\equal{#2}{1}}{\karnaughmapHighlightField[#1]{0,2}{#3}}{}%
\ifthenelse{\equal{#2}{2}}{\karnaughmapHighlightField[#1]{0,0}{#3}}{}%
\ifthenelse{\equal{#2}{3}}{\karnaughmapHighlightField[#1]{0,1}{#3}}{}%
% \end{macrocode}
% 2nd column
% \begin{macrocode}
\ifthenelse{\equal{#2}{4}}{\karnaughmapHighlightField[#1]{1,3}{#3}}{}%
\ifthenelse{\equal{#2}{5}}{\karnaughmapHighlightField[#1]{1,2}{#3}}{}%
\ifthenelse{\equal{#2}{6}}{\karnaughmapHighlightField[#1]{1,0}{#3}}{}%
\ifthenelse{\equal{#2}{7}}{\karnaughmapHighlightField[#1]{1,1}{#3}}{}%
% \end{macrocode}
% 4th column
% \begin{macrocode}
\ifthenelse{\equal{#2}{8}}{\karnaughmapHighlightField[#1]{3,3}{#3}}{}%
\ifthenelse{\equal{#2}{9}}{\karnaughmapHighlightField[#1]{3,2}{#3}}{}%
\ifthenelse{\equal{#2}{a}\OR\equal{#2}{A}}{\karnaughmapHighlightField[#1]{3,0}{#3}}{}%
\ifthenelse{\equal{#2}{b}\OR\equal{#2}{B}}{\karnaughmapHighlightField[#1]{3,1}{#3}}{}%
% \end{macrocode}
% 3rd column
% \begin{macrocode}
\ifthenelse{\equal{#2}{c}\OR\equal{#2}{C}}{\karnaughmapHighlightField[#1]{2,3}{#3}}{}%
\ifthenelse{\equal{#2}{d}\OR\equal{#2}{D}}{\karnaughmapHighlightField[#1]{2,2}{#3}}{}%
\ifthenelse{\equal{#2}{e}\OR\equal{#2}{E}}{\karnaughmapHighlightField[#1]{2,0}{#3}}{}%
\ifthenelse{\equal{#2}{f}\OR\equal{#2}{F}}{\karnaughmapHighlightField[#1]{2,1}{#3}}{}%
\end{scope}
}
% \end{macrocode}
% \end{macro}
%
%
%
% \subsection{Main Functions}% \iffalse TODO: SUBSEC:Main Functions \fi
%
% Here come the main functions to typeset the map
% and to mark certain cells (not implemented yet).
%
% \begin{macro}{\karnaughmap}
% The main macro takes one mandatory and one optional argument:\\
% \oarg{key=value}\marg{inputstring}.
%
% The optional is used as key-val inteface,
% the mandatory is empty or holds the entry-pattern (inputstring)
% according to the corresponding ordered truth table
% of the desired logic function.
% \begin{macrocode}
\newcommand{\karnaughmap}[2][]{%
% \end{macrocode}
%
% If the optional input is not empty, assign the key-val.
% \begin{macrocode}
\ifthenelse{\equal{#1}{}}{}{\setkeys{karnaughmap}{#1}}
% \end{macrocode}
%
% For easy access store the mandatory argument as variable |\karnaughmapCellEntries|.
% \begin{macrocode}
\def\karnaughmapCellEntries{#2}%
% \end{macrocode}
%
% Check length of mandatory argument and store the result in |\karnaughmapSize|.
%
% If the mandatory argument is empty,
% use the default map size provided by the key-val interface (|defaultmap| key).
% \begin{macrocode}
\ifthenelse{\equal{#2}{}}{%
\def\karnaughmapSize{\cmdKV@karnaughmap@defaultmap}
}{%
% \end{macrocode}
%
% Else, determine the length of the input string to determine the map size.
%
% Before calculating the string length, remove any blanks in the input string.
% Usage of blanks in the input string can increase readability,
% e.g. when groups of four are provided.
% \begin{macrocode}
\IfSubStr{\karnaughmapCellEntries}{ }{%
\StrDel[0]{\karnaughmapCellEntries}{ }[\karnaughmapCellEntries]
}{}
% \end{macrocode}
%
% Now, calculate the string length.
% This is the old version.
% |\StrLen{#2}[\karnaughmapSize]%|
% \begin{macrocode}
\StrLen{\karnaughmapCellEntries}[\karnaughmapSize]%
% \end{macrocode}
%
% If the input is a scalar number, i.e. it is < 1000 (decimal),
% it is treated as number and is used to determine the map size.
% In this case adapt the variable |\karnaughmapCellEntries| accordingly.
% |\ifthenelse{\equal{\karnaughmapSize}{1}}{%|
% \begin{macrocode}
\ifthenelse{\karnaughmapSize < 4}{%
\def\karnaughmapSize{#2}\def\karnaughmapCellEntries{}}{}%
}
% \end{macrocode}
%
%
% Parse the input string and omit printing of '0', '1', or '*' entries
% if the switches say so.
% \begin{macrocode}
\ifKV@karnaughmap@omitzeros
\StrSubstitute[0]{\karnaughmapCellEntries}{0}{ }[\karnaughmapCellEntries]
\fi
\ifKV@karnaughmap@omitones
\StrSubstitute[0]{\karnaughmapCellEntries}{1}{ }[\karnaughmapCellEntries]
\fi
\ifKV@karnaughmap@omitdontcares
\StrSubstitute[0]{\karnaughmapCellEntries}{\cmdKV@karnaughmap@dontcare}{ }[\karnaughmapCellEntries]
\fi
% \end{macrocode}
%
% Initialize internal counters.
% \begin{macrocode}
\setcounter{karnaughmapIdxCounter}{0}
\setcounter{karnaughmapStrCounter}{0}
% \end{macrocode}
%
% Extract the map variables and alloc row and col sizes.
% In addition, store the number of variables in variable |\karnaughmapNumVar|.
% \begin{macrocode}
\ifthenelse{\karnaughmapSize = 4}{%
\StrChar{\cmdKV@karnaughmap@variables}{1}[\karnaughmapVarLabelA]
\def\karnaughmapVarLabelB{}
\StrChar{\cmdKV@karnaughmap@variables}{2}[\karnaughmapVarLabelC]
\def\karnaughmapVarLabelD{}
\def\karnaughmapNumRow{2}
\def\karnaughmapNumCol{2}
\def\karnaughmapNumVar{2}
}{}
\ifthenelse{\karnaughmapSize = 8}{%
\StrChar{\cmdKV@karnaughmap@variables}{1}[\karnaughmapVarLabelA]
\StrChar{\cmdKV@karnaughmap@variables}{2}[\karnaughmapVarLabelB]
\StrChar{\cmdKV@karnaughmap@variables}{3}[\karnaughmapVarLabelC]
\def\karnaughmapVarLabelD{}
\def\karnaughmapNumRow{2}
\def\karnaughmapNumCol{4}
\def\karnaughmapNumVar{3}
}{}
\ifthenelse{\karnaughmapSize = 16}{%
\StrChar{\cmdKV@karnaughmap@variables}{1}[\karnaughmapVarLabelA]
\StrChar{\cmdKV@karnaughmap@variables}{2}[\karnaughmapVarLabelB]
\StrChar{\cmdKV@karnaughmap@variables}{3}[\karnaughmapVarLabelC]
\StrChar{\cmdKV@karnaughmap@variables}{4}[\karnaughmapVarLabelD]
\def\karnaughmapNumRow{4}
\def\karnaughmapNumCol{4}
\def\karnaughmapNumVar{4}
}{}
% \end{macrocode}
%
% The bigger karnaugh maps, i.e. 32, 64, 128 and 512, lack finer control possibilities.
% Rather, the variables are set such that they can be used as map descriptors,
% but not for some fancy stuff like indicating the variable blocks.
% This means, that we force to omit printing of the the indices (omitidx=true)
% and we force to omit printing of the variables.\\
% For the variable macros to work, we set the B and D macro to empty
% and put the remaining variables in the A for column and C for row variables.
% \begin{macrocode}
\ifthenelse{\karnaughmapSize = 32}{%
\setkeys{karnaughmap}{omitidx=true, omitvariables=true}
\StrMid{\cmdKV@karnaughmap@variables}{1}{3}[\karnaughmapVarLabelA]
\def\karnaughmapVarLabelB{}
\StrMid{\cmdKV@karnaughmap@variables}{4}{5}[\karnaughmapVarLabelC]
\def\karnaughmapVarLabelD{}
\def\karnaughmapNumRow{4}
\def\karnaughmapNumCol{8}
\def\karnaughmapNumVar{5}
}{}
\ifthenelse{\karnaughmapSize = 64}{%
\setkeys{karnaughmap}{omitidx=true, omitvariables=true}
\StrMid{\cmdKV@karnaughmap@variables}{1}{3}[\karnaughmapVarLabelA]
\def\karnaughmapVarLabelB{}
\StrMid{\cmdKV@karnaughmap@variables}{4}{6}[\karnaughmapVarLabelC]
\def\karnaughmapVarLabelD{}
\def\karnaughmapNumRow{8}
\def\karnaughmapNumCol{8}
\def\karnaughmapNumVar{6}
}{}
\ifthenelse{\karnaughmapSize = 128}{%
\setkeys{karnaughmap}{omitidx=true, omitvariables=true}
\StrMid{\cmdKV@karnaughmap@variables}{1}{4}[\karnaughmapVarLabelA]
\def\karnaughmapVarLabelB{}
\StrMid{\cmdKV@karnaughmap@variables}{5}{7}[\karnaughmapVarLabelC]
\def\karnaughmapVarLabelD{}
\def\karnaughmapNumRow{8}
\def\karnaughmapNumCol{16}
\def\karnaughmapNumVar{7}
}{}
\ifthenelse{\karnaughmapSize = 256}{%
\setkeys{karnaughmap}{omitidx=true, omitvariables=true}
\StrMid{\cmdKV@karnaughmap@variables}{1}{4}[\karnaughmapVarLabelA]
\def\karnaughmapVarLabelB{}
\StrMid{\cmdKV@karnaughmap@variables}{5}{8}[\karnaughmapVarLabelC]
\def\karnaughmapVarLabelD{}
\def\karnaughmapNumRow{16}
\def\karnaughmapNumCol{16}
\def\karnaughmapNumVar{8}
}{}
% \end{macrocode}
%
% \paragraph{Basic table} Typeset the basic table.
%
% Embed the draw commands in a scope environment for style control.
% \begin{macrocode}
\begin{scope}[xshift=\cmdKV@karnaughmap@xshift,
yshift=\cmdKV@karnaughmap@yshift,
color=karnaughmapColor,
draw=karnaughmapMapColor ]
% \end{macrocode}
%
% Draw table boundaries.
% \begin{macrocode}
\draw (0,0) rectangle (\karnaughmapNumCol, \karnaughmapNumRow);
% \end{macrocode}
%
% Draw column seperators.
% \begin{macrocode}
\foreach \x in {1,2,...,\karnaughmapNumCol} {%
\ifthenelse{\equal{\x}{1}}{}{%
\draw (\x-1,0) -- ++(0,\karnaughmapNumRow);%
}%
}%
% \end{macrocode}
%
% Draw row seperators.
% \begin{macrocode}
\foreach \x in {1,2,...,\karnaughmapNumRow} {%
\ifthenelse{\equal{\x}{1}}{}{%
\draw (0,\x-1) -- ++(\karnaughmapNumCol,0);%
}%
}%
% \end{macrocode}
%
% Draw map labels;
% Diagonal line and anchor first.
% \begin{macrocode}
\draw (0,\karnaughmapNumRow) -- ++(-0.4,0.4) coordinate(identifier)
-- ++(-0.4,0.4)
% \end{macrocode}
%
% Function label at the top of the map,
% if the function label is non-empty the label is followed by a colon.
% \begin{macrocode}
node[yshift=7.5,xshift=-3.5,right] {%
\ifthenelse{\equal{\cmdKV@karnaughmap@function}{}}{}{$\cmdKV@karnaughmap@function\colon$}};
% \end{macrocode}
%
% Variable label right and below the diagonal.
% \begin{macrocode}
\path (identifier) node[above right, xshift=-2.5] {$\karnaughmapVarLabelA\karnaughmapVarLabelB$};
\path (identifier) node[below left, yshift=0.5] {$\karnaughmapVarLabelC\karnaughmapVarLabelD$};
% \end{macrocode}
%
% Typeset binaries if |omitbinaries| switch is false;
% \begin{macrocode}
\ifKV@karnaughmap@omitbinaries
\else
% \end{macrocode}
%
% 2 columns: anchors are above the top row |\karnaughmapNumRow|
% and in the middle of the cells at 0.5 and 1.5.
% \begin{macrocode}
\ifthenelse{\equal{\karnaughmapNumCol}{2}}{%
\foreach \pos/\lab in {0.5/0, 1.5/1} {%
\path (\pos, \karnaughmapNumRow) node[above] {$\lab$};%
}%
}{}%
% \end{macrocode}
%
% 4 columns: anchors are above the top row |\karnaughmapNumRow|
% and in the middle of the cells at 0.5 ... 3.5.
% \begin{macrocode}
\ifthenelse{\equal{\karnaughmapNumCol}{4}}{%
\foreach \pos/\lab in {0.5/00, 1.5/01, 2.5/11, 3.5/10} {%
\path (\pos, \karnaughmapNumRow) node[above] {$\lab$};%
}%
}{}%
% \end{macrocode}
%
% 8 columns: anchors are above the top row |\karnaughmapNumRow|
% and in the middle of the cells at 0.5 ... 7.5.
% \begin{macrocode}
\ifthenelse{\equal{\karnaughmapNumCol}{8}}{%
\foreach \pos/\lab in {0.5/000, 1.5/001, 2.5/011, 3.5/010, 4.5/110, 5.5/111, 6.5/101, 7.5/100} {%
\path (\pos, \karnaughmapNumRow) node[above] {$\lab$};%
}%
}{}%
% \end{macrocode}
%
% 16 columns: anchors are above the top row |\karnaughmapNumRow|
% and in the middle of the cells at 0.5 ... 15.5.
% \begin{macrocode}
\ifthenelse{\equal{\karnaughmapNumCol}{16}}{%
\foreach \pos/\lab in {0.5/0000, 1.5/0001, 2.5/0011, 3.5/0010, 4.5/0110, 5.5/0111, 6.5/0101, 7.5/0100,
8.5/1100, 9.5/1101,10.5/1111,11.5/1110,12.5/1010,13.5/1011,14.5/1001,15.5/1000} {%
\path (\pos, \karnaughmapNumRow) node[above] {$\lab$};%
}%
}{}%
% \end{macrocode}
%
% 2 rows: anchors are left of the first column with coordinate (0, x)
% and in the middle of the cells at 0.5 and 1.5.
% \begin{macrocode}
\ifthenelse{\equal{\karnaughmapNumRow}{2}}{%
\foreach \pos/\lab in {0.5/0, 1.5/1} {%
\path (0, \karnaughmapNumRow-\pos) node[left] {$\lab$};%
}%
}{}%
% \end{macrocode}
%
% 4 rows: anchors are left of the first column with coordinate (0, x)
% and in the middle of the cells at 0.5 ... 3.5.
% \begin{macrocode}
\ifthenelse{\equal{\karnaughmapNumRow}{4}}{%
\foreach \pos/\lab in {0.5/00, 1.5/01, 2.5/11, 3.5/10} {%
\path (0, \karnaughmapNumRow-\pos) node[left] {$\lab$};%
}%
}{}%
% \end{macrocode}
%
% 8 rows: anchors are left of the first column with coordinate (0, x)
% and in the middle of the cells at 0.5 ... 7.5.
% \begin{macrocode}
\ifthenelse{\equal{\karnaughmapNumRow}{8}}{%
\foreach \pos/\lab in {0.5/000, 1.5/001, 2.5/011, 3.5/010, 4.5/110, 5.5/111, 6.5/101, 7.5/100} {%
\path (-0.125, \karnaughmapNumRow-\pos) node[left] {$\lab$};%
}%
}{}%
% \end{macrocode}
%
% 16 rows: anchors are left of the first column with coordinate (0, x)
% and in the middle of the cells at 0.5 ... 15.5.
% \begin{macrocode}
\ifthenelse{\equal{\karnaughmapNumRow}{16}}{%
\foreach \pos/\lab in {0.5/0000, 1.5/0001, 2.5/0011, 3.5/0010, 4.5/0110, 5.5/0111, 6.5/0101, 7.5/0100,
8.5/1100, 9.5/1101,10.5/1111,11.5/1110,12.5/1010,13.5/1011,14.5/1001,15.5/1000} {%
\path (-0.1875, \karnaughmapNumRow-\pos) node[left] {$\lab$};%
}%
}{}%
\fi
% \end{macrocode}
%
% Typeset binary labels above and left of the map if switch |omitbinaries| is false.
%
% Set base bias of variable labels;
% the top and left bias is modified depending on if the binary labels are set or not.
% \begin{macrocode}
\def\karnaughmapVariableBaseBias{0.2}
\ifKV@karnaughmap@omitbinaries
% \end{macrocode}
%
% Set bias to 0 if binaries are not typeset.
% \begin{macrocode}
\def\karnaughmapVariableTopBias{0}
\def\karnaughmapVariableLeftBias{0}
\else
% \end{macrocode}
%
% Set bias accordingly if binaries have 1 or 2 characters.
% \begin{macrocode}
\def\karnaughmapVariableTopBias{0.3}
\ifthenelse{\equal{\karnaughmapVarLabelD}{}}{%
\def\karnaughmapVariableLeftBias{0.2}
}{%
\def\karnaughmapVariableLeftBias{0.4}
}
\fi
% \end{macrocode}
%
% Typeset the variable labels around the map if switch |omitvariables| is false.
% \begin{macrocode}
\ifKV@karnaughmap@omitvariables
\else
\ifthenelse{\equal{\karnaughmapVarLabelA}{}}{%
}{%
\ifthenelse{\equal{\karnaughmapVarLabelB}{}}{%
\draw (1.1, \karnaughmapNumRow + \karnaughmapVariableBaseBias + \karnaughmapVariableTopBias)
-- node[above] {$\karnaughmapVarLabelA$} ++(0.8, 0);
\ifKV@karnaughmap@omitnegated
\else
\draw (0.1, \karnaughmapNumRow + \karnaughmapVariableBaseBias + \karnaughmapVariableTopBias)
-- node[above] {$\overline{\karnaughmapVarLabelA}$} ++(0.8, 0);
\fi
}{%
\draw (2.1, \karnaughmapNumRow + \karnaughmapVariableBaseBias + \karnaughmapVariableTopBias)
-- node[above] {$\karnaughmapVarLabelA$} ++(1.8, 0);
\draw (1.1, -\karnaughmapVariableBaseBias)
-- node[below] {$\karnaughmapVarLabelB$} ++(1.8, 0);
\ifKV@karnaughmap@omitnegated
\else
\draw (0.1, \karnaughmapNumRow + \karnaughmapVariableBaseBias + \karnaughmapVariableTopBias)
-- node[above] {$\overline{\karnaughmapVarLabelA}$} ++(1.8, 0);
\draw (0.1, -\karnaughmapVariableBaseBias)
-- node[below] {$\overline{\karnaughmapVarLabelB}$} ++(0.8, 0);
\draw (3.1, -\karnaughmapVariableBaseBias)
-- node[below] {$\overline{\karnaughmapVarLabelB}$} ++(0.8, 0);
\fi
}
}
\ifthenelse{\equal{\karnaughmapVarLabelC}{}}{%
}{%
\ifthenelse{\equal{\karnaughmapVarLabelD}{}}{%
\draw (-\karnaughmapVariableBaseBias -\karnaughmapVariableLeftBias, 0.1)
-- node[left] {$\karnaughmapVarLabelC$} ++(0, 0.8);
\ifKV@karnaughmap@omitnegated
\else
\draw (-\karnaughmapVariableBaseBias -\karnaughmapVariableLeftBias, 1.1)
-- node[left] {$\overline{\karnaughmapVarLabelC}$} ++(0, 0.8);
\fi
}{%
\draw (-\karnaughmapVariableBaseBias -\karnaughmapVariableLeftBias, 0.1)
-- node[left] {$\karnaughmapVarLabelC$} ++(0, 1.8);
\draw (\karnaughmapNumCol + \karnaughmapVariableBaseBias, 1.1)
-- node[right] {$\karnaughmapVarLabelD$} ++(0, 1.8);
\ifKV@karnaughmap@omitnegated
\else
\draw (-\karnaughmapVariableBaseBias -\karnaughmapVariableLeftBias, 2.1)
-- node[left] {$\overline{\karnaughmapVarLabelC}$} ++(0, 1.8);
\draw (\karnaughmapNumCol + \karnaughmapVariableBaseBias, 0.1)
-- node[right] {$\overline{\karnaughmapVarLabelD}$} ++(0, 0.8);
\draw (\karnaughmapNumCol + \karnaughmapVariableBaseBias, 3.1)
-- node[right] {$\overline{\karnaughmapVarLabelD}$} ++(0, 0.8);
\fi
}
}
\fi
% \end{macrocode}
%
% Typeset decimal index if switch |omitidx| is false.
% \begin{macrocode}
\ifKV@karnaughmap@omitidx
\else
\karnaughmapPrintCellContents[anchor=west]{0.0}{-0.2}{\karnaughmapSize}{\karnaughmapNumRow}{\karnaughmapPrintIndex[\karnaughmapNumVar]}
\fi
% \end{macrocode}
%
% Typeset the cell entries.
% \begin{macrocode}
\karnaughmapPrintCellContents{0.5}{-0.5}{\karnaughmapSize}{\karnaughmapNumRow}{\karnaughmapPrintValue{\karnaughmapCellEntries}}
% \end{macrocode}
%
% Close the scope
% \begin{macrocode}
\end{scope}
% \end{macrocode}
%
% Finishing macro bracket.
% \begin{macrocode}
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\karnaughmapcolorfield}
% The coloring macro takes two mandatory and one optional argument:\\
% \oarg{key=value}\marg{map size}\marg{fields}\marg{color}.
% \begin{macrocode}
\newcommand{\karnaughmapcolorfield}[4][]{%
\setkeys{karnaughmap}{fill,opacity}%
\ifthenelse{\equal{#1}{}}{}{\setkeys*{karnaughmap}{#1}}%
\ifthenelse{\equal{#3}{}}{}{%
\StrSplit{#3}{1}{\karnaughmapColorfieldCur}{\karnaughmapColorfieldRem}
\ifthenelse{\equal{#2}{2}}{%
\karnaughmapShadeMapfieldTWO[\XKV@rm]{\karnaughmapColorfieldCur}{#4}
}{}
\ifthenelse{\equal{#2}{3}}{%
\karnaughmapShadeMapfieldTHREE[\XKV@rm]{\karnaughmapColorfieldCur}{#4}
}{}
\ifthenelse{\equal{#2}{4}}{%
\karnaughmapShadeMapfieldFOUR[\XKV@rm]{\karnaughmapColorfieldCur}{#4}
}{}
\karnaughmapcolorfield[#1]{#2}{\karnaughmapColorfieldRem}{#4}
}
}
% \end{macrocode}
% \end{macro}
%
%
%
%
%
%
%
%
% \section{To Do}% \iffalse TODO: SEC:To Do \fi
% \begin{itemize}
% \item Adjust the map label positions as well as the function label to fit the negated variant.
% \item Increase supported karnaugh map size: 5 and 6 variables should be feasible in a single karnaugh map
% \item Provide the possibility to permute the karnaugh map
% \end{itemize}
%
%
%
% \iffalse ins meta-comment
%
% For convenience, the corresponding .ins file is provided here.
% Just copy this in a file called karnaughmap.ins and run it through latex.
%
% %%
% %% Copyright (C) 2013 by Michael Vonbun <
[email protected]>
% %%
% %% This file may be distributed and/or modified under the conditions of
% %% the LaTeX Project Public License, either version 1.2 of this license
% %% or (at your option) any later version. The latest version of this
% %% license is in:
% %%
% %%
http://www.latex-project.org/lppl.txt
% %%
% %% and version 1.2 or later is part of all distributions of LaTeX version
% %% 1999/12/01 or later.
% %%
%
% \input docstrip.tex
% \keepsilent
%
% \usedir{tex/latex/lisstyles/karnaughmap}
%
% \preamble
%
% This is a generated file.
%
% Copyright (C) 2013 by Michael Vonbun <
[email protected]>
%
% This file may be distributed and/or modified under the conditions of
% the LaTeX Project Public License, either version 1.2 of this license
% or (at your option) any later version. The latest version of this
% license is in:
%
%
http://www.latex-project.org/lppl.txt
%
% and version 1.2 or later is part of all distributions of LaTeX version
% 1999/12/01 or later.
%
% \endpreamble
%
% \generate{\file{karnaughmap.sty}{\from{karnaughmap.dtx}{package}}}
%
% \obeyspaces
% \Msg{*************************************************************}
% \Msg{* *}
% \Msg{* To finish the installation you have to move the following *}
% \Msg{* file into a directory searched by TeX: *}
% \Msg{* *}
% \Msg{* karnaughmap.sty *}
% \Msg{* *}
% \Msg{* To produce the documentation run the file karnaughmap.dtx *}
% \Msg{* through LaTeX/pdfLaTeX. *}
% \Msg{* To produce the changelog, run *}
% \Msg{* makeindex -s gind.ist -o karnaughmap.ind karnaughmap.idx *}
% \Msg{* To produce the index, run *}
% \Msg{* makeindex -s gglo.ist -o karnaughmap.gls karnaughmap.glo *}
% \Msg{* *}
% \Msg{* gglo.ist and gind.ist are shipped with the doc-package *}
% \Msg{* *}
% \Msg{* Happy TeXing! *}
% \Msg{* *}
% \Msg{*************************************************************}
%
% \endbatchfile
%
% \fi
%
% \setcounter{IndexColumns}{2}
% \Finale \PrintChanges \PrintIndex
\endinput