diff --git a/kvdoc.pdf b/kvdoc.pdf new file mode 100644 index 0000000..091e9de Binary files /dev/null and b/kvdoc.pdf differ diff --git a/kvdoc.tex b/kvdoc.tex new file mode 100644 index 0000000..9f938ca --- /dev/null +++ b/kvdoc.tex @@ -0,0 +1,924 @@ +\documentclass{article} +\input kvmacros +\sloppy +\begin{document} +\title{Typesetting Karnaugh Maps and Veitch Charts with \LaTeX} +\author{Andreas W. Wieland\\eMail: \texttt{awwieland@gmx.de}} +\date{January 7th, 2002} +\maketitle + + +\section{Abstract} + +Karnaugh maps and Veitch charts\footnote{In previous releases of this document + I referred to Karnaugh maps as Karnaugh-Veitch-Maps. This was definitely not + correct. Thanks to F.~M.~Brown for pointing this error out to me.} are used + to simplify logic equations. The drawing of them used to be a boring, + annoying and error-prone task. With the included macros this is no longer a + problem. They can typeset Karnaugh maps and Veitch charts with up to ten + variables, which is more than you might likely need. You only have to provide + a list of variable identifiers plus the function table of your logic + function(s). The macros also allow to mark the simplifications of your logic + function directly within a Karnaugh map or Veitch chart. + +\section{Introduction} + +Karnaugh maps and Veitch charts are used to simplify logic equations. They are +map representations of logic functions, and in that they are equivalent. The +difference between the two kinds of diagrams is the way in which the variables +of the functions are located within the diagrams: ``The Karnaugh map \ldots{} +displays a function's discriminants according to the reflected binary (Gray) +code. The Veitch chart \ldots{} displays the discriminants in natural binary +order.'' (F.~M.~Brown) + +However, the drawing of either kind of them used to be a boring, annoying and +error-prone task. Since I had to typeset a 50+~page collection of exercises +for a basic computer-science lecture with plenty of Karnaugh maps in it, I +decided to write some macros that would do this task for me. Let us start +first with an introduction on how to use these Macros: + +The first thing you have to do is to put the macro file \verb|kvmacros.tex| +into a directory where \TeX{} will find it, i.e. you have to put it into a +directory where your \texttt{TEXINPUTS} environment variable points to. You +can then load them by typing +\verb|\input kvmacros| somewhere in the preamble of your document. + +Suppose now you have a logic function~$f$ with the following function table: + +\begin{center} + +\begin{tabular}{lr} + \begin{tabular}[t]{r|cccc|c} +Index&$a$&$b$&$c$&$d$&$f$\\ +\hline +0&0&0&0&0&1\\ +1&0&0&0&1&1\\ +2&0&0&1&0&1\\ +3&0&0&1&1&0\\ +4&0&1&0&0&0\\ +5&0&1&0&1&1\\ +6&0&1&1&0&1\\ +7&0&1&1&1&0\\ + \end{tabular} +& + \begin{tabular}[t]{r|cccc|c} +Index&$a$&$b$&$c$&$d$&$f$\\ +\hline +8&1&0&0&0&0\\ +9&1&0&0&1&1\\ +10&1&0&1&0&1\\ +11&1&0&1&1&0\\ +12&1&1&0&0&0\\ +13&1&1&0&1&1\\ +14&1&1&1&0&1\\ +15&1&1&1&1&0\\ + \end{tabular} +\end{tabular} +\end{center} + +This logic function can easily be put into a Karnaugh map by using the +\verb|\karnaughmap|-macro\footnote{Users of older versions of the macro +package will notice that the name has changed. Below you will find a +discussion of the changes between versions.}. It has five parameters: The +number of variables in the map, an identifier for the function, a list of +variable identifiers for the variables, and the list of values of $f$ for +each line in the function table. The variable identifiers in the third +parameter are ordered from highest to lowest significance (the same way as in +the function table, with $a$ having a significance of $2^3=8$ and $d$ having a +significance of $2^0=1$). The list of values of $f$ was read from lowest to +highest index. The fifth parameter remains empty in this example, it will be +discussed below: + +\begin{verbatim} +\karnaughmap{4}{f(a,b,c,d):}{abcd}{1110011001100110}{} +\end{verbatim} + +This produces the following Karnaugh map, where the indices in the lower left +corner of each box correspond to the indices in the function +table:\footnote{The indices can easily be calculated from the variable values + in the function table, i.e. line 11: the index equals $a\cdot 2^3 + b\cdot + 2^2 + c \cdot 2^1 + d \cdot 2^0=1\cdot 8 + 0\cdot 4 + 1 \cdot 2 + 1 \cdot + 1=11$.} + +\begin{center} +\karnaughmap{4}{f(a,b,c,d):}{abcd}{1110011001100110}{} +\end{center} + +The macros work similar for Veitch charts: + +\begin{verbatim} +\veitchchart{4}{f(a,b,c,d):}{abcd}{0110011001100110}{} +\end{verbatim} + +\begin{center} +\veitchchart{4}{f(a,b,c,d):}{abcd}{0110011001100110}{} +\end{center} + +Notice the difference in the variable location in the diagrams. In my opinion +Karnaugh maps are much easier to use if you need to simplify a logic function; +therefore Veitch charts will not be discussed any further in this +document. Except otherwise noticed, the macros' syntax and functionality are +exactly the same for Karnaugh maps and Veitch charts. + +The macros that read the variable list and the list of logic values +(i.e. parameters \#3 and \#4) work +recursively. Therefore, you have to take special care to supply the +correct number of tokens to print: If you supply a list of variable +identifiers or a list of logic values that contains fewer elements than needed +the macros will cause error messages similar to the following: + +\begin{verbatim} +! Argument of \kvgetonechar has an extra }. + + \par +l.201 }{} + +? +\end{verbatim} + +On the contrary, if any of the two lists is longer than +needed, \emph{you will not be notified!} Moreover, each entry has to be one +character long, otherwise --- like a variable identifier enclosed in \$s --- +you have to put it into braces: + +\begin{verbatim} +\karnaughmap{4}{$f(a,b,c,d):$}{{$a$}{$b$}{$c$}{$d$}}{0110011001100110}{} +\end{verbatim} + +This produces the following Karnaugh map: + +\begin{center} +\karnaughmap{4}{$f(a,b,c,d):$}{{$a$}{$b$}{$c$}{$d$}}{0110011001100110}{} +\end{center} + +\section{Marking simplifications} + +The already mentioned fifth parameter can be used if you want to draw +something inside the Karnaugh map. For example this is useful if you want to +show how you simplified a logic function: + +\begin{verbatim} +\karnaughmap{4}{$f(a,b,c,d):$}{{$a$}{$b$}{$c$}{$d$}}% +{0110011001100110}% +{% +\put(0,2){\oval(1.9,1.9)[r]} +\put(4,2){\oval(1.9,1.9)[l]} +\put(2,0){\oval(1.9,1.9)[t]} +\put(2,4){\oval(1.9,1.9)[b]} +} +\end{verbatim} + +The corresponding Karnaugh map looks like this: + +\begin{center} +\karnaughmap{4}{$f(a,b,c,d):$}{{$a$}{$b$}{$c$}{$d$}}% +{0110011001100110}% +{% +\put(0,2){\oval(1.9,1.9)[r]} +\put(4,2){\oval(1.9,1.9)[l]} +\put(2,0){\oval(1.9,1.9)[t]} +\put(2,4){\oval(1.9,1.9)[b]} +} +\end{center} + +You can use any of \LaTeX's graphics macros for this purpose. The Karnaugh map +has its pivot point at the lower left point\footnote{This is not exactly true, +but sufficient if you do not want to modify the macros.} and a unitlength that +is equal to the length of a single box within the Karnaugh map. Sometimes you +may find that the \verb|\oval|s that you want to draw inside a Karnaugh map are +slightly shifted to the right. This occurs if you use the \verb|eepic|-Package +in your document. In this case, make a copy of the \verb|eepic.sty| file, +rename it to something like \verb|myeepic.sty| and comment out the definition +of the \verb|\oval|-macro in your local copy. If you put this new +\verb|myeepic.sty| file somewhere into your \TeX's search path so that \TeX{} +can find it and you load it properly with e.g. \verb|\usepackage{myeepic}|, +you shouldn't experience any more trouble. + +\section{Other features} + +There are some more features that you can use. Possibly the most important is +that you can change the size of the diagrams by changing the size of the +boxes within the map, simply by typing: + +\begin{verbatim} +\kvunitlength=15mm +\karnaughmap{4}{$f:$}{abcd}{0110011001100110}{} +\end{verbatim} + +This results in the following Karnaugh map. The setting of the +\verb|\kvunitlength| remains active until you change it again;\footnote{Or, of + course, until you leave the group in which you redefined the value. This + applies to all changeable parameters and macro definitions in this section!} +the default \verb|\kvunitlength| is 8\,mm: + +\begin{center} +\kvunitlength=15mm +\karnaughmap{4}{$f:$}{abcd}{0110011001100110}{} +\end{center} + +Another feature is that you can switch off the indices inside the map by +typing: + +\begin{verbatim} +\kvnoindex +\karnaughmap{4}{$f:$}{abcd}{0110011001100110}{} +\end{verbatim} + +\begin{center} +\kvunitlength=8mm +\kvnoindex +\karnaughmap{4}{$f:$}{abcd}{0110011001100110}{} +\end{center} + +This setting also remains active until you switch indexing on again using the +\verb|\kvindex|-macro: + +\begin{verbatim} +\kvindex +\karnaughmap{4}{$f:$}{abcd}{0110011001100110}{} +\end{verbatim} + +\begin{center} +\kvindex +\karnaughmap{4}{$f:$}{abcd}{0110011001100110}{} +\end{center} + +Usually, the font size of the map's contents and indices should be +suitable (the defaults are \verb|\tiny| for \verb|\kvindexsize| and +\verb|\normalsize| for \verb|\kvcontentsize|). If you want to change them, you +can do this by redefining the \verb|\kvcontentsize|- and +\verb|\kvindexsize|-macros (Preferably, you should do this in the preamble of +your document): + +\begin{verbatim} +\renewcommand\kvindexsize{\footnotesize} +\karnaughmap{4}{$f:$}{abcd}{0110011001100110}{} +\end{verbatim} + +\begin{center} +\renewcommand\kvindexsize{\footnotesize} +\karnaughmap{4}{$f:$}{abcd}{0110011001100110}{} +\end{center} + +In the same way you can also change the font family (Although I doubt that +this is sensible): + +\begin{verbatim} +\renewcommand\kvindexsize{\footnotesize\it} +\karnaughmap{4}{$f:$}{abcd}{0110011001100110}{} +\end{verbatim} + +\begin{center} +\renewcommand\kvindexsize{\footnotesize\it} +\karnaughmap{4}{$f:$}{abcd}{0110011001100110}{} +\end{center} + + +These macros are named \verb|\kvfoo|, because they work both for Karnaugh maps +and Veitch charts. + +\section{If you use an older version of the macros\ldots} + +\ldots{} you will certainly have noticed a number of changes. The most +important one is that I have changed the name of the macro that draws Karnaugh +maps from \verb|\kvmap| to \verb|\karnaughmap|. I suggest that you use the new +name in documents that you newly create. However, I introduced an alias so +that the old macro name still works: + +\begin{verbatim} +\def\kvmap{\karnaughmap} +\end{verbatim} + +Also, in some older versions tokens in the variable list or function table +that were longer than one character had to be enclosed in \emph{double} braces +(If you have used any of these versions you will certainly remember this +annoying feature). This is no longer necessary --- however, it does no +harm. + +If you need to know more about the exact changes, please consult the revision +history in \verb|kvmacros.tex|. + +\section{Final remarks} + +This is all you need to know about the usage of my macros. I have tried them +out and I haven't yet found any serious bugs, but I'm pretty sure there are +plenty. In this case, or if you have comments or suggestions, please send me +an eMail. Anyway, I would very much appreciate if you would notify me when you +use my macros; I would like to know if they are of any use to somebody. + +The maximum size map I could produce was a Karnaugh map with 10~variables; +with bigger maps I only exceeded \TeX's main memory. This is due to the +macros' recursive algorithm. Quite likely you will exceed \TeX's capacity with +even smaller maps if they occur in large documents, but I think no~one in his +right mind will ever use Karnaugh maps of more than 6\,variables, so I didn't +care about this problem. + + +\section{More examples} + +Below I have given some more examples of Karnaugh maps produced with my +macros: + +\begin{verbatim} +\karnaughmap{1}{}{a}{01}{} + +\karnaughmap{2}{$f:$}{{$a$}{$b$}}{0110}{} + +\karnaughmap{3}{$f:$}{{$a$}{$b$}{$c$}}{01100110}{} + +\karnaughmap{4}{$f:$}{{$a$}{$b$}{$c$}{$d$}}{0110011001100110}{} + +\karnaughmap{4}{$f:$}{abcd}{abcdefghijklmnop}{} + +\karnaughmap{5}{$f:$}{{$a$}{$b$}{$c$}{$d$}{$e$}}% +{0123456789abcdef0123456789abcdef}{} + +\karnaughmap{6}{$f_i^t:$}{abcdef}% +{0123456789{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}}{}% + +\kvunitlength=6mm +\kvnoindex +\karnaughmap{8}{$q_2^4:$}{{$a$}{$b$}{$c$}{$d$}{$e$}% +{$f$}{$g$}{$h$}}{% +0011001111001100% +0011001111001100% +0011001111001100% +0011001111001100% +0011001111001100% +0011001111001100% +0011001111001100% +0011001111001100% +0011001111001100% +0011001111001100% +0011001111001100% +0011001111001100% +0011001111001100% +0011001111001100% +0011001111001100% +0011001111001100% +}{} +\kvunitlength=8mm +\kvindex +\end{verbatim} + +\begin{flushleft} +\karnaughmap{1}{}{a}{01}{} + +\karnaughmap{2}{$f:$}{{$a$}{$b$}}{0110}{} + +\karnaughmap{3}{$f:$}{{$a$}{$b$}{$c$}}{01100110}{} + +\karnaughmap{4}{$f:$}{{$a$}{$b$}{$c$}{$d$}}{0110011001100110}{} + +\karnaughmap{4}{$f:$}{abcd}{abcdefghijklmnop}{} + +\karnaughmap{5}{$f:$}{{$a$}{$b$}{$c$}{$d$}{$e$}}% +{0123456789abcdef0123456789abcdef}{} + +\karnaughmap{6}{$f_i^t:$}{abcdef}% +{0123456789{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}}{}% + + +\kvunitlength=6mm +\kvnoindex +\karnaughmap{8}{$q_2^4:$}{{$a$}{$b$}{$c$}{$d$}{$e$}% +{$f$}{$g$}{$h$}}{% +0011001111001100% +0011001111001100% +0011001111001100% +0011001111001100% +0011001111001100% +0011001111001100% +0011001111001100% +0011001111001100% +0011001111001100% +0011001111001100% +0011001111001100% +0011001111001100% +0011001111001100% +0011001111001100% +0011001111001100% +0011001111001100% +}{} +\kvunitlength=8mm +\kvindex +\end{flushleft} + +\section{Sourcecode} + +Here now you will find the current sourcecode of my macros. I should have +commented it more extensively, but failed due to lack of time. Sorry. + +\small +\begin{verbatim} +%% 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: +\end{verbatim} + +\end{document} + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: t +%%% End: + + diff --git a/kvmacros.tex b/kvmacros.tex new file mode 100644 index 0000000..eb56212 --- /dev/null +++ b/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: