summaryrefslogtreecommitdiff
path: root/graphics/pgf/contrib/tikz-karnaugh/tex/tikzlibrarykarnaugh.code.tex
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/pgf/contrib/tikz-karnaugh/tex/tikzlibrarykarnaugh.code.tex')
-rw-r--r--graphics/pgf/contrib/tikz-karnaugh/tex/tikzlibrarykarnaugh.code.tex300
1 files changed, 283 insertions, 17 deletions
diff --git a/graphics/pgf/contrib/tikz-karnaugh/tex/tikzlibrarykarnaugh.code.tex b/graphics/pgf/contrib/tikz-karnaugh/tex/tikzlibrarykarnaugh.code.tex
index 5ff82dab66..330cb6f3a5 100644
--- a/graphics/pgf/contrib/tikz-karnaugh/tex/tikzlibrarykarnaugh.code.tex
+++ b/graphics/pgf/contrib/tikz-karnaugh/tex/tikzlibrarykarnaugh.code.tex
@@ -1,6 +1,6 @@
%% This is file `tikzlibrarykarnaugh.code.tex' formerly known as `tikz-karnaugh.tex',
-%% Version: 1.2
-%% Version date: 2018-03-19
+%% Version: 1.3
+%% Version date: 2021-10-14
%%
%% Copyright (C) 2018 by Luis Paulo Laus, laus@utfpr.edu.br
%%
@@ -22,7 +22,7 @@
%%
\typeout{}
\typeout{Macros for typesetting Karnaugh maps}
-\typeout{Version 1.2 of 19 March 2018}
+\typeout{Version 1.3 of 14 October 2021}
\typeout{by Luis Paulo Laus, laus@utfpr.edu.br}
\typeout{}
%%
@@ -36,6 +36,9 @@
%% (kmindexposx and kmindexposy) to control index position, cell
%% typesetting order switched (first content then index), parameter
%% names changed to include ``km'' letters, new binary index mode
+%% 1.3: 14 October 2021: New American style KM (for maps with ones
+%% and zeros labels surrounding the map). In addition, a new macro for
+%% decimal to Gray Code conversion (\pgfmathdectoGray) is provided.
%%
%% Setting up some TikZ parameters for Karnaugh Maps
%%
@@ -49,10 +52,14 @@
kmbar left sep/.initial=1\kmunitlength,
enable indices/.is if=enableindices,
kmindex/.style={red,font=\tiny},
+ kmtoplabel/.style={blue,font=\footnotesize},
+ kmleftlabel/.style={blue,font=\footnotesize},
kmindexposx/.initial=0.2\kmunitlength,
kmindexposy/.initial=0.8\kmunitlength,
kmindexpos/.style 2 args={kmindexposx={##1\kmunitlength},kmindexposy={##2\kmunitlength}},
binary index/.is if=indexbin,
+ Gray index/.is if=indexGray,
+ American style/.is if=Americanstyle,
kmcell/.style={},
kmvar/.style={},
kmbox/.style={},
@@ -66,13 +73,17 @@
%%
\newif\ifenableindices
\enableindicesfalse
+\newif\ifindexGray
+\indexGrayfalse
\newif\ifdisablebars
\disablebarsfalse
\newif\ifindexbin
\indexbinfalse
+\newif\ifAmericanstyle
+\Americanstylefalse
%%
%% We need a fixed dimension for a single field in a Karnaugh map
-%% and also an auxiliary dimension to place the bars.
+%% and also, an auxiliary dimension to place the bars.
%%
\newdimen\kmunitlength
\newdimen\kmtemplength
@@ -112,11 +123,13 @@
%%
\def\kmcurrentindex{\kmcurrentindexdec}
\def\kmcurrentindexdec{%
-\the\kmindexcounter\global\advance\kmindexcounter by 1}%
-
+ \the\kmindexcounter\global\advance\kmindexcounter by 1}%
\def\kmcurrentindexbin{%
-\pgfmathdectobase\mynumber{\the\kmindexcounter}{2} \mynumber\global\advance\kmindexcounter by 1}%
-
+ \kmdectobin{\kmindexcounter}\global\advance\kmindexcounter by 1}%
+\def\kmcurrentindexGray{%
+ \kmdectoKG{\kmindexcounter}\global\advance\kmindexcounter by 1}%
+\def\kmcurrentindexGrayvert{%
+ \kmdectoKGvert{\kmindexcounter}\global\advance\kmindexcounter by 1}%
%%
%% We need a macro that computes the powers of two:
%%
@@ -127,6 +140,127 @@
\kmpoweroftwo{#1}{#2}
\fi}}
%%
+%% \pgfmathdectoGray
+%%
+%% Convert a representation of an integer from
+%% base 10 to Gray Code.
+%%
+%% #1 - a macro to store the result.
+%% #2 - a number in base 10 (in a macro, not a register)
+%%
+%% e.g.
+%%
+%% \pgfmathdectoGray\mynumber{9}
+%%
+%% \mynumber <- 1101
+%%
+{\makeatletter
+\gdef\pgfmathdectoGray#1#2{%
+ \pgfmathdectobase{\pgfresult@}{#2}{2}%
+ \c@pgfmath@counta=0\relax%
+ \let\pgfresult@@=\pgfmath@empty%
+ \let\pgf@lib@sh@next\pgfmathdectoGray@%
+ \expandafter\pgfmathdectoGray@\pgfresult@\pgf@stop%
+ \let#1=\pgfresult@@%
+ \pgfmath@ensurenumberlength{#1}}
+\gdef\pgfmathdectoGray@#1{%
+ \ifx#1\pgf@stop%
+ \let\pgf@lib@sh@next\relax%
+ \else%
+ \edef\pgfresult@@{\pgfresult@@\ifnum#1=\c@pgfmath@counta\relax0\else1\fi}%
+ \c@pgfmath@counta=#1\relax%
+ \fi%
+ \pgf@lib@sh@next}
+%%
+%% The macros \kmdectoKG converts the cell index
+%% to a binary code that resembles Gray code
+%% deinterleaving the variables
+%%
+\gdef\kmdectoKG#1{%
+ \kmbarnum=#1\relax% decimal number to be converted
+ \kmbarlength=\kmvarno\relax% number of bits
+ \let\kmresult@=\empty
+ \let\kmresult@@=\empty
+ \let\next\kmdectoKG@%
+ \next%
+ \kmresult@@\kmresult@}
+\gdef\kmdectoKGvert#1{%
+ \kmbarnum=#1\relax% decimal number to be converted
+ \kmbarlength=\kmvarno\relax% number of bits
+ \let\kmresult@=\empty
+ \let\kmresult@@=\empty
+ \let\next\kmdectoKG@%
+ \next%
+ \kmresult@\kmresult@@}
+\gdef\kmdectoKG@{%
+ \ifnum\kmbarlength=0%
+ \let\next\relax%
+ \else%
+ \edef\kmresult@{\ifodd\kmbarnum1\else0\fi\kmresult@}%
+ \divide \kmbarnum by 2%
+ \advance\kmbarlength by -1\relax%
+ \let\next\kmdectoKG@@%
+ \fi%
+ \next}
+\gdef\kmdectoKG@@{%
+ \ifnum\kmbarlength=0%
+ \let\next\relax%
+ \else%
+ \edef\kmresult@@{\ifodd\kmbarnum1\else0\fi\kmresult@@}%
+ \divide \kmbarnum by 2%
+ \advance\kmbarlength by -1\relax%
+ \let\next\kmdectoKG@%
+ \fi%
+ \next}
+%%
+%% The macros \kmdectobin converts a decimal number
+%% passed as argument to binary such that the number of
+%% digits (length) is equal to \kmvarno
+%%
+%% e.g.
+%%
+%% \kmvarno=6\relax\kmdectobin{9}
+%%
+%% 001001
+%%
+\gdef\kmdectobin#1{%
+ \kmbarnum=#1\relax% decimal number to be converted
+ \kmbarlength=\kmvarno\relax% number of bits
+ \let\kmresult@=\empty
+ \let\next\kmdectobin@%
+ \next%
+ \kmresult@}
+\gdef\kmdectobin@{%
+ \ifnum\kmbarlength=0%
+ \let\next\relax%
+ \else%
+ \edef\kmresult@{\ifodd\kmbarnum1\else0\fi\kmresult@}%
+ \divide \kmbarnum by 2%
+ \advance\kmbarlength by -1\relax%
+ \fi%
+ \next}
+}
+%%
+%% The macros \kmmakeindexGray creates a Gray coded index
+%% inside each cell
+%% Deprecated!!! Replaced by a new mechanism based on \kmdectoKG
+%%
+\def\kmmakeindexGray{
+ \kmbarlength=\kmxsize\relax
+ \advance\kmbarlength by -1\relax
+ \kmtemppos=\kmysize\relax
+ \advance\kmtemppos by -1\relax
+ \foreach \x in {0,...,\kmbarlength}{
+ \foreach \y in {0,...,\kmtemppos}{
+ \pgfmathsetbasenumberlength{\kmyvarno}
+ \pgfmathdectoGray\mynumbery{\y}
+ \pgfmathsetbasenumberlength{\kmxvarno}
+ \pgfmathdectoGray\mynumberx{\x}
+ \node[shift={((\pgfkeysvalueof{/tikz/kmindexposx},(\pgfkeysvalueof{/tikz/kmindexposy}+\kmtemppos\kmunitlength)},kmindex] at(\x\kmunitlength,-\y\kmunitlength) {\mynumbery\mynumberx};
+ }
+ }
+}
+%%
%% The macros \kmargumentstring and \kmsetoptstr are needed to
%% process the variable-length parameters in \karnaughmap:
%%
@@ -279,7 +413,7 @@
\ifodd\kmvarno % We have to make a bar at the top
\advance\kmxvarno by -1
\karnaughmaketopbar
- \else % We have to make a bar at the left
+ \else % We have to make a bar at the left
\advance\kmyvarno by -1
\karnaughmakeleftbar
\fi
@@ -289,6 +423,38 @@
\fi
\next
}
+
+%% \karnaughmakelabels is a modification of \karnaughmakebars.
+%% Instead of making the bars it sets two macros, \kmtoplabels
+%% and \kmleftlabels, with the labels for American style maps
+%%
+\def\karnaughmakelabels{%
+ \ifnum\kmvarno>0
+ \let\next=\karnaughmakelabels
+ \ifodd\kmvarno % We have to make the label for top
+ \advance\kmxvarno by -1
+ \kmsetoptstr % reads argument as <[opt]>str
+ \ifx\kmtoplabels\empty
+ \xdef\kmtoplabels{\kmstr}
+ \else
+ \xdef\kmtoplabels{\kmtoplabels, \kmstr}
+ \fi
+ \else % We have to make the label for left
+ \advance\kmyvarno by -1
+ \kmsetoptstr % reads argument as <[opt]>str
+ \ifx\kmleftlabels\empty
+ \xdef\kmleftlabels{\kmstr}
+ \else
+ \xdef\kmleftlabels{\kmleftlabels, \kmstr}
+ \fi
+ \fi
+ \advance\kmvarno by -1
+ \else
+ \let\next=\relax
+ \fi
+ \next
+}
+
%%
%% \karnaughmap is the macro that a user calls if he wants to draw a
%% Karnaugh map:
@@ -302,7 +468,6 @@
%% #5 a possibly empty set of TikZ commands that will be drown before
%% the function values so the values will appear on top of them
%%
- \ifenableindices\ifindexbin\gdef\kmcurrentindex{\kmcurrentindexbin}\pgfmathsetbasenumberlength{#1}\else\gdef\kmcurrentindex{\kmcurrentindexdec}\fi\fi
\kmvarno=#1 % \kmvarno is the total number of variables
\kmyvarno=#1 % \kmyvarno is the number of variable bars at the left
\divide\kmyvarno by 2
@@ -314,6 +479,7 @@
\kmpoweroftwo{\kmysize}{\kmyvarno}
\kmtemppos=\kmxsize
\advance\kmtemppos by -1
+ \kmtemplength=\pgfkeysvalueof{/tikz/kmbar top sep}
\foreach \x in {1,...,\kmtemppos}
\draw[kmlines] (\x\kmunitlength,0) -- (\x\kmunitlength,\kmysize\kmunitlength);
\kmtemppos=\kmysize
@@ -324,10 +490,45 @@
\fi
\draw[kmbox] (0,0) rectangle (\kmxsize\kmunitlength,\kmysize\kmunitlength);
#5
- \ifdisablebars\relax\else
- \node[kmvar,above left] at (0,\kmysize\kmunitlength){#2};
+ \ifAmericanstyle
+ \pgfmathsetbasenumberlength{\kmxvarno}
+ \kmtemppos=\kmxsize
+ \advance\kmtemppos by -1
+ \kmtemplength=\pgfkeysvalueof{/tikz/kmbar top sep}
+ \pgfmathsetbasenumberlength{\kmxvarno}
+ \foreach \x in {0,...,\kmtemppos}
+ \node[xshift=0.5\kmunitlength, yshift=\kmtemplength,kmtoplabel] at (\x\kmunitlength,\kmysize\kmunitlength) {\pgfmathdectoGray\mynumber{\x}\mynumber};
+ \kmtemppos=\kmysize
+ \advance\kmtemppos by -1
+ \ifnum\kmtemppos>0
+ \kmtemplength=\pgfkeysvalueof{/tikz/kmbar left sep}
+ \pgfmathsetbasenumberlength{\kmyvarno}
+ \foreach \y in {0,...,\kmtemppos}
+ \node[xshift=-\kmtemplength, yshift=\kmysize\kmunitlength-0.5\kmunitlength,left,kmleftlabel] at (0,-\y\kmunitlength) {\pgfmathdectoGray\mynumber{\y}\mynumber};
+ \fi
\kmargumentstring{#3}
- \karnaughmakebars
+ \gdef\kmtoplabels{}
+ \gdef\kmleftlabels{}
+ \karnaughmakelabels
+ \draw[kmbox] (0,\kmysize\kmunitlength) -- ++(135:1\kmunitlength) node[kmbar label,below left,pos=0.5]{\kmleftlabels} node[kmbar label,above right,pos=0.5]{\kmtoplabels} node[kmvar,above left]{#2};
+ \else
+ \ifdisablebars\relax\else
+ \node[kmvar,above left] at (0,\kmysize\kmunitlength){#2};
+ \kmargumentstring{#3}
+ \karnaughmakebars
+ \fi
+ \fi
+ \ifenableindices
+ \ifindexbin
+ \gdef\kmcurrentindex{\kmcurrentindexbin}
+ \pgfmathsetbasenumberlength{#1}
+ \else
+ \ifindexGray
+ \gdef\kmcurrentindex{\kmcurrentindexGray}
+ \else
+ \gdef\kmcurrentindex{\kmcurrentindexdec}
+ \fi
+ \fi
\fi
\kmvarno=#1 % \kmvarno is the total number of variables
\kmindexcounter=0
@@ -420,6 +621,37 @@
\fi
\next
}
+
+%% \karnaughmakelabelsvert is a modification of \karnaughmakebars.
+%% Instead of making the bars it sets two macros, \kmtoplabels
+%% and \kmleftlabels, with the labels for americal style maps
+%%
+\def\karnaughmakelabelsvert{%
+ \ifnum\kmvarno>0
+ \let\next=\karnaughmakelabelsvert
+ \ifodd\kmvarno % We have to make the label for left
+ \advance\kmyvarno by -1
+ \kmsetoptstr % reads argument as <[opt]>str
+ \ifx\kmleftlabels\empty
+ \xdef\kmleftlabels{\kmstr}
+ \else
+ \xdef\kmleftlabels{\kmleftlabels, \kmstr}
+ \fi
+ \else % We have to make the label for top
+ \advance\kmxvarno by -1
+ \kmsetoptstr % reads argument as <[opt]>str
+ \ifx\kmtoplabels\empty
+ \xdef\kmtoplabels{\kmstr}
+ \else
+ \xdef\kmtoplabels{\kmtoplabels, \kmstr}
+ \fi
+ \fi
+ \advance\kmvarno by -1
+ \else
+ \let\next=\relax
+ \fi
+ \next
+}
%%
%% \karnaughmapvert is the macro that a user calls if he wants to draw a
%% Karnaugh map in vertical mode (not be confused with TeX vertical mode):
@@ -433,7 +665,6 @@
%% #5 a possibly empty set of TikZ commands that will be drown before
%% the function values so the values will appear on top of them
%%
- \ifenableindices\ifindexbin\gdef\kmcurrentindex{\kmcurrentindexbin}\pgfmathsetbasenumberlength{#1}\else\gdef\kmcurrentindex{\kmcurrentindexdec}\fi\fi
\kmvarno=#1 % \kmvarno is the total number of variables
\kmxvarno=#1 % \kmxvarno is the number of variable bars on top
\divide\kmxvarno by 2
@@ -455,10 +686,45 @@
\draw[kmlines] (0,\y\kmunitlength) -- (\kmxsize\kmunitlength,\y\kmunitlength);
\draw[kmbox] (0,0) rectangle (\kmxsize\kmunitlength,\kmysize\kmunitlength);
#5
- \ifdisablebars\relax\else
- \node[kmvar,above left] at (0,\kmysize\kmunitlength){#2};
+ \ifAmericanstyle
+ \pgfmathsetbasenumberlength{\kmxvarno}
+ \kmtemppos=\kmxsize
+ \advance\kmtemppos by -1
+ \kmtemplength=\pgfkeysvalueof{/tikz/kmbar top sep}
+ \pgfmathsetbasenumberlength{\kmxvarno}
+ \foreach \x in {0,...,\kmtemppos}
+ \node[xshift=0.5\kmunitlength, yshift=\kmtemplength,kmtoplabel] at (\x\kmunitlength,\kmysize\kmunitlength) {\pgfmathdectoGray\mynumber{\x}\mynumber};
+ \kmtemppos=\kmysize
+ \advance\kmtemppos by -1
+ \ifnum\kmtemppos>0
+ \kmtemplength=\pgfkeysvalueof{/tikz/kmbar left sep}
+ \pgfmathsetbasenumberlength{\kmyvarno}
+ \foreach \y in {0,...,\kmtemppos}
+ \node[xshift=-\kmtemplength, yshift=\kmysize\kmunitlength-0.5\kmunitlength,left,kmleftlabel] at (0,-\y\kmunitlength) {\pgfmathdectoGray\mynumber{\y}\mynumber};
+ \fi
\kmargumentstring{#3}
- \karnaughmakebarsvert
+ \gdef\kmtoplabels{}
+ \gdef\kmleftlabels{}
+ \karnaughmakelabelsvert
+ \draw[kmbox] (0,\kmysize\kmunitlength) -- ++(135:1\kmunitlength) node[kmbar label,below left,pos=0.5]{\kmleftlabels} node[kmbar label,above right,pos=0.5]{\kmtoplabels} node[kmvar,above left]{#2};
+ \else
+ \ifdisablebars\relax\else
+ \node[kmvar,above left] at (0,\kmysize\kmunitlength){#2};
+ \kmargumentstring{#3}
+ \karnaughmakebarsvert
+ \fi
+ \fi
+ \ifenableindices
+ \ifindexbin
+ \gdef\kmcurrentindex{\kmcurrentindexbin}
+ \pgfmathsetbasenumberlength{#1}
+ \else
+ \ifindexGray
+ \gdef\kmcurrentindex{\kmcurrentindexGrayvert}
+ \else
+ \gdef\kmcurrentindex{\kmcurrentindexdec}
+ \fi
+ \fi
\fi
\kmvarno=#1 % \kmvarno is the total number of variables
\kmindexcounter=0