summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/karnaugh/kvmacros.tex
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/karnaugh/kvmacros.tex')
-rw-r--r--macros/latex/contrib/karnaugh/kvmacros.tex489
1 files changed, 489 insertions, 0 deletions
diff --git a/macros/latex/contrib/karnaugh/kvmacros.tex b/macros/latex/contrib/karnaugh/kvmacros.tex
new file mode 100644
index 0000000000..eb56212a5c
--- /dev/null
+++ b/macros/latex/contrib/karnaugh/kvmacros.tex
@@ -0,0 +1,489 @@
+%% This is file `kvmacros.tex',
+%% Version of January 7th, 2002
+%%
+%% Copyright (C) 1998-2002 by Andreas W. Wieland, awwieland@gmx.de
+%%
+%% This program 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 Program' referring to the software `kvmacros.tex' and its
+%% accompanying documentation and `The Copyright Holder' referring to the
+%% person Andreas W. Wieland.
+%%
+%%
+%%
+%% IMPORTANT NOTICE:
+%%
+%% For error reports, comments or suggestions in case of UNCHANGED
+%% versions send mail to:
+%% awwieland@gmx.de
+%%
+%% Anyway, if you use my macros, send me an eMail, too. I would like to know
+%% if they are useful to somebody out there.
+%%
+%% Please do not request updates from me directly. Distribution is
+%% done through Mail-Servers and TeX organizations.
+%%
+%% You are allowed to distribute this file under the condition that
+%% it is distributed together with `kvdoc.tex', `kvdoc.dvi' and `kvdoc.ps'.
+%%
+%% If you receive this file alone from someone, complain!
+%%
+\typeout{}
+\typeout{Macros for typesetting Karnaugh maps and Veitch charts}
+\typeout{Version of January 7th, 2002}
+\typeout{by Andreas W. Wieland, awwieland@gmx.de}
+\typeout{}
+%%
+%% Change History:
+%% August 04th, 1998: Original Version
+%%
+%% August 19th, 1998: Minor changes to make the lines within the maps look
+%% better, also moved the variable identifiers from the right to the left and
+%% added an identifier for the logic function; since then \kvmap has 5
+%% instead of 4 parameters. I also included the documentation in an additional
+%% Postscript-file.
+%%
+%% September 23rd, 1998: Fixed the problem with double braces by introducing
+%% the \compdummy and \ende macros in the \ifx-comparisons (see below):
+%% The parameters that are longer than one character do not have to be
+%% enclosed in double braces any longer --- single braces are
+%% sufficient. However, double braces will still be processed correctly.
+%%
+%% May 19th, 1999: Changed the documentation (which was months overdue) after
+%% F. M. Brown pointed me to the incorrectness of the term
+%% "Karnaugh-Veitch-map". Actually, the macros itself haven't
+%% changed. Probably I should introduce macros for typesetting Veitch charts
+%% as well (which would be a minor task). This version was actually never
+%% released.
+%%
+%% May 25th, 1999: Introduced macros for Veitch charts
+%% (\veitchfoo) and renamed the macros that are solely related to
+%% Karnaugh maps from \kvfoo to \karnaughfoo. Introduced aliases for those
+%% macros that are user-callable to maintain compatibility with older versions:
+%% \kvmap -> \karnaughmap. However, \kvindex, \kvnoindex and \kvunitlength
+%% haven't changed their names as they are related to both Karnaugh maps and
+%% Veitch charts. Changed the (plain stupid) algorithm that processes the
+%% variable-length arguments so that it takes much less time to produce large
+%% maps. Several macros so became redundant and are no longer included. Also I
+%% introduced \kvindexsize and \kvcontentsize to adjust the font size of the
+%% indices and the contents of a diagram. They default to \tiny and
+%% \normalsize.
+%%
+%% January 17th, 2001: Changed the eMail-address in the macro file and the
+%% accompanying documentation and made minor changes to the documentation.
+%%
+%% January 7th, 2002: Exchanged the \xdef to \gdef in the definition of
+%% \kvargumentstring and \kvgetonechar so that things like {\textbf 1} in the
+%% argumentlist of \karnaughmap do not cause error messages any longer.
+%% Thanks to Michal Medveck{\'y} for pointing me to this error.
+%%
+%%
+%%
+%% We need a fixed dimension for a single field in a Karnaugh map:
+%%
+\newdimen\kvunitlength
+\kvunitlength=8mm
+%%
+%% We need a default font size for the indices:
+%%
+\newcommand{\kvindexsize}{\tiny}
+%%
+%% And we need a default size for the contents and variable identifiers:
+%%
+\newcommand{\kvcontentsize}{\normalsize}
+%%
+%% First, we have to introduce some counters:
+%%
+%% \kvrecursiondepth is used to control the recursion of the
+%% \karnaughmakemap- and \veitchmakechart-macro.
+%%
+\newcount\kvrecursiondepth
+%%
+%% The \kvindexcounter is needed for the indices in the fields of the
+%% diagrams.
+%%
+\newcount\kvindexcounter
+%%
+%% \kvxsize and \kvysize store the dimensions of an entire diagram.
+%%
+\newcount\kvxsize
+\newcount\kvysize
+%%
+%% Some counters are necessary to compute the marks for the variable
+%% identifiers:
+%%
+\newcount\kvvarno
+\newcount\kvxvarno
+\newcount\kvyvarno
+\newcount\kvmarkstart
+\newcount\kvmarklength
+\newcount\kvmarknum
+\newcount\kvmarkmove
+%%
+%% And we need a savebox to store the variable marks:
+%%
+\newsavebox\kvsavebox
+%%
+%% Single fields in a diagram should be indexed, which makes the map easier to
+%% use. This is the default. If you don't want indices, simply call
+%% \kvnoindex. If you want indices back, call \kvindex:
+%%
+\def\kvnoindex{%
+\def\kvcurrentindex{}}
+%%
+\def\kvindex{%
+\def\kvcurrentindex{%
+\the\kvindexcounter\global\advance\kvindexcounter by 1}%
+}
+%%
+\kvindex
+%%
+%% We need a macro that computes the powers of two:
+%%
+\def\kvpoweroftwo#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
+\kvpoweroftwo{#1}{#2}
+\fi}}
+%%
+%% The macros \kvargumentstring, \kvgetchar and \kvgetonechar are needed to
+%% process the variabe-length parameters in \karnaughmap and \veitchchart:
+%%
+\def\kvargumentstring#1{\gdef\kvdummystring{#1{}\noexpand\end}}
+%%
+\def\kvgetchar{\expandafter\kvgetonechar\kvdummystring}
+%%
+\def\kvgetonechar#1#2\end{{#1}\gdef\kvdummystring{#2\noexpand\end}}%
+%%
+%% The Macro \karnaughmakemap calls itself recursively until the parameter #1
+%% equals 1, whereupon it returns a single token from the list of arguments,
+%% enclosed in a \makebox plus the index (if enabled) in a smaller \makebox:
+%%
+\def\karnaughmakemap#1#2{{%
+\kvrecursiondepth=\number#1
+\ifnum\kvrecursiondepth>1
+\divide\kvrecursiondepth by 2
+\unitlength=\kvunitlength
+\multiply\unitlength by \kvrecursiondepth
+%%
+\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:
+%%
+%% Case 0: top-left Karnaugh map
+\begin{picture}(2,2)%
+\put(0,1){\karnaughmakemap{\kvrecursiondepth}{0}}%
+\put(1,1){\karnaughmakemap{\kvrecursiondepth}{1}}%
+\put(0,0){\karnaughmakemap{\kvrecursiondepth}{2}}%
+\put(1,0){\karnaughmakemap{\kvrecursiondepth}{3}}%
+\end{picture}%
+\or
+%% Case 1: top-right Karnaugh map
+\begin{picture}(2,2)%
+\put(1,1){\karnaughmakemap{\kvrecursiondepth}{1}}%
+\put(0,1){\karnaughmakemap{\kvrecursiondepth}{0}}%
+\put(1,0){\karnaughmakemap{\kvrecursiondepth}{3}}%
+\put(0,0){\karnaughmakemap{\kvrecursiondepth}{2}}%
+\end{picture}%
+\or
+%% Case 2: bottom-left Karnaugh map
+\begin{picture}(2,2)%
+\put(0,0){\karnaughmakemap{\kvrecursiondepth}{2}}%
+\put(1,0){\karnaughmakemap{\kvrecursiondepth}{3}}%
+\put(0,1){\karnaughmakemap{\kvrecursiondepth}{0}}%
+\put(1,1){\karnaughmakemap{\kvrecursiondepth}{1}}%
+\end{picture}%
+\or
+%% Case 3: bottom-right Karnaugh map
+\begin{picture}(2,2)%
+\put(1,0){\karnaughmakemap{\kvrecursiondepth}{3}}%
+\put(0,0){\karnaughmakemap{\kvrecursiondepth}{2}}%
+\put(1,1){\karnaughmakemap{\kvrecursiondepth}{1}}%
+\put(0,1){\karnaughmakemap{\kvrecursiondepth}{0}}%
+\end{picture}%
+\fi
+\else
+\unitlength=\kvunitlength
+\begin{picture}(1,1)
+\put(0,0){\makebox(1,1){\kvcontentsize\kvgetchar}}%
+\put(0.05,0.05){\makebox(0.9,0.9)[bl]{\kvindexsize\kvcurrentindex}}%
+\end{picture}
+\fi}}%
+%%
+%% \karnaughmaketopmark typesets the variable marks of a Karnaugh map that are
+%% located on top of the diagram:
+%%
+\def\karnaughmaketopmark{%
+ \unitlength\kvunitlength
+ \begin{picture}(\kvxsize,1)
+ \kvmarkstart=1
+ \kvpoweroftwo{\kvmarkstart}{\kvxvarno} % \kvymarkstart is the start
+ % position for the \multiput
+ \kvmarklength=\kvmarkstart
+ \multiply\kvmarklength by 2 % \kvmarklength is the length of a mark
+ \kvmarkmove=\kvmarkstart
+ \multiply\kvmarkmove by 4 % This is the move distance for the \multiput.
+ \kvmarknum=\kvxsize
+ \divide\kvmarknum by \kvmarkmove % This is the number of repetitions for
+ % the \multiput.
+ %The highest-order variable mark needs a special treatment:
+ \ifnum\kvmarknum=0\kvmarknum=1\divide\kvmarklength by 2\fi
+ \savebox\kvsavebox(\kvmarklength,1){%
+ \begin{picture}(\kvmarklength,1)
+ \put(0,0.3){\makebox(\kvmarklength,0.7){\kvcontentsize\kvgetchar}}
+ \put(0,0.1){\line(0,1){0.4}}
+ \put(\kvmarklength,0.1){\line(0,1){0.4}}
+ \put(0,0.3){\line(1,0){\kvmarklength}}
+ \end{picture}}
+ \multiput(\kvmarkstart,0)(\kvmarkmove,0){\kvmarknum}{\usebox\kvsavebox}
+ \end{picture}
+}
+%%
+%% \karnaughmakeleftmark typesets the variable marks of a Karnaugh map that are
+%% located on the left of the diagram:
+%%
+\def\karnaughmakeleftmark{%
+ \unitlength\kvunitlength
+ \begin{picture}(-1,\kvysize)(0,-\kvysize)
+ \kvmarkstart=1
+ \kvpoweroftwo{\kvmarkstart}{\kvyvarno} % \kvmarkstart is the start
+ % position for the \multiput
+ \kvmarklength=\kvmarkstart
+ \multiply\kvmarklength by 2 % \kvmarklength is the length of a mark
+ \kvmarkmove=\kvmarkstart
+ \multiply\kvmarkmove by 4 % This now is the move distance for the
+ % \multiput.
+ \kvmarknum=\kvysize
+ \divide\kvmarknum by \kvmarkmove % This now is the number of
+ % repetitions for the \multiput.
+ %The highest-order variable mark needs a special treatment:
+ \ifnum\kvmarknum=0\kvmarknum=1\divide\kvmarklength by 2\fi
+ \advance\kvmarkstart by \kvmarklength
+ \savebox\kvsavebox(1,\kvmarklength){%
+ \begin{picture}(1,\kvmarklength)
+ \put(-0.3,0){\makebox(-0.7,\kvmarklength){\kvcontentsize\kvgetchar}}
+ \put(-0.1,0){\line(-1,0){0.4}}
+ \put(-0.1,\kvmarklength){\line(-1,0){0.4}}
+ \put(-0.3,0){\line(0,1){\kvmarklength}}
+ \end{picture}}
+ \multiput(0,-\kvmarkstart)(0,-\kvmarkmove){\kvmarknum}{\usebox\kvsavebox}
+ \end{picture}
+}
+%% \karnaughmakemarks calls \karnaughmaketopmark or \karnaughmakeleftmark
+%% depending on whether \kvvarno is odd or even.
+%%
+\def\karnaughmakemarks{%
+\ifnum\kvvarno>0
+ \let\next=\karnaughmakemarks
+ \ifodd\kvvarno % We have to make a mark at the top
+ \advance\kvxvarno by -1
+ \put(0,\kvxvarno){\karnaughmaketopmark}
+ \else % We have to make a mark at the left
+ \advance\kvyvarno by -1
+ \put(-\kvyvarno,-\kvysize){\karnaughmakeleftmark}
+ \fi
+ \advance\kvvarno 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 is something that you want to draw inside the Karnaugh map
+%%
+\kvvarno=#1 % \kvvarno is the total number of variables
+\kvyvarno=#1 % \kvyvarno is the number of variable marks at the left
+\divide\kvyvarno by 2
+\kvxvarno=#1 % \kvxvarno is the number of variable marks on top
+\advance\kvxvarno by -\kvyvarno
+\kvxsize=1
+\kvpoweroftwo{\kvxsize}{\kvxvarno}
+\kvysize=1
+\kvpoweroftwo{\kvysize}{\kvyvarno}
+\advance\kvxsize by \kvyvarno
+\advance\kvxvarno by \kvysize
+\unitlength\kvunitlength
+\begin{picture}(\kvxsize,\kvxvarno)(-\kvyvarno,-\kvysize)
+\advance\kvxsize by -\kvyvarno
+\advance\kvxvarno by -\kvysize
+\put(0,-\kvysize){%
+\begin{picture}(\kvxsize,\kvysize)
+\multiput(0,0)(0,1){\kvysize}{\line(1,0){\kvxsize}}
+\multiput(0,0)(1,0){\kvxsize}{\line(0,1){\kvysize}}
+\put(0,\kvysize){\line(1,0){\kvxsize}}
+\put(\kvxsize,0){\line(0,1){\kvysize}}
+#5
+\end{picture}}
+\put(-\kvyvarno,0){\makebox(\kvyvarno,\kvxvarno){#2}}
+\kvindexcounter=0
+\kvargumentstring{#4}
+\put(0,-\kvysize){\karnaughmakemap{\kvysize}{0}}
+\ifodd\kvvarno
+{\divide\kvxsize by 2
+\put(\kvxsize,-\kvysize){\karnaughmakemap{\kvysize}{1}}}
+\fi
+\kvargumentstring{#3}
+\karnaughmakemarks
+%%
+\end{picture}
+}%
+%%
+%% The definition of \kvmap is necessary to maintain compatibility with older
+%% versions of this macro package:
+%%
+\def\kvmap{\karnaughmap}%
+%%
+%%
+%% The Macro \veitchmakechart calls itself recursively until the parameter #1
+%% equals 1, whereupon it returns a single token from the list of arguments,
+%% enclosed in a \makebox plus the index (if enabled) in a smaller \makebox:
+%%
+\def\veitchmakechart#1{{%
+\kvrecursiondepth=\number#1
+\ifnum\kvrecursiondepth>1
+\divide\kvrecursiondepth by 2
+\unitlength=\kvunitlength
+\multiply\unitlength by \kvrecursiondepth
+%%
+\begin{picture}(2,2)%
+\put(0,1){\veitchmakechart{\kvrecursiondepth}}%
+\put(1,1){\veitchmakechart{\kvrecursiondepth}}%
+\put(0,0){\veitchmakechart{\kvrecursiondepth}}%
+\put(1,0){\veitchmakechart{\kvrecursiondepth}}%
+\end{picture}%
+\else
+\unitlength=\kvunitlength
+\begin{picture}(1,1)
+\put(0,0){\makebox(1,1){\kvcontentsize\kvgetchar}}%
+\put(0.05,0.05){\makebox(0.9,0.9)[bl]{\kvindexsize\kvcurrentindex}}%
+\end{picture}
+\fi}}%
+%%
+\def\veitchmaketopmark{%
+ \unitlength\kvunitlength
+ \begin{picture}(\kvxsize,1)
+ \kvmarkstart=1
+ \kvpoweroftwo{\kvmarkstart}{\kvxvarno} % \kvymarkstart is the start
+ % position for the \multiput
+ \kvmarklength=\kvmarkstart % \kvmarklength is the length of a mark
+ \kvmarkmove=\kvmarkstart
+ \multiply\kvmarkmove by 2 % This is the move distance for the \multiput.
+ \kvmarknum=\kvxsize
+ \divide\kvmarknum by \kvmarkmove % This is the number of repetitions for
+ % the \multiput.
+ \savebox\kvsavebox(\kvmarklength,1){%
+ \begin{picture}(\kvmarklength,1)
+ \put(0,0.3){\makebox(\kvmarklength,0.7){\kvcontentsize\kvgetchar}}
+ \put(0,0.1){\line(0,1){0.4}}
+ \put(\kvmarklength,0.1){\line(0,1){0.4}}
+ \put(0,0.3){\line(1,0){\kvmarklength}}
+ \end{picture}}
+ \multiput(\kvmarkstart,0)(\kvmarkmove,0){\kvmarknum}{\usebox\kvsavebox}
+ \end{picture}
+}
+%%
+\def\veitchmakeleftmark{%
+ \unitlength\kvunitlength
+ \begin{picture}(-1,\kvysize)(0,-\kvysize)
+ \kvmarkstart=1
+ \kvpoweroftwo{\kvmarkstart}{\kvyvarno} % \kvmarkstart is the start
+ % position for the \multiput
+ \kvmarklength=\kvmarkstart
+ \kvmarkmove=\kvmarkstart
+ \multiply\kvmarkmove by 2 % This now is the move distance for the \multiput.
+ \kvmarknum=\kvysize
+ \divide\kvmarknum by \kvmarkmove % This now is the number of
+ % repetitions for the \multiput.
+ \advance\kvmarkstart by \kvmarklength
+ \savebox\kvsavebox(1,\kvmarklength){%
+ \begin{picture}(1,\kvmarklength)
+ \put(-0.3,0){\makebox(-0.7,\kvmarklength){\kvcontentsize\kvgetchar}}
+ \put(-0.1,0){\line(-1,0){0.4}}
+ \put(-0.1,\kvmarklength){\line(-1,0){0.4}}
+ \put(-0.3,0){\line(0,1){\kvmarklength}}
+ \end{picture}}
+ \multiput(0,-\kvmarkstart)(0,-\kvmarkmove){\kvmarknum}{\usebox\kvsavebox}
+ \end{picture}
+}
+%%
+\def\veitchmakemarks{%
+\ifnum\kvvarno>0
+ \let\next=\veitchmakemarks
+ \ifodd\kvvarno % We have to make a mark at the top
+ \advance\kvxvarno by -1
+ \put(0,\kvxvarno){\veitchmaketopmark}
+ \else % We have to make a mark at the left
+ \advance\kvyvarno by -1
+ \put(-\kvyvarno,-\kvysize){\veitchmakeleftmark}
+ \fi
+ \advance\kvvarno by -1
+\else
+ \let\next=\relax
+\fi
+\next
+}
+%%
+\def\veitchchart#1#2#3#4#5{%
+%%
+%% #1 is the number of variables in the Veitch chart
+%% #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 chart
+%% #5 is something that you want to draw inside the Veitch chart
+%%
+\kvvarno=#1 % \kvvarno is the total number of variables
+\kvyvarno=#1 % \kvyvarno is the number of variable marks at the left
+\divide\kvyvarno by 2
+\kvxvarno=#1 % \kvxvarno is the number of variable marks on top
+\advance\kvxvarno by -\kvyvarno
+\kvxsize=1
+\kvpoweroftwo{\kvxsize}{\kvxvarno}
+\kvysize=1
+\kvpoweroftwo{\kvysize}{\kvyvarno}
+\advance\kvxsize by \kvyvarno
+\advance\kvxvarno by \kvysize
+\unitlength\kvunitlength
+\begin{picture}(\kvxsize,\kvxvarno)(-\kvyvarno,-\kvysize)
+\advance\kvxsize by -\kvyvarno
+\advance\kvxvarno by -\kvysize
+\put(0,-\kvysize){%
+\begin{picture}(\kvxsize,\kvysize)
+\multiput(0,0)(0,1){\kvysize}{\line(1,0){\kvxsize}}
+\multiput(0,0)(1,0){\kvxsize}{\line(0,1){\kvysize}}
+\put(0,\kvysize){\line(1,0){\kvxsize}}
+\put(\kvxsize,0){\line(0,1){\kvysize}}
+#5
+\end{picture}}
+\put(-\kvyvarno,0){\makebox(\kvyvarno,\kvxvarno){#2}}
+\kvindexcounter=0
+\kvargumentstring{#4}
+\put(0,-\kvysize){\veitchmakechart{\kvysize}}
+\ifodd\kvvarno
+{\divide\kvxsize by 2
+\put(\kvxsize,-\kvysize){\veitchmakechart{\kvysize}}}
+\fi
+\kvargumentstring{#3}
+\veitchmakemarks
+%%
+\end{picture}
+}%
+%%
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: t
+%%% End: