summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/latex/tikz-karnaugh/tikzlibrarykarnaugh.code.tex
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/doc/latex/tikz-karnaugh/tikzlibrarykarnaugh.code.tex')
-rw-r--r--Master/texmf-dist/doc/latex/tikz-karnaugh/tikzlibrarykarnaugh.code.tex470
1 files changed, 470 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/latex/tikz-karnaugh/tikzlibrarykarnaugh.code.tex b/Master/texmf-dist/doc/latex/tikz-karnaugh/tikzlibrarykarnaugh.code.tex
new file mode 100644
index 00000000000..ad49dbd4284
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/tikz-karnaugh/tikzlibrarykarnaugh.code.tex
@@ -0,0 +1,470 @@
+%% This is file `tikzlibrarykarnaugh.code.tex' formerly known as `tikz-karnaugh.tex',
+%% Version 1.1 of 10 January 2018
+%%
+%% Copyright (C) 2017 by Luis Paulo Laus, laus@utfpr.edu.br
+%%
+%% This package can be redistributed and/or modified under the terms
+%% of the LaTeX Project Public License distributed from CTAN
+%% archives in directory macros/latex/base/lppl.txt; either
+%% version 1 of the License, or (at your option) any later version,
+%% with `The Package' referring to the software `tikzlibrarykarnaugh.code.tex' and its
+%% accompanying documentation and `The Copyright Holder' referring to the
+%% person Luis Paulo Laus.
+%%
+%% This software is based on Andreas W. Wieland's kvmacros.tex to whom
+%% the author wished to express his gratitude.
+%%
+%% IMPORTANT NOTICE:
+%%
+%% For error reports, comments or suggestions in case of UNCHANGED
+%% versions send mail to:
+%% laus@utfpr.edu.br
+%%
+%%
+\typeout{}
+\typeout{Macros for typesetting Karnaugh maps}
+\typeout{Version 1.1 of 10 January 2018}
+\typeout{by Luis Paulo Laus, laus@utfpr.edu.br}
+\typeout{}
+%%
+%% Change History:
+%% 1.0: 22 December 2017: Original Version ported from kvmacros.tex
+%% 1.1: 10 January 2018: new style for the map outer box. Support for
+%% options in the identifiers and values lists. New vertical mode.
+%% New keys to enable indices and disable bars. Macro file renamed
+%% to proper tikz library file name.
+%%
+%%
+%%
+%% Setting up some TikZ parameters for Karnaugh Maps
+%%
+\tikzset{
+ karnaugh/.style={
+ kmbar/.style={black,|-|,thin},
+ kmbar label/.style={black},
+ bar sep/.style={kmbar sep={##1}},
+ bar top sep/.style={kmbar top sep={##1}},
+ bar left sep/.style={kmbar left sep={##1}},
+ kmindex/.style={red,font=\tiny},
+ karnaugh index/.style={kmindex/.style={##1}},
+ kmcell/.style={black},
+ kmvar/.style={black},
+ kmbox/.style={thin},
+ kmlines/.style={thin},
+ every karnaugh/.try,
+ enable indices/.is if=enableindices,
+ disable bars/.is if=disablebars,
+ }
+}
+
+\pgfkeys{/pgf/.cd,
+ kmbar sep/.initial=0.2\kmunitlength,
+ kmbar top sep/.initial=1\kmunitlength,
+ kmbar left sep/.initial=1\kmunitlength,
+}
+
+%%
+%% New ifs for the options above
+%%
+\newif\ifenableindices
+\enableindicesfalse
+\newif\ifdisablebars
+\disablebarsfalse
+%%
+%% We need a fixed dimension for a single field in a Karnaugh map
+%% and also an auxiliary dimension to place the bars.
+%%
+\newdimen\kmunitlength
+\newdimen\kmtemplength
+\kmunitlength=8mm
+%%
+%% First, we have to introduce some counters:
+%%
+%% \kmrecursiondepth is used to control the recursion of the
+%% \karnaughmakemap.
+%%
+\newcount\kmrecursiondepth
+%%
+%% The \kmindexcounter is needed for the indices in the fields of the
+%% diagrams.
+%%
+\newcount\kmindexcounter
+%%
+%% \kmxsize and \kmysize store the dimensions of an entire diagram.
+%%
+\newcount\kmxsize
+\newcount\kmysize
+%%
+%% Some counters are necessary to compute the bars for the variable
+%% identifiers:
+%%
+\newcount\kmvarno
+\newcount\kmxvarno
+\newcount\kmyvarno
+\newcount\kmbarstart
+\newcount\kmbarlength
+\newcount\kmbarnum
+\newcount\kmbarmove
+\newcount\kmtemppos
+%%
+%% Single cells in a diagram should be indexed, which makes the map easier to
+%% use (ok, not really, but it might be useful).
+%%
+\def\kmcurrentindex{%
+\the\kmindexcounter\global\advance\kmindexcounter by 1}%
+%%
+%% We need a macro that computes the powers of two:
+%%
+\def\kmpoweroftwo#1#2{{% Computes #1=2^#2, both of which have to be counters
+ \ifnum#2>0
+ \global\multiply#1 by 2
+ \advance#2 by -1
+ \kmpoweroftwo{#1}{#2}
+ \fi}}
+%%
+%% The macros \kmargumentstring and \kmsetoptstr are needed to
+%% process the variable-length parameters in \karnaughmap:
+%%
+\def\kmargumentstring#1{\gdef\kmstringbuf{#1{}\noexpand\end}}
+%%
+%% The macro \kmsetoptstr reads one token from the list of parameters in
+%% \karnaughmap in the form <[opt]>srt and sets the optional style kmtempsty
+%% and saves its contents of the string srt in macro \kmstr
+%%
+\def\kmsetoptstr{\expandafter\kmgetonetok\kmstringbuf}
+%%
+%% The macros \kmgetonetok, \kmsplittok and \kmoptstrmake are
+%% auxiliary macros used to split the token and save to contents
+%%
+\def\kmgetonetok#1#2\end{\expandafter\kmsplittok#1{}\end \gdef\kmstringbuf{#2\noexpand\end}}
+\def\kmsplittok#1#2\end{\ifx#1[ \kmoptstrmake#2\end \else \kmoptstrmake]#1#2\end \fi}
+\def\kmoptstrmake#1]#2\end{\tikzset{kmtempsty/.style={#1}} \edef\kmstr{#2}}%\typeout{Teste #1 e #2}}
+%%\def\kmoptstrmake#1]#2\end{Test: #1 and #2.\par}
+%%
+%% The macro \karnaughmakemap calls itself recursively until the parameter #1
+%% equals 1, whereupon it draws one cell contents in a node and, if enabled,
+%% another node with the index.
+%%
+\def\karnaughmakemap#1#2#3#4{{%
+ \kmrecursiondepth #1\relax
+ \ifnum\kmrecursiondepth>1
+ \divide\kmrecursiondepth by 2
+ \edef\tempx{#3}
+ \edef\tempy{#4}
+ \kmtemppos=\tempx\relax
+ \advance\kmtemppos by \kmrecursiondepth
+ \edef\tempxs{\the\kmtemppos}
+ \kmtemppos=\tempy\relax
+ \advance\kmtemppos by \kmrecursiondepth
+ \edef\tempys{\the\kmtemppos}
+
+ \ifcase#2
+%%
+%% The parameter #2 of \karnaughmakemap is needed because the inner Karnaugh
+%% maps need to be mirrored. This is achieved by the following case-statement,
+%% which orders the inner Karnaugh maps properly:
+%% +---+---+
+%% | 0 | 1 |
+%% +---+---+
+%% | 2 | 3 |
+%% +---+---+
+%%
+%% Case 0: top-left Karnaugh map
+ \karnaughmakemap{\kmrecursiondepth}{0}{\tempx}{\tempys}%
+ \karnaughmakemap{\kmrecursiondepth}{1}{\tempxs}{\tempys}%
+ \karnaughmakemap{\kmrecursiondepth}{2}{\tempx}{\tempy}%
+ \karnaughmakemap{\kmrecursiondepth}{3}{\tempxs}{\tempy}%
+ \or
+%% Case 1: top-right Karnaugh map
+ \karnaughmakemap{\kmrecursiondepth}{1}{\tempxs}{\tempys}%
+ \karnaughmakemap{\kmrecursiondepth}{0}{\tempx}{\tempys}%
+ \karnaughmakemap{\kmrecursiondepth}{3}{\tempxs}{\tempy}%
+ \karnaughmakemap{\kmrecursiondepth}{2}{\tempx}{\tempy}%
+ \or
+%% Case 2: bottom-left Karnaugh map
+ \karnaughmakemap{\kmrecursiondepth}{2}{\tempx}{\tempy}%
+ \karnaughmakemap{\kmrecursiondepth}{3}{\tempxs}{\tempy}%
+ \karnaughmakemap{\kmrecursiondepth}{0}{\tempx}{\tempys}%
+ \karnaughmakemap{\kmrecursiondepth}{1}{\tempxs}{\tempys}%
+ \or
+%% Case 3: bottom-right Karnaugh map
+ \karnaughmakemap{\kmrecursiondepth}{3}{\tempxs}{\tempy}%
+ \karnaughmakemap{\kmrecursiondepth}{2}{\tempx}{\tempy}%
+ \karnaughmakemap{\kmrecursiondepth}{1}{\tempxs}{\tempys}%
+ \karnaughmakemap{\kmrecursiondepth}{0}{\tempx}{\tempys}%
+ \fi
+ \else
+ \ifenableindices
+ \node[kmindex,shift={(-0.3\kmunitlength,0.3\kmunitlength)}]
+ at (#3\kmunitlength,#4\kmunitlength) {\kmcurrentindex};
+ \fi
+ \kmsetoptstr{} % reads argument as <[opt]>str
+ \node[kmcell,kmtempsty] at (#3\kmunitlength,#4\kmunitlength){\kmstr};%
+ \fi}}%
+%%
+%% \karnaughmaketopbar typesets the variable bars of a Karnaugh map that are
+%% located on top of the diagram:
+%%
+\def\karnaughmaketopbar{%
+ \kmbarstart=1
+ \kmpoweroftwo{\kmbarstart}{\kmxvarno} % \kmybarstart is the start
+% position for the \foreach
+ \kmbarlength=\kmbarstart
+ \multiply\kmbarlength by 2 % \kmbarlength is the length of a bar
+ \kmbarmove=\kmbarstart
+ \multiply\kmbarmove by 4 % This is the move distance for the \draw.
+ \kmbarnum=\kmxsize
+ \divide\kmbarnum by \kmbarmove % This is the number of repetitions for
+% the \foreach.
+% The highest-order variable bar needs a special treatment:
+ \ifnum\kmbarnum=0\kmbarnum=1\divide\kmbarlength by 2\fi
+ \advance\kmbarmove by \kmbarstart
+ \kmtemplength=\pgfkeysvalueof{/pgf/kmbar top sep}
+ \multiply \kmtemplength by \kmxvarno
+ \advance \kmtemplength by \pgfkeysvalueof{/pgf/kmbar sep}
+ \advance \kmtemplength by \kmysize\kmunitlength
+ \kmsetoptstr % reads argument as <[opt]>str
+ \ifnum\kmbarnum=1
+ \draw[kmbar,xshift=\kmbarstart\kmunitlength,yshift=\kmtemplength,kmtempsty]
+ (0,0) -- node[above, kmbar label,kmtempsty]{\kmstr} (\kmbarlength\kmunitlength,0);
+ \else
+ \foreach \x in {\kmbarstart,\kmbarmove,...,\kmxsize}
+ \draw[kmbar,xshift=\x\kmunitlength,yshift=\kmtemplength,kmtempsty]
+ (0,0) -- node[above, kmbar label,kmtempsty]{\kmstr} (\kmbarlength\kmunitlength,0);
+ \fi
+}
+%%
+%% \karnaughmakeleftbar typesets the variable bars of a Karnaugh map that are
+%% located on the left of the diagram:
+%%
+\def\karnaughmakeleftbar{%
+ \kmbarstart=1
+ \kmpoweroftwo{\kmbarstart}{\kmyvarno} % \kmbarstart is the start
+% position for the \foreach
+ \kmbarlength=\kmbarstart
+ \multiply\kmbarlength by 2 % \kmbarlength is the length of a bar
+ \kmbarmove=\kmbarstart
+ \multiply\kmbarmove by 4 % This now is the move distance for the
+% \foreach.
+ \kmbarnum=\kmysize
+ \divide\kmbarnum by \kmbarmove % This now is the number of
+% repetitions for the \draw.
+%The highest-order variable bar needs a special treatment:
+ \ifnum\kmbarnum=0\kmbarstart=0\kmbarnum=1\divide\kmbarlength by 2\fi
+ \advance\kmbarmove by \kmbarstart
+ \kmtemplength=-\pgfkeysvalueof{/pgf/kmbar left sep}
+ \multiply \kmtemplength by \kmyvarno
+ \advance \kmtemplength by -\pgfkeysvalueof{/pgf/kmbar sep}
+ \kmsetoptstr % reads argument as <[opt]>str
+ \ifnum\kmbarnum=1
+ \draw[kmbar,yshift=\kmbarstart\kmunitlength,xshift=\kmtemplength,kmtempsty]
+ (0,0) -- node[left,kmbar label,kmtempsty]{\kmstr} (0,\kmbarlength\kmunitlength);
+ \else
+ \foreach \y in {\kmbarstart,\kmbarmove,...,\kmysize}
+ \draw[kmbar,yshift=\y\kmunitlength,xshift=\kmtemplength,kmtempsty]
+ (0,0) -- node[left,kmbar label,kmtempsty]{\kmstr} (0,\kmbarlength\kmunitlength);
+ \fi
+}
+%% \karnaughmakebars calls \karnaughmaketopbar or \karnaughmakeleftbar
+%% depending on whether \kmvarno is odd or even.
+%%
+\def\karnaughmakebars{%
+ \ifnum\kmvarno>0
+ \let\next=\karnaughmakebars
+ \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
+ \advance\kmyvarno by -1
+ \karnaughmakeleftbar
+ \fi
+ \advance\kmvarno by -1
+ \else
+ \let\next=\relax
+ \fi
+ \next
+}
+%%
+%% \karnaughmap is the macro that a user calls if he wants to draw a
+%% Karnaugh map:
+%%
+\def\karnaughmap#1#2#3#4#5{%
+%%
+%% #1 is the number of variables in the Karnaugh map
+%% #2 is the identifier of the function
+%% #3 is the list of identifiers of those variables
+%% #4 is the list of tokens that have to be written into the map
+%% #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
+%%
+ \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
+ \kmxvarno=#1 % \kmxvarno is the number of variable bars on top
+ \advance\kmxvarno by -\kmyvarno
+ \kmxsize=1
+ \kmpoweroftwo{\kmxsize}{\kmxvarno}
+ \kmysize=1
+ \kmpoweroftwo{\kmysize}{\kmyvarno}
+ \kmtemppos=\kmxsize
+ \advance\kmtemppos by -1
+ \foreach \x in {1,...,\kmtemppos}
+ \draw[kmlines] (\x\kmunitlength,0) -- (\x\kmunitlength,\kmysize\kmunitlength);
+ \kmtemppos=\kmysize
+ \advance\kmtemppos by -1
+ \ifnum\kmtemppos>0
+ \foreach \y in {1,...,\kmtemppos}
+ \draw[kmlines] (0,\y\kmunitlength) -- (\kmxsize\kmunitlength,\y\kmunitlength);
+ \fi
+ \draw[kmbox] (0,0) rectangle (\kmxsize\kmunitlength,\kmysize\kmunitlength);
+ #5
+ \ifdisablebars\relax\else
+ \node[kmvar,above left] at (0,\kmysize\kmunitlength){#2};
+ \kmargumentstring{#3}
+ \karnaughmakebars
+ \fi
+ \pgftransformshift{\pgfpoint{0.5\kmunitlength}{0.5\kmunitlength}}
+ \kmvarno=#1 % \kmvarno is the total number of variables
+ \kmindexcounter=0
+ \kmargumentstring{#4}
+ \karnaughmakemap{\the\kmysize}{0}{0}{0}
+ \ifodd\kmvarno
+ \divide\kmxsize by 2
+ \karnaughmakemap{\the\kmysize}{1}{\the\kmxsize}{0}
+ \fi
+ \pgftransformreset
+}%
+%% Vertical Mode
+%% The next three macros are similar to the ones for normal mode.
+%% The macro \karnaughmakemapvert calls itself recursively until the parameter #1
+%% equals 1, whereupon it draws one cell contents in a node and, if enabled,
+%% another node with the index.
+%%
+\def\karnaughmakemapvert#1#2#3#4{{%
+ \kmrecursiondepth #1\relax
+ \ifnum\kmrecursiondepth>1
+ \divide\kmrecursiondepth by 2
+ \edef\tempx{#3}
+ \edef\tempy{#4}
+ \kmtemppos=\tempx\relax
+ \advance\kmtemppos by \kmrecursiondepth
+ \edef\tempxs{\the\kmtemppos}
+ \kmtemppos=\tempy\relax
+ \advance\kmtemppos by \kmrecursiondepth
+ \edef\tempys{\the\kmtemppos}
+
+ \ifcase#2
+%%
+%% The parameter #2 of \karnaughmakemapvert is needed because the inner Karnaugh
+%% maps need to be mirrored. This is achieved by the following case-statement,
+%% which orders the inner Karnaugh maps properly:
+%% +---+---+
+%% | 0 | 2 |
+%% +---+---+
+%% | 1 | 3 |
+%% +---+---+
+%%
+%% Case 0: top-left Karnaugh map
+ \karnaughmakemapvert{\kmrecursiondepth}{0}{\tempx}{\tempys}%
+ \karnaughmakemapvert{\kmrecursiondepth}{1}{\tempx}{\tempy}%
+ \karnaughmakemapvert{\kmrecursiondepth}{2}{\tempxs}{\tempys}%
+ \karnaughmakemapvert{\kmrecursiondepth}{3}{\tempxs}{\tempy}%
+ \or
+%% Case 1: bottom-left Karnaugh map
+ \karnaughmakemapvert{\kmrecursiondepth}{1}{\tempx}{\tempy}%
+ \karnaughmakemapvert{\kmrecursiondepth}{0}{\tempx}{\tempys}%
+ \karnaughmakemapvert{\kmrecursiondepth}{3}{\tempxs}{\tempy}%
+ \karnaughmakemapvert{\kmrecursiondepth}{2}{\tempxs}{\tempys}%
+ \or
+%% Case 2: top-right Karnaugh map
+ \karnaughmakemapvert{\kmrecursiondepth}{2}{\tempxs}{\tempys}%
+ \karnaughmakemapvert{\kmrecursiondepth}{3}{\tempxs}{\tempy}%
+ \karnaughmakemapvert{\kmrecursiondepth}{0}{\tempx}{\tempys}%
+ \karnaughmakemapvert{\kmrecursiondepth}{1}{\tempx}{\tempy}%
+ \or
+%% Case 3: bottom-right Karnaugh map
+ \karnaughmakemapvert{\kmrecursiondepth}{3}{\tempxs}{\tempy}%
+ \karnaughmakemapvert{\kmrecursiondepth}{2}{\tempxs}{\tempys}%
+ \karnaughmakemapvert{\kmrecursiondepth}{1}{\tempx}{\tempy}%
+ \karnaughmakemapvert{\kmrecursiondepth}{0}{\tempx}{\tempys}%
+ \fi
+ \else
+ \ifenableindices
+ \node[kmindex,shift={(-0.3\kmunitlength,0.3\kmunitlength)}]
+ at (#3\kmunitlength,#4\kmunitlength) {\kmcurrentindex};%
+ \fi
+ \kmsetoptstr{} % reads argument as <[opt]>str
+ \node[kmcell,kmtempsty] at (#3\kmunitlength,#4\kmunitlength){\kmstr};%
+ \fi}}%
+%%
+%% \karnaughmakebarsvert calls \karnaughmaketopbar or \karnaughmakeleftbar
+%% depending on whether \kmvarno is odd or even.
+%%
+\def\karnaughmakebarsvert{%
+ \ifnum\kmvarno>0
+ \let\next=\karnaughmakebarsvert
+ \ifodd\kmvarno % We have to make a bar at the left
+ \advance\kmyvarno by -1
+ \karnaughmakeleftbar
+ \else % We have to make a bar at the top
+ \advance\kmxvarno by -1
+ \karnaughmaketopbar
+ \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):
+%%
+\def\karnaughmapvert#1#2#3#4#5{%
+%%
+%% #1 is the number of variables in the Karnaugh map
+%% #2 is the identifier of the function
+%% #3 is the list of identifiers of those variables
+%% #4 is the list of tokens that have to be written into the map
+%% #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
+%%
+ \kmvarno=#1 % \kmvarno is the total number of variables
+ \kmxvarno=#1 % \kmxvarno is the number of variable bars on top
+ \divide\kmxvarno by 2
+ \kmyvarno=#1 % \kmyvarno is the number of variable bars at the left
+ \advance\kmyvarno by -\kmxvarno
+ \kmxsize=1
+ \kmpoweroftwo{\kmxsize}{\kmxvarno}
+ \kmysize=1
+ \kmpoweroftwo{\kmysize}{\kmyvarno}
+ \kmtemppos=\kmxsize
+ \advance\kmtemppos by -1
+ \ifnum\kmtemppos>0
+ \foreach \x in {1,...,\kmtemppos}
+ \draw[kmlines] (\x\kmunitlength,0) -- (\x\kmunitlength,\kmysize\kmunitlength);
+ \fi
+ \kmtemppos=\kmysize
+ \advance\kmtemppos by -1
+ \foreach \y in {1,...,\kmtemppos}
+ \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};
+ \kmargumentstring{#3}
+ \karnaughmakebarsvert
+ \fi
+ \pgftransformshift{\pgfpoint{0.5\kmunitlength}{0.5\kmunitlength}}
+ \kmvarno=#1 % \kmvarno is the total number of variables
+ \kmindexcounter=0
+ \kmargumentstring{#4}
+ \ifodd\kmvarno
+ \divide\kmysize by 2
+ \karnaughmakemapvert{\the\kmxsize}{0}{0}{\the\kmysize}
+ \karnaughmakemapvert{\the\kmxsize}{1}{0}{0}
+ \else
+ \karnaughmakemapvert{\the\kmxsize}{0}{0}{0}
+ \fi
+ \pgftransformreset
+}%