% \iffalse meta-comment % % Copyright (C) 2015 by Michael Vonbun % --------------------------------------------------------- % % 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} % %\NeedsTeXFormat{LaTeX2e}[1999/12/01] %\ProvidesPackage{karnaughmap} %<*package> [2015/04/20 v2.0 draw karnaugh maps using tikz] % % %<*driver> \documentclass{ltxdoc} \usepackage{xkvview} \usepackage{hyperref} \usepackage{karnaughmap}[2013/12/06] \EnableCrossrefs \CodelineIndex \RecordChanges \begin{document} \DocInput{karnaughmap.dtx} \PrintChanges \PrintIndex \end{document} % % \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{m.vonbun@gmail.com}} % % \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 % %% % %% 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 % % 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