summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/karnaugh-map
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2016-11-25 22:32:02 +0000
committerKarl Berry <karl@freefriends.org>2016-11-25 22:32:02 +0000
commitc497804b45a4cdc10f5eb17d56b95983cae1ae06 (patch)
treeb0e254b3431e8ccbfb4a5c2463e52302fa04610d /Master/texmf-dist/tex/latex/karnaugh-map
parenta0225fcb362acd3ff62a4ccd50be41eaf2ba2bfe (diff)
karnaugh-map (25nov16)
git-svn-id: svn://tug.org/texlive/trunk@42575 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/karnaugh-map')
-rw-r--r--Master/texmf-dist/tex/latex/karnaugh-map/karnaugh-map.sty645
1 files changed, 645 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/karnaugh-map/karnaugh-map.sty b/Master/texmf-dist/tex/latex/karnaugh-map/karnaugh-map.sty
new file mode 100644
index 00000000000..877cb0806bf
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/karnaugh-map/karnaugh-map.sty
@@ -0,0 +1,645 @@
+%%
+%% This is file `karnaugh-map.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% karnaugh-map.dtx (with options: `package')
+%%
+%% This generated file originates from the karnaugh-map package!
+%%
+
+%%
+%% Copyright (C) 2015 by Mattias Jacobsson
+%% This work, karnaugh-map, is written from the ground up by Mattias Jacobsson. However the general implementation idea is based on the work published on [TeX - LaTeX Stack Exchange](https://tex.stackexchange.com) by [Ignasi](https://tex.stackexchange.com/users/1952/ignasi) found [here](https://tex.stackexchange.com/a/140581) and [here](https://tex.stackexchange.com/a/36879) which is licensed under [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/). karnaugh-map is therefore licensed under [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/).
+%%
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{karnaugh-map}[2015/10/09 v1.0 Draw Karnaugh Maps]
+
+%%
+%% Dependencies
+%%
+
+%% parsing arguments
+\RequirePackage{xparse}
+
+%% working with strings
+\RequirePackage{xstring}
+
+%% drawing
+\RequirePackage{tikz}
+\usetikzlibrary{calc,matrix}
+
+%%
+%% Helpers
+%%
+
+%% convert decimal to color
+\newcommand{\@karnaughmap@func@decimaltocolor@}[1]{%
+ \ifnum#1=0 red\fi
+ \ifnum#1=1 green\fi
+ \ifnum#1=2 yellow\fi
+ \ifnum#1=3 cyan\fi
+ \ifnum#1=4 blue\fi
+ \ifnum#1=5 magenta\fi
+ \ifnum#1>5 cyan\fi
+}
+
+%% convert decimal to binary 6-bit
+\newcommand{\@karnaughmap@func@decimaltobin@}[1]{%
+ \ifnum#1=0 000000\fi
+ \ifnum#1=1 000001\fi
+ \ifnum#1=2 000010\fi
+ \ifnum#1=3 000011\fi
+ \ifnum#1=4 000100\fi
+ \ifnum#1=5 000101\fi
+ \ifnum#1=6 000110\fi
+ \ifnum#1=7 000111\fi
+ \ifnum#1=8 001000\fi
+ \ifnum#1=9 001001\fi
+ \ifnum#1=10 001010\fi
+ \ifnum#1=11 001011\fi
+ \ifnum#1=12 001100\fi
+ \ifnum#1=13 001101\fi
+ \ifnum#1=14 001110\fi
+ \ifnum#1=15 001111\fi
+ \ifnum#1=16 010000\fi
+ \ifnum#1=17 010001\fi
+ \ifnum#1=18 010010\fi
+ \ifnum#1=19 010011\fi
+ \ifnum#1=20 010100\fi
+ \ifnum#1=21 010101\fi
+ \ifnum#1=22 010110\fi
+ \ifnum#1=23 010111\fi
+ \ifnum#1=24 011000\fi
+ \ifnum#1=25 011001\fi
+ \ifnum#1=26 011010\fi
+ \ifnum#1=27 011011\fi
+ \ifnum#1=28 011100\fi
+ \ifnum#1=29 011101\fi
+ \ifnum#1=30 011110\fi
+ \ifnum#1=31 011111\fi
+ \ifnum#1=32 100000\fi
+ \ifnum#1=33 100001\fi
+ \ifnum#1=34 100010\fi
+ \ifnum#1=35 100011\fi
+ \ifnum#1=36 100100\fi
+ \ifnum#1=37 100101\fi
+ \ifnum#1=38 100110\fi
+ \ifnum#1=39 100111\fi
+ \ifnum#1=40 101000\fi
+ \ifnum#1=41 101001\fi
+ \ifnum#1=42 101010\fi
+ \ifnum#1=43 101011\fi
+ \ifnum#1=44 101100\fi
+ \ifnum#1=45 101101\fi
+ \ifnum#1=46 101110\fi
+ \ifnum#1=47 101111\fi
+ \ifnum#1=48 110000\fi
+ \ifnum#1=49 110001\fi
+ \ifnum#1=50 110010\fi
+ \ifnum#1=51 110011\fi
+ \ifnum#1=52 110100\fi
+ \ifnum#1=53 110101\fi
+ \ifnum#1=54 110110\fi
+ \ifnum#1=55 110111\fi
+ \ifnum#1=56 111000\fi
+ \ifnum#1=57 111001\fi
+ \ifnum#1=58 111010\fi
+ \ifnum#1=59 111011\fi
+ \ifnum#1=60 111100\fi
+ \ifnum#1=61 111101\fi
+ \ifnum#1=62 111110\fi
+ \ifnum#1=63 111111\fi
+}
+
+%% command raises an error if executed outside the karnaugh-map environment
+\newcommand{\@karnaughmap@func@bailoutsideenvironment@}[0]{%
+ \ifnum\@karnaughmap@var@mapsizex@\@karnaughmap@var@mapsizey@\@karnaughmap@var@mapsizez@=000
+ \PackageError{karnaugh-map}{%
+ Command can not be used outside karnaugh-map environment%
+ }{%
+ Do not use this command outside the karnaugh-map environment.%
+ }
+ \fi
+}
+
+%% store map size
+\newcommand{\@karnaughmap@var@mapsizex@}{0}
+\newcommand{\@karnaughmap@var@mapsizey@}{0}
+\newcommand{\@karnaughmap@var@mapsizez@}{0}
+
+%% render in black and white or color default to '0'(false/color)
+\newcommand{\@karnaughmap@var@bw@}{0}
+
+%%
+%% Environment
+%%
+
+\NewDocumentEnvironment{karnaugh-map}{s O{4} O{4} O{1} O{$X_1X_0$} O{$X_3X_2$} O{$X_5X_4$}} {%
+ \begingroup
+ % store map size {[START]
+ \renewcommand{\@karnaughmap@var@mapsizex@}{#2}%
+ \renewcommand{\@karnaughmap@var@mapsizey@}{#3}%
+ \renewcommand{\@karnaughmap@var@mapsizez@}{#4}%
+ % [END]}
+ % determinate if markings should be color or black and white
+ \IfBooleanTF{#1}{%
+ % should be black and white
+ \renewcommand{\@karnaughmap@var@bw@}{1}%
+ }{%
+ % should be color
+ \renewcommand{\@karnaughmap@var@bw@}{0}%
+ }%
+ %
+ % find matching matrix template and alignment parameters {[START]
+ \newcommand{\@karnaughmap@local@matrixtemplate@}{0}% '0' is considered as missing matrix template
+ \newcommand{\@karnaughmap@local@maprealignmentx@}{0}%
+ \newcommand{\@karnaughmap@local@maprealignmenty@}{0}%
+ \ifnum\@karnaughmap@var@mapsizex@\@karnaughmap@var@mapsizey@\@karnaughmap@var@mapsizez@=221
+ \renewcommand{\@karnaughmap@local@matrixtemplate@}{%
+ \& 0 \& 1 \& \phantom{0} \\
+ 0 \& |(000000)| \phantom{0} \& |(000001)| \phantom{0} \& \\
+ 1 \& |(000010)| \phantom{0} \& |(000011)| \phantom{0} \& \\
+ \phantom{0} \& \& \& \\
+ }%
+ \fi
+ \ifnum\@karnaughmap@var@mapsizex@\@karnaughmap@var@mapsizey@\@karnaughmap@var@mapsizez@=241
+ \renewcommand{\@karnaughmap@local@matrixtemplate@}{%
+ \& 0 \& 1 \& \phantom{00} \\
+ 00 \& |(000000)| \phantom{0} \& |(000001)| \phantom{0} \& \\
+ 01 \& |(000010)| \phantom{0} \& |(000011)| \phantom{0} \& \\
+ 11 \& |(000110)| \phantom{0} \& |(000111)| \phantom{0} \& \\
+ 10 \& |(000100)| \phantom{0} \& |(000101)| \phantom{0} \& \\
+ \phantom{00} \& \& \& \\
+ }%
+ \fi
+ \ifnum\@karnaughmap@var@mapsizex@\@karnaughmap@var@mapsizey@\@karnaughmap@var@mapsizez@=421
+ \renewcommand{\@karnaughmap@local@matrixtemplate@}{%
+ \& 00 \& 01 \& 11 \& 10 \& \phantom{00} \\
+ 0 \& |(000000)| \phantom{0} \& |(000001)| \phantom{0} \& |(000011)| \phantom{0} \& |(000010)| \phantom{0} \& \\
+ 1 \& |(000100)| \phantom{0} \& |(000101)| \phantom{0} \& |(000111)| \phantom{0} \& |(000110)| \phantom{0} \& \\
+ \phantom{00} \& \& \& \& \& \\
+ }%
+ \fi
+ \ifnum\@karnaughmap@var@mapsizex@\@karnaughmap@var@mapsizey@\@karnaughmap@var@mapsizez@=441
+ \renewcommand{\@karnaughmap@local@matrixtemplate@}{%
+ \& 00 \& 01 \& 11 \& 10 \& \phantom{00} \\
+ 00 \& |(000000)| \phantom{0} \& |(000001)| \phantom{0} \& |(000011)| \phantom{0} \& |(000010)| \phantom{0} \& \\
+ 01 \& |(000100)| \phantom{0} \& |(000101)| \phantom{0} \& |(000111)| \phantom{0} \& |(000110)| \phantom{0} \& \\
+ 11 \& |(001100)| \phantom{0} \& |(001101)| \phantom{0} \& |(001111)| \phantom{0} \& |(001110)| \phantom{0} \& \\
+ 10 \& |(001000)| \phantom{0} \& |(001001)| \phantom{0} \& |(001011)| \phantom{0} \& |(001010)| \phantom{0} \& \\
+ \phantom{00} \& \& \& \& \& \\
+ }%
+ \fi
+ \ifnum\@karnaughmap@var@mapsizex@\@karnaughmap@var@mapsizey@\@karnaughmap@var@mapsizez@=442
+ \renewcommand{\@karnaughmap@local@matrixtemplate@}{%
+ \& 00 \& 01 \& 11 \& 10 \& \phantom{00} \& 00 \& 01 \& 11 \& 10 \& \phantom{00} \\
+ 00 \& |(000000)| \phantom{0} \& |(000001)| \phantom{0} \& |(000011)| \phantom{0} \& |(000010)| \phantom{0} \& \& |(010000)| \phantom{0} \& |(010001)| \phantom{0} \& |(010011)| \phantom{0} \& |(010010)| \phantom{0} \& \\
+ 01 \& |(000100)| \phantom{0} \& |(000101)| \phantom{0} \& |(000111)| \phantom{0} \& |(000110)| \phantom{0} \& \& |(010100)| \phantom{0} \& |(010101)| \phantom{0} \& |(010111)| \phantom{0} \& |(010110)| \phantom{0} \& \\
+ 11 \& |(001100)| \phantom{0} \& |(001101)| \phantom{0} \& |(001111)| \phantom{0} \& |(001110)| \phantom{0} \& \& |(011100)| \phantom{0} \& |(011101)| \phantom{0} \& |(011111)| \phantom{0} \& |(011110)| \phantom{0} \& \\
+ 10 \& |(001000)| \phantom{0} \& |(001001)| \phantom{0} \& |(001011)| \phantom{0} \& |(001010)| \phantom{0} \& \& |(011000)| \phantom{0} \& |(011001)| \phantom{0} \& |(011011)| \phantom{0} \& |(011010)| \phantom{0} \& \\
+ \phantom{00} \& \& \& \& \& \& \& \& \& \& \\
+ }%
+ \renewcommand{\@karnaughmap@local@maprealignmentx@}{2.5}%
+ \fi
+ \ifnum\@karnaughmap@var@mapsizex@\@karnaughmap@var@mapsizey@\@karnaughmap@var@mapsizez@=444
+ \renewcommand{\@karnaughmap@local@matrixtemplate@}{%
+ \& 00 \& 01 \& 11 \& 10 \& \phantom{00} \& 00 \& 01 \& 11 \& 10 \& \phantom{00} \\
+ 00 \& |(000000)| \phantom{0} \& |(000001)| \phantom{0} \& |(000011)| \phantom{0} \& |(000010)| \phantom{0} \& \& |(010000)| \phantom{0} \& |(010001)| \phantom{0} \& |(010011)| \phantom{0} \& |(010010)| \phantom{0} \& \\
+ 01 \& |(000100)| \phantom{0} \& |(000101)| \phantom{0} \& |(000111)| \phantom{0} \& |(000110)| \phantom{0} \& \& |(010100)| \phantom{0} \& |(010101)| \phantom{0} \& |(010111)| \phantom{0} \& |(010110)| \phantom{0} \& \\
+ 11 \& |(001100)| \phantom{0} \& |(001101)| \phantom{0} \& |(001111)| \phantom{0} \& |(001110)| \phantom{0} \& \& |(011100)| \phantom{0} \& |(011101)| \phantom{0} \& |(011111)| \phantom{0} \& |(011110)| \phantom{0} \& \\
+ 10 \& |(001000)| \phantom{0} \& |(001001)| \phantom{0} \& |(001011)| \phantom{0} \& |(001010)| \phantom{0} \& \& |(011000)| \phantom{0} \& |(011001)| \phantom{0} \& |(011011)| \phantom{0} \& |(011010)| \phantom{0} \& \\
+ \phantom{00} \& \& \& \& \& \& \& \& \& \& \\
+ 00 \& |(100000)| \phantom{0} \& |(100001)| \phantom{0} \& |(100011)| \phantom{0} \& |(100010)| \phantom{0} \& \& |(110000)| \phantom{0} \& |(110001)| \phantom{0} \& |(110011)| \phantom{0} \& |(110010)| \phantom{0} \& \\
+ 01 \& |(100100)| \phantom{0} \& |(100101)| \phantom{0} \& |(100111)| \phantom{0} \& |(100110)| \phantom{0} \& \& |(110100)| \phantom{0} \& |(110101)| \phantom{0} \& |(110111)| \phantom{0} \& |(110110)| \phantom{0} \& \\
+ 11 \& |(101100)| \phantom{0} \& |(101101)| \phantom{0} \& |(101111)| \phantom{0} \& |(101110)| \phantom{0} \& \& |(111100)| \phantom{0} \& |(111101)| \phantom{0} \& |(111111)| \phantom{0} \& |(111110)| \phantom{0} \& \\
+ 10 \& |(101000)| \phantom{0} \& |(101001)| \phantom{0} \& |(101011)| \phantom{0} \& |(101010)| \phantom{0} \& \& |(111000)| \phantom{0} \& |(111001)| \phantom{0} \& |(111011)| \phantom{0} \& |(111010)| \phantom{0} \& \\
+ \phantom{00} \& \& \& \& \& \& \& \& \& \& \\
+ }%
+ \renewcommand{\@karnaughmap@local@maprealignmentx@}{2.5}%
+ \renewcommand{\@karnaughmap@local@maprealignmenty@}{-2.5}%
+ \fi
+ % [END]}
+ % test if a matrix template is found or not(aka "\@karnaughmap@local@matrixtemplate@" equals to '0')
+ \ifnum0=\@karnaughmap@local@matrixtemplate@
+ % print error if no template could be found
+ \PackageError{karnaugh-map}{%
+ Can not find a template fitting your specification (\@karnaughmap@var@mapsizex@\space x \@karnaughmap@var@mapsizey@\space x \@karnaughmap@var@mapsizez@)%
+ }{%
+ Existing templates have the following dimensions: 2x2x1, 2x4x1, 4x2x1, 4x4x1, 4x4x2, and 4x4x4.
+ }%
+ \fi
+ \begin{tikzpicture}
+ % grid
+ % for all dimensions
+ \draw[color=black, ultra thin] (0,0) grid (\@karnaughmap@var@mapsizex@,\@karnaughmap@var@mapsizey@);
+ % when there are 2 sub maps
+ \ifnum\@karnaughmap@var@mapsizez@=2
+ \draw[color=black, ultra thin] (5,0) grid (9,4);
+ \fi
+ % when there are 4 sub maps
+ \ifnum\@karnaughmap@var@mapsizez@=4
+ \draw[color=black, ultra thin] (5,0) grid (9,4);
+ \draw[color=black, ultra thin] (0,-5) grid (4,-1);
+ \draw[color=black, ultra thin] (5,-5) grid (9,-1);
+ \fi
+ % labels
+ % for all dimensions
+ \node[above] at (\@karnaughmap@var@mapsizex@*0.5,\@karnaughmap@var@mapsizey@+0.9) {\small{#5}};
+ \node[left] at (-0.9,\@karnaughmap@var@mapsizey@*0.5) {\small{#6}};
+ % when there are 2 sub maps
+ \ifnum\@karnaughmap@var@mapsizez@=2
+ \node[above] at (7,4.9) {\small{#5}};
+ % extra sub maps labels
+ \node[below] at (2,-0.1) {\small{#7$=0$}};
+ \node[below] at (7,-0.1) {\small{#7$=1$}};
+ \fi
+ % when there are 4 sub maps
+ \ifnum\@karnaughmap@var@mapsizez@=4
+ \node[above] at (7,4.9) {\small{#5}};
+ \node[left] at (-0.9,-3) {\small{#6}};
+ % extra sub maps labels
+ \node[below] at (2,-0.1) {\small{#7$=00$}};
+ \node[below] at (7,-0.1) {\small{#7$=01$}};
+ \node[below] at (2,-5.1) {\small{#7$=10$}};
+ \node[below] at (7,-5.1) {\small{#7$=11$}};
+ \fi
+ % data
+ \matrix[
+ matrix of nodes,
+ ampersand replacement=\&,
+ column sep={1cm,between origins},
+ row sep={1cm,between origins},
+ ] at (\@karnaughmap@var@mapsizex@*0.5+\@karnaughmap@local@maprealignmentx@,\@karnaughmap@var@mapsizey@*0.5+\@karnaughmap@local@maprealignmenty@) {
+ \@karnaughmap@local@matrixtemplate@%
+ };
+}{
+ \end{tikzpicture}
+ \endgroup
+}
+
+%%
+%% Commands for filling out the cells
+%%
+
+%% store already used cells to avoid double filled cells and for auto completion
+\newcommand{\@karnaughmap@var@usedcells@}{,}
+
+\DeclareDocumentCommand{\autoterms}{O{-}} {%
+ % bail if outside environment karnaugh-map
+ \@karnaughmap@func@bailoutsideenvironment@{}
+ %
+ \begingroup
+ % calculate max cell number {[START]
+ \newcount\@karnaughmap@local@max@\relax
+ \@karnaughmap@local@max@=\@karnaughmap@var@mapsizex@\relax
+ \multiply\@karnaughmap@local@max@ by \@karnaughmap@var@mapsizey@\relax
+ \multiply\@karnaughmap@local@max@ by \@karnaughmap@var@mapsizez@\relax
+ \advance\@karnaughmap@local@max@ by -1\relax
+ % [END]}
+ % fill terms
+ \foreach \cell in {0,1,2,...,\@karnaughmap@local@max@} {%
+ \IfSubStr{\@karnaughmap@var@usedcells@}{,\cell,}{}{%
+ \path (\@karnaughmap@func@decimaltobin@{\cell}) node {#1};
+ }
+ }
+ \endgroup
+ % update \@karnaughmap@var@usedcells@ (all cells are used now)
+ \renewcommand{\@karnaughmap@var@usedcells@}{,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,}
+}
+\DeclareDocumentCommand{\indeterminants}{m} {%
+ % bail if outside environment karnaugh-map
+ \@karnaughmap@func@bailoutsideenvironment@{}
+ %
+ \foreach \cell in {#1} {%
+ % only write to cell if it is empty otherwise fail silently
+ \IfSubStr{\@karnaughmap@var@usedcells@}{,\cell,}{}{%
+ \path (\@karnaughmap@func@decimaltobin@{\cell}) node {-};
+ }
+ }
+ % update \@karnaughmap@var@usedcells@
+ \expandafter\def\expandafter\@karnaughmap@var@usedcells@\expandafter{\@karnaughmap@var@usedcells@#1,}
+}
+\DeclareDocumentCommand{\manualterms}{m} {%
+ % bail if outside environment karnaugh-map
+ \@karnaughmap@func@bailoutsideenvironment@{}
+ %
+ \foreach \cellinfo [count=\cell from 0] in {#1} {%
+ % only write to cell if it is empty otherwise fail silently
+ \IfSubStr{\@karnaughmap@var@usedcells@}{,\cell,}{}{%
+ \path (\@karnaughmap@func@decimaltobin@{\cell}) node {\cellinfo};
+ }
+ }
+ % update \@karnaughmap@var@usedcells@ (previous cells + all cells up to \@karnaughmap@local@cellcount@ are used now) {[START]
+ \newcommand{\@karnaughmap@local@tmpusedcells@}{}
+ \newcount\@karnaughmap@local@cellcount@\relax
+ % count number of cells in #1 {[START]
+ \StrCount{#1}{,}[\@karnaughmap@local@tmpusedcells@]
+ \@karnaughmap@local@cellcount@=\@karnaughmap@local@tmpusedcells@\relax
+ \advance\@karnaughmap@local@cellcount@ by 1\relax
+ \multiply\@karnaughmap@local@cellcount@ by 2\relax
+ % [END]}
+ % create sequence for \@karnaughmap@local@tmpusedcells@
+ \StrLeft{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,}{\@karnaughmap@local@cellcount@}[\@karnaughmap@local@tmpusedcells@]
+ % update \@karnaughmap@var@usedcells@ (append \@karnaughmap@local@tmpusedcells@)
+ \expandafter\def\expandafter\@karnaughmap@var@usedcells@\expandafter{\@karnaughmap@var@usedcells@\@karnaughmap@local@tmpusedcells@}
+ % [END]}
+}
+\DeclareDocumentCommand{\maxterms}{m} {%
+ % bail if outside environment karnaugh-map
+ \@karnaughmap@func@bailoutsideenvironment@{}
+ %
+ \foreach \cell in {#1} {%
+ % only write to cell if it is empty otherwise fail silently
+ \IfSubStr{\@karnaughmap@var@usedcells@}{,\cell,}{}{%
+ \path (\@karnaughmap@func@decimaltobin@{\cell}) node {0};
+ }
+ }
+ % update \@karnaughmap@var@usedcells@
+ \expandafter\def\expandafter\@karnaughmap@var@usedcells@\expandafter{\@karnaughmap@var@usedcells@#1,}
+}
+\DeclareDocumentCommand{\minterms}{m} {%
+ % bail if outside environment karnaugh-map
+ \@karnaughmap@func@bailoutsideenvironment@{}
+ %
+ \foreach \cell in {#1} {%
+ % only write to cell if it is empty otherwise fail silently
+ \IfSubStr{\@karnaughmap@var@usedcells@}{,\cell,}{}{%
+ \path (\@karnaughmap@func@decimaltobin@{\cell}) node {1};
+ }
+ }
+ % update \@karnaughmap@var@usedcells@
+ \expandafter\def\expandafter\@karnaughmap@var@usedcells@\expandafter{\@karnaughmap@var@usedcells@#1,}
+}
+
+%%
+%% Commands for marking the cells
+%%
+
+%% keep track of used colors
+\newcount\@karnaughmap@var@colorindex@\relax
+\@karnaughmap@var@colorindex@=0\relax
+
+\DeclareDocumentCommand{\implicant}{m m O{0}} {%
+ % bail if outside environment karnaugh-map
+ \@karnaughmap@func@bailoutsideenvironment@{}
+ %
+ \begingroup
+ % loop through specified sub maps
+ \foreach \map in {#3} {%
+ % make sure we don't try to draw on non existing sub maps
+ \ifnum\map<\@karnaughmap@var@mapsizez@
+ % calculate cell number for the specified sub maps {[START]
+ \newcount\@karnaughmap@local@northwest@\relax
+ \newcount\@karnaughmap@local@southeast@\relax
+ \@karnaughmap@local@northwest@=\map\relax
+ \@karnaughmap@local@southeast@=\map\relax
+ \multiply\@karnaughmap@local@northwest@ by 16\relax
+ \multiply\@karnaughmap@local@southeast@ by 16\relax
+ \advance\@karnaughmap@local@northwest@ by #1\relax
+ \advance\@karnaughmap@local@southeast@ by #2\relax
+ % [END]}
+ % only fill marking when \@karnaughmap@var@bw@ = '0'
+ \ifnum0=\@karnaughmap@var@bw@
+ \fill[
+ rounded corners=3pt,
+ fill=\@karnaughmap@func@decimaltocolor@{\@karnaughmap@var@colorindex@},
+ fill opacity=0.25,
+ ] {
+ ($(\@karnaughmap@func@decimaltobin@{\@karnaughmap@local@northwest@}.center)+(-0.3,0.3)$)
+ rectangle
+ ($(\@karnaughmap@func@decimaltobin@{\@karnaughmap@local@southeast@}.center)+(0.3,-0.3)$)
+ };
+ \fi
+ \draw[
+ rounded corners=3pt,
+ draw opacity=1.0,
+ ] {
+ ($(\@karnaughmap@func@decimaltobin@{\@karnaughmap@local@northwest@}.center)+(-0.3,0.3)$)
+ rectangle
+ ($(\@karnaughmap@func@decimaltobin@{\@karnaughmap@local@southeast@}.center)+(0.3,-0.3)$)
+ };
+ \else
+ \PackageWarning{karnaugh-map}{%
+ You can only draw on existing sub maps.
+ Ignoring instruction to draw on non existing sub map number \map%
+ }
+ \fi
+ }
+ \endgroup
+ % mark color as used
+ \advance\@karnaughmap@var@colorindex@ by 1\relax
+}
+\DeclareDocumentCommand{\implicantedge}{m m m m O{0}} {%
+ % bail if outside environment karnaugh-map
+ \@karnaughmap@func@bailoutsideenvironment@{}
+ %
+ \begingroup
+ % helper variables {[START]
+ \newcommand{\@karnaughmap@local@orientation@}{0} % '0' is a vertical and '1' is a horizontal implicant
+ \newcommand{\@karnaughmap@local@coordinateone@}{0}
+ \newcommand{\@karnaughmap@local@coordinatetwo@}{0}
+ \newcommand{\@karnaughmap@local@mirror@}{1} % '1' or '-1' to mirror
+ \newcommand{\@karnaughmap@local@bordercontent@}{}
+ \newcommand{\@karnaughmap@local@fillcontent@}{}
+ % [END]}
+ % determinate if this is an horizontal or vertical implicant {[START]
+ \newcount\@karnaughmap@local@testcaseone@\relax
+ \newcount\@karnaughmap@local@testcasetwo@\relax
+ \@karnaughmap@local@testcaseone@=#1\relax
+ \@karnaughmap@local@testcasetwo@=#1\relax
+ \advance\@karnaughmap@local@testcaseone@ by -#2\relax
+ \advance\@karnaughmap@local@testcasetwo@ by -#3\relax
+ \ifnum\@karnaughmap@local@testcaseone@<0 \multiply\@karnaughmap@local@testcaseone@ by -1\relax\fi
+ \ifnum\@karnaughmap@local@testcasetwo@<0 \multiply\@karnaughmap@local@testcasetwo@ by -1\relax\fi
+ % test case one
+ \ifnum\@karnaughmap@local@testcaseone@<\@karnaughmap@var@mapsizex@
+ % this is a vertical implicant
+ \renewcommand{\@karnaughmap@local@orientation@}{0}
+ \else
+ % this is a horizontal implicant
+ \renewcommand{\@karnaughmap@local@orientation@}{1}
+ \fi
+ % test case two
+ \ifnum\@karnaughmap@local@testcasetwo@<\@karnaughmap@var@mapsizex@
+ % this is a vertical implicant
+ \renewcommand{\@karnaughmap@local@orientation@}{1}
+ \fi
+ % [END]}
+ % loop through specified sub maps
+ \foreach \map in {#5} {%
+ % make sure we don't try to draw on non existing sub maps
+ \ifnum\map<\@karnaughmap@var@mapsizez@
+ % loop through both parts of the marking(ie. left and right part)
+ \foreach \i in {0,1} {%
+ % set parameters depending on the part of the marking(ie. left and right part) {[START]
+ \ifnum\i=0
+ \renewcommand{\@karnaughmap@local@coordinateone@}{#1}
+ \renewcommand{\@karnaughmap@local@coordinatetwo@}{#2}
+ \renewcommand{\@karnaughmap@local@mirror@}{1}
+ \else
+ \renewcommand{\@karnaughmap@local@coordinateone@}{#3}
+ \renewcommand{\@karnaughmap@local@coordinatetwo@}{#4}
+ \renewcommand{\@karnaughmap@local@mirror@}{-1}
+ \fi
+ % [END]}
+ % calculate cell numbers for the specified sub map {[START]
+ \newcount\@karnaughmap@local@coordinateonecounter@\relax
+ \newcount\@karnaughmap@local@coordinatetwocounter@\relax
+ \@karnaughmap@local@coordinateonecounter@=\map\relax
+ \@karnaughmap@local@coordinatetwocounter@=\map\relax
+ \multiply\@karnaughmap@local@coordinateonecounter@ by 16\relax
+ \multiply\@karnaughmap@local@coordinatetwocounter@ by 16\relax
+ \advance\@karnaughmap@local@coordinateonecounter@ by \@karnaughmap@local@coordinateone@\relax
+ \advance\@karnaughmap@local@coordinatetwocounter@ by \@karnaughmap@local@coordinatetwo@\relax
+ \renewcommand{\@karnaughmap@local@coordinateone@}{\@karnaughmap@local@coordinateonecounter@}
+ \renewcommand{\@karnaughmap@local@coordinatetwo@}{\@karnaughmap@local@coordinatetwocounter@}
+ % [END]}
+ % select drawing content depending on orientation {[START]
+ \ifnum\@karnaughmap@local@orientation@=0
+ % this is a vertical implicant
+ \renewcommand{\@karnaughmap@local@fillcontent@}{%
+ ($(\@karnaughmap@func@decimaltobin@{\@karnaughmap@local@coordinateone@}.center)+(-.3,.6*\@karnaughmap@local@mirror@)$)
+ --
+ ($(\@karnaughmap@func@decimaltobin@{\@karnaughmap@local@coordinatetwo@}.center)+(.3,.6*\@karnaughmap@local@mirror@)$)
+ { [rounded corners=3pt] --
+ ($(\@karnaughmap@func@decimaltobin@{\@karnaughmap@local@coordinatetwo@}.center)+(.3,-.3*\@karnaughmap@local@mirror@)$) }
+ { [rounded corners=3pt] --
+ ($(\@karnaughmap@func@decimaltobin@{\@karnaughmap@local@coordinateone@}.center)+(-.3,-.3*\@karnaughmap@local@mirror@)$) }
+ -- cycle
+ }
+ \renewcommand{\@karnaughmap@local@bordercontent@}{%
+ ($(\@karnaughmap@func@decimaltobin@{\@karnaughmap@local@coordinatetwo@}.center)+(.3,.6*\@karnaughmap@local@mirror@)$)
+ { [rounded corners=3pt] --
+ ($(\@karnaughmap@func@decimaltobin@{\@karnaughmap@local@coordinatetwo@}.center)+(.3,-.3*\@karnaughmap@local@mirror@)$) }
+ { [rounded corners=3pt] --
+ ($(\@karnaughmap@func@decimaltobin@{\@karnaughmap@local@coordinateone@}.center)+(-.3,-.3*\@karnaughmap@local@mirror@)$) }
+ --
+ ($(\@karnaughmap@func@decimaltobin@{\@karnaughmap@local@coordinateone@}.center)+(-.3,.6*\@karnaughmap@local@mirror@)$)
+ }
+ \else
+ % this is a horizontal implicant
+ \renewcommand{\@karnaughmap@local@fillcontent@}{%
+ ($(\@karnaughmap@func@decimaltobin@{\@karnaughmap@local@coordinatetwo@}.center)+(-.6*\@karnaughmap@local@mirror@,-.3)$)
+ --
+ ($(\@karnaughmap@func@decimaltobin@{\@karnaughmap@local@coordinateone@}.center)+(-.6*\@karnaughmap@local@mirror@,.3)$)
+ { [rounded corners=3pt] --
+ ($(\@karnaughmap@func@decimaltobin@{\@karnaughmap@local@coordinateone@}.center)+(.3*\@karnaughmap@local@mirror@,.3)$) }
+ { [rounded corners=3pt] --
+ ($(\@karnaughmap@func@decimaltobin@{\@karnaughmap@local@coordinatetwo@}.center)+(.3*\@karnaughmap@local@mirror@,-.3)$) }
+ -- cycle
+ }
+ \renewcommand{\@karnaughmap@local@bordercontent@}{%
+ ($(\@karnaughmap@func@decimaltobin@{\@karnaughmap@local@coordinateone@}.center)+(-.6*\@karnaughmap@local@mirror@,.3)$)
+ { [rounded corners=3pt] --
+ ($(\@karnaughmap@func@decimaltobin@{\@karnaughmap@local@coordinateone@}.center)+(.3*\@karnaughmap@local@mirror@,.3)$) }
+ { [rounded corners=3pt] --
+ ($(\@karnaughmap@func@decimaltobin@{\@karnaughmap@local@coordinatetwo@}.center)+(.3*\@karnaughmap@local@mirror@,-.3)$) }
+ --
+ ($(\@karnaughmap@func@decimaltobin@{\@karnaughmap@local@coordinatetwo@}.center)+(-.6*\@karnaughmap@local@mirror@,-.3)$)
+ }
+ \fi
+ % [END]}
+ % draw
+ % only fill marking when \@karnaughmap@var@bw@ = '0'
+ \ifnum0=\@karnaughmap@var@bw@
+ \fill[
+ sharp corners,
+ fill=\@karnaughmap@func@decimaltocolor@{\@karnaughmap@var@colorindex@},
+ fill opacity=0.25,
+ ] {
+ \@karnaughmap@local@fillcontent@%
+ };
+ \fi
+ \draw[
+ sharp corners,
+ draw opacity=1.0,
+ ] {
+ \@karnaughmap@local@bordercontent@%
+ };
+ }
+ \else
+ \PackageWarning{karnaugh-map}{%
+ You can only draw on existing sub maps.
+ Ignoring instruction to draw on non existing sub map number \map%
+ }
+ \fi
+ }
+ \endgroup
+ % mark color as used
+ \advance\@karnaughmap@var@colorindex@ by 1\relax
+}
+\DeclareDocumentCommand{\implicantcorner}{O{0}} {%
+ % bail if outside environment karnaugh-map
+ \@karnaughmap@func@bailoutsideenvironment@{}
+ %
+ % make sure "\implicantcorner" only are used on 4x4 maps
+ \ifnum\@karnaughmap@var@mapsizex@\@karnaughmap@var@mapsizey@=44
+ % loop through specified sub maps
+ \foreach \map in {#1} {%
+ % make sure we don't try to draw on non existing sub maps
+ \ifnum\map<\@karnaughmap@var@mapsizez@
+ % loop through the four corners
+ \foreach \corner in {0,2,8,10} {%
+ % calculate corner's properties {[START]
+ \newcount\@karnaughmap@local@coordinate@\relax
+ \@karnaughmap@local@coordinate@=\map\relax
+ \multiply\@karnaughmap@local@coordinate@ by 16\relax
+ \advance\@karnaughmap@local@coordinate@ by \corner\relax
+ \newcommand{\@karnaughmap@local@mirrorx@}{0} % '1' or '-1' to mirror
+ \newcommand{\@karnaughmap@local@mirrory@}{0} % '1' or '-1' to mirror
+ \ifnum\corner=0 \renewcommand{\@karnaughmap@local@mirrorx@}{1}\renewcommand{\@karnaughmap@local@mirrory@}{1}\fi
+ \ifnum\corner=2 \renewcommand{\@karnaughmap@local@mirrorx@}{-1}\renewcommand{\@karnaughmap@local@mirrory@}{1}\fi
+ \ifnum\corner=8 \renewcommand{\@karnaughmap@local@mirrorx@}{1}\renewcommand{\@karnaughmap@local@mirrory@}{-1}\fi
+ \ifnum\corner=10 \renewcommand{\@karnaughmap@local@mirrorx@}{-1}\renewcommand{\@karnaughmap@local@mirrory@}{-1}\fi
+ % [END]}
+ % draw
+ % only fill marking when \@karnaughmap@var@bw@ = '0'
+ \ifnum0=\@karnaughmap@var@bw@
+ \fill[
+ sharp corners,
+ fill=\@karnaughmap@func@decimaltocolor@{\@karnaughmap@var@colorindex@},
+ fill opacity=0.25,
+ ]
+ ($(\@karnaughmap@func@decimaltobin@{\@karnaughmap@local@coordinate@}.center)+(-.6*\@karnaughmap@local@mirrorx@,.6*\@karnaughmap@local@mirrory@)$)
+ --
+ ($(\@karnaughmap@func@decimaltobin@{\@karnaughmap@local@coordinate@}.center)+(.3*\@karnaughmap@local@mirrorx@,.6*\@karnaughmap@local@mirrory@)$)
+ { [rounded corners=3pt] --
+ ($(\@karnaughmap@func@decimaltobin@{\@karnaughmap@local@coordinate@}.center)+(.3*\@karnaughmap@local@mirrorx@,-.3*\@karnaughmap@local@mirrory@)$) }
+ --
+ ($(\@karnaughmap@func@decimaltobin@{\@karnaughmap@local@coordinate@}.center)+(-.6*\@karnaughmap@local@mirrorx@,-.3*\@karnaughmap@local@mirrory@)$)
+ -- cycle;
+ \fi
+ \draw[
+ sharp corners,
+ draw opacity=1.0,
+ ]
+ ($(\@karnaughmap@func@decimaltobin@{\@karnaughmap@local@coordinate@}.center)+(.3*\@karnaughmap@local@mirrorx@,.6*\@karnaughmap@local@mirrory@)$)
+ { [rounded corners=3pt] --
+ ($(\@karnaughmap@func@decimaltobin@{\@karnaughmap@local@coordinate@}.center)+(.3*\@karnaughmap@local@mirrorx@,-.3*\@karnaughmap@local@mirrory@)$) }
+ --
+ ($(\@karnaughmap@func@decimaltobin@{\@karnaughmap@local@coordinate@}.center)+(-.6*\@karnaughmap@local@mirrorx@,-.3*\@karnaughmap@local@mirrory@)$);
+ }
+ \else
+ \PackageWarning{karnaugh-map}{%
+ You can only draw on existing sub maps.
+ Ignoring instruction to draw on non existing sub map number \map%
+ }
+ \fi
+ }
+ % mark color as used
+ \advance\@karnaughmap@var@colorindex@ by 1\relax
+ \else
+ % print error if "\implicantcorner" are used on non 4x4 map
+ \PackageError{karnaugh-map}{%
+ \protect\implicantcorner\space can only be used on 4x4 maps%
+ }{%
+ You are trying to use \protect\implicantcorner\space on non 4x4 map.%
+ }
+ \fi
+}
+\endinput
+%%
+%% End of file `karnaugh-map.sty'.