diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/basicarith/basicarith.dtx |
Initial commit
Diffstat (limited to 'macros/latex/contrib/basicarith/basicarith.dtx')
-rw-r--r-- | macros/latex/contrib/basicarith/basicarith.dtx | 981 |
1 files changed, 981 insertions, 0 deletions
diff --git a/macros/latex/contrib/basicarith/basicarith.dtx b/macros/latex/contrib/basicarith/basicarith.dtx new file mode 100644 index 0000000000..949d4c7fd9 --- /dev/null +++ b/macros/latex/contrib/basicarith/basicarith.dtx @@ -0,0 +1,981 @@ +% \iffalse +% +AMDG This document was begun on 7 October 11EX, the +% feast of the Blessed Virgin Mary for the Rosary, and it is +% humbly dedicated to her, for her prayers, and to the +% Sacred Heart of Jesus for His mercy. +% +% This document is copyright 2014 by Donald P. Goodman, and is +% released publicly under the LaTeX Project Public License. The +% distribution and modification of this work is constrained by the +% conditions of that license. See +% http://www.latex-project.org/lppl.txt +% for the text of the license. This document is released +% under version 1.3 of that license, and this work may be distributed +% or modified under the terms of that license or, at your option, any +% later version. +% +% This work has the LPPL maintenance status 'maintained'. +% +% The Current Maintainer of this work is Donald P. Goodman +% (dgoodmaniii@gmail.com). +% +% This work consists of basicarith.dtx, basicarith.ins, and +% derived files basicarith.sty and basicarith.pdf. +% \fi + +% \iffalse +%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01] +%<package>\ProvidesPackage{basicarith}[2015/01/01 v1.1 support for typesetting basic arithmetic in the American fashion] +%<*driver> +\documentclass{ltxdoc} + +\usepackage{doc} +\usepackage{array} +\usepackage{lettrine} + \setcounter{DefaultLines}{3} + \setlength{\DefaultFindent}{2pt} + \renewcommand{\LettrineFontHook}{\color{red}} +\usepackage{url} +\usepackage{spverbatim} +\usepackage[nocounters]{dozenal} +\usepackage[noshowdivwork]{basicarith} +\usepackage[colorlinks]{hyperref} +\usepackage{makeidx} +\EnableCrossrefs +\PageIndex +\CodelineNumbered +\RecordChanges +\makeindex +\DoNotIndex{\?,\{,\},\|,\DeclareFontFamily,\DeclareFontShape, + \DeclareMathAccent,\DeclareMathAlphabet,\DeclareMathDelimiter, + \DeclareMathSymbol,\DeclareMathVersion,\DeclareSymbolFont,\def, + \drmsym,\encodingdefault,\familydefault,\fontencoding,\fontfamily, + \fontseries,\fontshape,\hfil,\hbox,\mathalpha,\mathclose, + \mathopen,\mathord,\mathversion,\mp,\nabla,\nbshortroman, + \RedefineMRmdclxvij,\relax,\renewcomand,\RequirePackage, + \selectfont,\SetMathAlphabet,\SetSymbolFont,\drmsymbolredef, + \nodefaultfalse,\nodefaultmathfalse,\nodefaultmathtrue,\nodefaulttrue, + \nodefaulttextfalse,\nodefaulttexttrue,\noindent,\numexpr, + \acute,\addtolength,\advance,\backslash,\baselineskip, + \char,\counterA,\counterB,\DeclareOption,\ProcessOptions, + \drmmathlets,\if,\else,\fi,\ifnum,\fi,\ifdim,\fi, + \symbolsonlyfalse,\fontsize,\newif,\newcount, + \loop,\iter,\let,\renewcommand,\setbox,\setlength,\the,\vss, + \vskip,\vbox,\newlength,\@tempboxa,\b@loopi,\b@parenfontsize, + \counterA,\counterB,\newcount,\r@@t,\z@,\DeclareMathRadical, + \DeclareRobustCommand,\bBigg@,\@ifnextchar,\@sqrt,\@makefnmark, + \@thefnmark,\catcode,\active,\b@spaceout,\b@xloop,\bf, + \b@totalprobwid,\checknil,\assignthencheck,\afterassignment, + \auxcountchar,\b@charcount,\gobblechar,\getdroparrowwidth, + \checknil,\countchar,\countunlessnil,\csname,\endcsname, + \divide,\multiply,\advance,\edef,\expandafter,\f@size,\ifx,\fi, + \ifshowdivisionwork,\fi,\linewidth,\newdimen,\next,\nil, + \wd,\xx,\hbox,\vbox,\vtop,\hrule,\vrule,\hskip,\hss,\footnotesize, + \downarrow,\leavevmode,\settowidth} + +\tracingmacros=3 +\begin{document} +\DocInput{basicarith.dtx} +\end{document} +%</driver> +% \fi +% +% \title{The |basicarith| Package, v1.1} +% \author{Donald P.\ Goodman III} +% \date{\today} +% +% \maketitle +% +% \begin{abstract} +% The |basicarith| package provides means for typesetting +% arithmetic problems, of whatever operations, in a clean +% and open fashion, suitable for educational texts rather +% than scholarly works. Digits are spaced out, work (such +% as carrying, borrowing, and dropping) can be shown +% visibly, and individual digits can be styled independently. +% \end{abstract} +% +% \tableofcontents +% +% \section{Introduction} +% +% \TeX\ and \LaTeX\ are, of course, justly celebrated for +% their ability to beautifully typeset mathematics. +% However, there are few utilities available for typesetting +% the sort of mathematics that we find in primary school +% textbooks. We can easily typeset incredibly complex +% equations, and \TeX\ will put them together perfectly; but +% to typeset an example addition problem, showing our work, +% is quite difficult. |basicarith| attempts to fill this +% need by providing macros for typesetting and organizing +% such problems. +% +% It is notable that basic arithmetic is done in several +% different styles in various places, though of course the +% algorithms are typically the same. The author being an +% American, |basicarith| typesets the problems according to +% the American custom. Most of these are shared with other +% English-speaking countries; however, some, particularly +% long division, will look quite odd to those from other +% countries. No option for using these other styles is +% currently available. +% +% \section{Basic Macros} +% +% |basicarith| offers a few basic macros for formulating +% problems. These must be divided into two main groups: +% long division, and other operations. Since the latter are +% simpler, we'll start with those. +% +% \subsection{Non-Division Operations} +% +% The fundamental macros for this are +% \DescribeMacro{\opline}|\opline|, +% \DescribeMacro{\probline}|\probline|, +% \DescribeMacro{\nextpline}|\nextpline|, and +% \DescribeMacro{\soluline}|\soluline|. The syntax for each +% is simple; we'll take them in their order of use. +% +% \begin{center} +% \cmd{\probline} \marg{width} \marg{number} +% \end{center} +% +% Both these arguments are mandatory. Simply put, +% |probline| takes first the total width of the problem you +% are typesetting; this is equivalent to the longest line of +% the problem. So if your longest line is, say, eight +% digits long, you put ``8'' here. The second is the number +% of the first line of the equation. +% +% \begin{center} +% \cmd{\nextpline} \marg{number} +% \end{center} +% +% |\nextpline| just takes the next number of the equation. +% +% \begin{center} +% \cmd{\opline} \marg{operator} \marg{number} +% \end{center} +% +% |\opline| takes two mandatory arguments; first, the +% operator to be typeset, and second, the number of the +% final line. It also prints a ``solution line'' underneath +% itself; this makes it the last line in the problem before +% we start figuring the answer. Note that, if you want a +% mathematical symbol for the operator (say, ``$\times$''), +% you have to include the dollar signs yourself. This means +% that \emph{any} character can be your operator, not only +% math characters. +% +% \begin{center} +% \cmd{\soluline} \marg{number} +% \end{center} +% +% |\soluline| is designed for the solution of the problem. +% Functionally this is equivalent to |\nextpline|, but +% semantically it is clearer. Furthermore, it resets the +% line counter, so that line styles will be correctly +% applied in future equations. +% +% There remains only one more basic macro: |\noopline|. +% +% \begin{center} +% \cmd{\noopline} \marg{number} +% \end{center} +% +% \DescribeMacro{\noopline}|\noopline| +% is identical to |\opline| except that it does not print +% the operator. This is useful for typesetting operations +% that require one or more intermediate solutions; for +% example, multiplication by more than one digit. +% Typically, in the American style the operator is printed +% only on the final line of the first solution; subsequent +% intermediate solutions require a rule above them but no +% operator on that rule. |\noopline| is what produces this. +% +% These are then combined in the way one might expect. For +% example: +% +% \bigskip +% \hbox to\linewidth{% +% \hfil% +% \hbox to0.5\linewidth{\vbox{% +% \begin{spverbatim} +% \probline{9}{58193} +% \nextpline{54} +% \nextpline{4397} +% \opline{$+$}{38291374} +% \nextpline{38354018} +% \noopline{54} +% \soluline{38354072} +% \end{spverbatim}} +% }\hfil% +% \problembox{% +% \probline{9}{58193} +% \nextpline{54} +% \nextpline{4397} +% \opline{$+$}{38291374} +% \nextpline{38354018} +% \noopline{54} +% \soluline{38354072} +% }% +% \hfil% +% }% +% \bigskip +% +% And that's the essentials of using |basicarith| for +% non-long division. +% +% \subsection{Long Division} +% +% Long division is typically more difficult to typeset than +% other functions; so |basicarith| offers different macros +% for handling it. The examples below are meaningless +% (unlike those above, which are actually correct); they are +% merely meant to show the macros which are available. +% +% \begin{center} +% \cmd{\longdiv} \marg{length} \marg{dividend} \marg{divisor} +% \end{center} +% +% The \DescribeMacro{\longdiv}|\longdiv| macro is, +% obviously, the most important; it typesets the +% all-important first line of a long division problem. +% |\longdiv| takes three arguments, all mandatory; the first +% is the length of the dividend in number of digits (it uses +% this to calculate the appropriate length of the line over +% of the dividend); the second is the dividend itself; and +% the third is the divisor. It uses a simple +% close-parenthesis between the dividend and divisor, scaled +% to 1.2 times the current font size. +% +% \begin{center} +% \cmd{\ldsoluline} \marg{solution} \marg{remainder} +% \end{center} +% +% \DescribeMacro{\ldsoluline}|\ldsoluline| typesets +% the answer. This is a bit tricky, because as mentioned +% before, in American-style long division, the answer is +% typeset \emph{above} the question, not below it; but we +% don't know how much space we will need for that answer +% until we've typeset the first line, containing the +% dividend, divisor, and close-parenthesis. So +% |\ldsoluline| should be input \emph{after} the |\longdiv| +% command but \emph{before} any |\nextldline|s; otherwise, +% |basicarith| won't be able to place it correctly. +% +% The second argument to |\ldsoluline| is the remainder; if +% you don't want to typeset a remainder, you still must +% include this argument, but it can be left blank. +% +% \begin{center} +% \cmd{\nextldline} \marg{cutoff} \marg{number} +% \end{center} +% +% In the American style of long division, intermediate +% values are placed \emph{underneath} the dividend, while +% the solution itself is placed \emph{above} it. +% \DescribeMacro{\nextldline}|\nextldline| typesets these +% intermediate values. It takes two arguments, both +% mandatory. The first is the number of digits of the +% dividend that are encompassed by this intermediate result +% (that is, in purely visual terms, the number of digits in +% the dividend which will not have a number underneath +% them); the second is the number itself. +% +% Notice that |basicarith| does not keep track of how much +% it must indent subsequent lines when you're showing your +% work. This has the benefit that you can skip steps as you +% see fit; it has the drawback that you have to tell +% |basicarith| how much each |\nextldline| must skip ahead +% in order to get the number properly placed. +% +% \bigskip +% \hbox to\linewidth{% +% \hfil% +% \hbox to0.5\linewidth{\vbox{% +% \begin{spverbatim} +% \longdiv{6}{430;932}{983} +% \ldsoluline{837;61}{4} +% \nextldline{3}{43} +% \nextldline{2}{4389} +% \end{spverbatim}} +% }\hfil% +% \problembox{% +% \longdiv{6}{430;932}{983} +% \ldsoluline{837;61}{4} +% \nextldline{3}{43} +% \nextldline{2}{4389} +% }% +% \hfil% +% } +% +% +% And this suffices for basic usage of |basicarith|. +% However, there are many other settings available with the +% package, which we will address in the next section. +% +% \section{Advanced Usage} +% +% |basicarith| allows each line of a mathematical problem to +% be specially styled. For example, say you are trying to +% draw particular attention to the subtrahend of a given +% problem: +% +% \hbox to\linewidth{\LARGE\hfil% +% \linestyle{2}{\color{red}} +% \problembox{% +% \probline{4}{548} +% \opline{$-$}{27} +% \soluline{521} +% }% +% \hfil}% +% +% Or for some reason you want to highlight each line of a +% subtraction problem differently, perhaps to visually +% demonstrate which part is which: +% +% \hbox to\linewidth{\LARGE\hfil% +% \linestyle{1}{\color{blue}}% +% \linestyle{2}{\color{red}}% +% \linestyle{3}{\color{green}}% +% \problembox{% +% \probline{4}{548}% +% \opline{$-$}{27}% +% \soluline{521}% +% }% +% \hfil}% +% +% This is accomplished using the +% \DescribeMacro{\linestyle}|\linestyle| command, which +% takes two arguments: the number of the line of the +% problem to be styled (starting with 1 at the top), and the +% style to be applied to that line. +% +% \begin{center} +% \cmd{\linestyle} \marg{line number} \marg{style} +% \end{center} +% +% The style commands can be anything at all; colors, +% weights, shapes, or any combination of the above. These +% commands will typically be confined to the innermost box +% (particularly, they will not span |\problembox|es), but if +% you do need to manually clear all these values back to +% default (which is no styling at all), issue the command +% \DescribeMacro{\clearlinestyles}|\clearlinestyles|. +% +% \bigskip +% \hbox to\linewidth{% +% \hfil% +% \hbox to0.5\linewidth{\vbox{% +% \begin{spverbatim} +% \linestyle{1}{\color{blue}}% +% \linestyle{2}{\color{red}}% +% \linestyle{3}{\color{green}}% +% \probline{4}{548}% +% \opline{$-$}{27}% +% \soluline{521}% +% \end{spverbatim}} +% }\hfil% +% \vbox{\linestyle{1}{\color{blue}}% +% \linestyle{2}{\color{red}}% +% \linestyle{3}{\color{green}}% +% \vskip-1em% +% \LARGE +% \problembox{ +% \probline{4}{548}% +% \opline{$-$}{27}% +% \soluline{521}% +% }}% +% \hfil% +% } +% +% Digits can also be individually styled by means of the +% \DescribeMacro{\digstyle}|\digstyle| command. +% +% \begin{center} +% \cmd{\digstyle} \marg{column number} \marg{style} +% \end{center} +% +% Note that these are really styling \emph{columns}, not +% merely digits; the style will be applied to every number +% in that column until either another |\digstyle| for that +% column number is issued or a +% \DescribeMacro{\cleardigitstyles}|\cleardigitstyles| +% command is encountered. (This latter is like +% |\clearlinestyles|, and is pretty self-explanatory.) +% +% \bigskip +% \hbox to\linewidth{% +% \hfil% +% \hbox to0.5\linewidth{\vbox{% +% \begin{spverbatim} +% \linestyle{1}{\color{blue}}% +% \linestyle{2}{\color{red}}% +% \linestyle{3}{\color{green}}% +% \digstyle{3}{\color{black}\itshape}% +% \probline{4}{548}% +% \opline{$-$}{27}% +% \soluline{521}% +% \end{spverbatim}} +% }\hfil% +% \vbox{% +% \linestyle{1}{\color{blue}}% +% \linestyle{2}{\color{red}}% +% \linestyle{3}{\color{green}}% +% \digstyle{3}{\color{black}\itshape}% +% \vskip-1em% +% \LARGE +% \problembox{ +% \probline{6}{21;\x48}% +% \opline{$-$}{27}% +% \soluline{5;21}% +% }}% +% \hfil% +% } +% +% Notice also that |\digstyle| commands always take precedence over +% |\linestyle| commands, no matter what order they are +% issued in. +% +% Oftentimes we want to show our work explicitly, including +% our carrying (in the case of addition or multiplication) +% and our borrowing (in the case of subtraction). We can +% show this work by using the +% \DescribeMacro{\carryline}|\carryline| +% macro. |\carryline| takes two arguments, the number of +% digits you'll be putting carries over, and the line +% with the carries or borrows that you wish to display. +% +% \begin{center} +% \cmd{\carryline} \marg{number of digits} \marg{carries} +% \end{center} +% +% |\carryline| will respect all |\linestyle| and |\digstyle| +% commands, and it \emph{does} count as a line for +% |\linestyle| purposes. +% +% \bigskip +% \hbox to\linewidth{% +% \hfil% +% \hbox to0.5\linewidth{\vbox{% +% \begin{spverbatim} +% \carryline{4}{{3}{\strike{18}17}} +% \probline{4}{548}% +% \opline{$-$}{29}% +% \soluline{519}% +% \end{spverbatim}} +% }\hfil% +% \vbox{ +% \vskip-1em% +% \LARGE +% \problembox{ +% \carryline{4}{{3}{\strike{18}17}} +% \probline{4}{548}% +% \opline{$-$}{29}% +% \soluline{519}% +% }}% +% \hfil% +% } +% \bigskip +% +% The first argument must be the same as that in the +% |\probline| that the carries will be a part of. This is a +% clunkiness in the interface that I haven't been able to +% resolve. +% +% Multiple digits can be put in a single carry place by enclosing +% them in brackets. Further, styling can be applied in a +% limited way within those brackets; most basic styling, +% such as italics and boldface, will work, but more complex +% styling will not. Experimentally, at the very least +% |soul| and |ulem| styling will not work here. For this +% reason, |basicarith| provides the +% \DescribeMacro{\strike}|\strike| command, which will +% strike out a borrow when another borrow is required. It +% is used as shown in the example above (quite erroneously +% applied there for the sake of example). |\strike| takes a +% single argument, the number to be struck out. It is +% implemented quite na\"\i{}vly, and will consequently only +% strike out one or two digit numbers. +% +% Oftentimes we want to arrange our equations in the page, +% and |basicarith|'s setup, with each line being a separate +% |\hbox|, can sometimes make this difficult. We therefore +% have \DescribeMacro{\problembox}|\problembox|, which can +% enclose any number of |basicarith| statements and make it +% easier to position it on the page. For example, a +% |basicarith| equation in a |center| environment will not +% be centered, due to some deep \TeX\ magic that we don't +% need to go into here. Wrap the equation up in +% |\problembox|, however, with the |basicarith| equation as +% the only element, and it will work just fine: +% +% \begin{center} +% \problembox{% +% \carryline{4}{{3}{\strike{18}17}} +% \probline{4}{548}% +% \opline{$-$}{29}% +% \soluline{519}% +% }% +% \end{center} +% +% \section{Configuration Commands} +% +% There are a variety of other bits and pieces of +% |basicarith| that can be customized. The width of +% solution line is held in the macro +% \DescribeMacro{\b@solverulewidth}|\b@solverulewidth|. As +% implied by the \@ in its name, this is considered an +% ``internal'' command, but with |\makeatletter| and +% |\makeatother| it can still be reset by a user, to values +% reasonable or ridiculous. For example, +% |\b@solverulewidth=2pt| (or +% |\setlength{\b@solverulewidth}{2pt}|) gives: +% +% \bigskip +% \makeatletter\b@solverulewidth=2pt\makeatother +% \hbox to\linewidth{\hfil% +% \problembox{ +% \probline{3}{44} +% \opline{$+$}{44} +% }\hfil} +% \makeatletter\b@solverulewidth=0.4pt\makeatother +% \bigskip +% +% The longdivision equivalent is +% \DescribeMacro{\b@longdivlinewidth}|\b@longdivlinewidth|; +% setting it equal to 2pt gives: +% +% \bigskip +% \makeatletter\b@longdivlinewidth=2pt\makeatother +% \hbox to\linewidth{\hfil% +% \problembox{\longdiv{4}{3298}{24}} +% \hfil}% +% \makeatletter\b@longdivlinewidth=0.4pt\makeatother +% \bigskip +% +% Both of these values are the \TeX-default 0.4pt unless +% changed by the user. +% +% For adminstrative reasons, the sizes of problems are +% limited both in number of \emph{rows} and in number of +% \emph{columns}. The parameters controlling these things +% are, unsurprisingly, +% \DescribeMacro{\b@maxcols}|\b@maxcols| and +% \DescribeMacro{\b@maxrows}|\b@maxrows|. Both of these are +% set at twenty to begin with, which ought to be more than +% enough; but they can be changed if needed. +% +% By default, when a remainder is displayed in a long +% division problem, it is prefixed by ``R,'' in the American +% custom. If you'd like something different, you can +% redefine +% \DescribeMacro{\b@remaindertext}|\b@remaindertext|; its +% contents will be printed instead. +% +% When doing long division, sometimes work is shown in a +% more explicit way. In addition to writing intermediate +% solutions beneath the appropriate digits of the dividend, +% we often show visibly how digits are ``dropped'' from the +% dividend into those intermediate problems, by drawing an +% arrow down from those digits to the appropriate place. +% With |basicarith|, we do this by issuing the +% \DescribeMacro{\showdivwork}|\showdivwork|, and turn it +% off with \DescribeMacro{\noshowdivwork}|\noshowdivwork|. +% Showing work is turned \emph{on} by default. +% +% \def\fractionsymbol{.} +% \bigskip +% \hbox to\linewidth{% +% \hfil% +% \hbox to0.5\linewidth{\vbox{% +% \begin{spverbatim} +% \showdivwork +% \longdiv{6}{430.932}{983} +% \ldsoluline{837.61}{4} +% \nextldline{3}{43} +% \nextldline{2}{4389} +% \end{spverbatim}} +% }\hfil% +% \problembox{% +% \showdivwork +% \longdiv{6}{430.932}{983} +% \ldsoluline{837.61}{4} +% \nextldline{1}{40} +% \nextldline{2}{69} +% \nextldline{3}{73} +% \nextldline{4}{22} +% }% +% \hfil% +% } +% \bigskip +% +% These settings can also be set globally for the package at +% loading time, with the package options +% \DescribeMacro{noshowdivwork}|noshowdivwork| and +% \DescribeMacro{showdivwork}|showdivwork|. The latter is, +% of course, the default. +% +% Incidentally, the last of these examples demonstrates +% another configuration option: +% \DescribeMacro{\fractionsymbol}|\fractionsymbol|. The +% author is a dozenalist, and dozenalists customarily use a +% semicolon as a fractional point; but most people are +% decimalists, and usually use either a dot or a comma. +% With |basicarith|, you can use any symbol you want; the +% default is ``;'', but by redefining |\fractionsymbol|, you +% can get anything else. The above was typeset with: +% +% \begin{center} +% |\def\fractionsymbol{.}| +% \end{center} +% +% \def\fractionsymbol{;} +% The width of the box which encloses each digit is +% controlled by a macro called +% \DescribeMacro{\b@widthofdigit}|\b@widthofdigits|; +% redefining this will result in different size digit boxes. +% The following two lines show this macro set at 3ex and +% 1ex, respectively. +% +% \bigskip +% \hbox to\linewidth{% +% \hfil% +% \makeatletter\def\b@widthofdigit{3ex}\probline{4}{24;56}\makeatother +% \hfil% +% } +% \bigskip +% \hbox to\linewidth{% +% \hfil% +% \makeatletter\def\b@widthofdigit{1ex}\probline{4}{24;56}\makeatother +% \hfil% +% } +% \def\b@widthofdigit{2ex} +% +% The default for this setting is 2ex. Note that this is a +% macro, not a dimen; change it using |\def| or +% |\renewcommand|, not with |\setlength|. +% +% \section{Implementation} +% +% We begin by defining the necessary conditional for +% determining whether long division work should be shown +% (that is, whether to draw drop arrows), and then defining +% and processing the package options. +% \begin{macrocode} +\newif\ifshowdivisionwork % switch for drop arrows +\showdivisionworktrue +\DeclareOption{noshowdivwork}{\showdivisionworkfalse} +\DeclareOption{showdivwork}{\showdivisionworktrue} +\ProcessOptions +% \end{macrocode} +% We move on by defining the many dimensions and counters that +% are required to typeset basic arithmetic problems. Most +% of these are described afterward by a comment. First, we +% define those which rarely change; think limitations on the +% numbers of rows and columns; in the documentation we call +% these ``configuration options.'' +% \begin{macrocode} +\newdimen\b@solverulewidth % rule under the operator line +\b@solverulewidth=0.4pt +\newcount\b@maxcols % maximum length of a problem +\b@maxcols=20 +\newcount\b@maxrows % maximum lines of a problem +\b@maxrows=20 +\newdimen\b@longdivlinewidth % width of above +\def\fractionsymbol{;} +% \end{macrocode} +% Next, we define those variables which change frequently; +% these are the counters that keep track of which row and +% column we're on and things of that nature. +% \begin{macrocode} +\newdimen\b@topdivline % length of the above +\newdimen\b@totalprobwid % width of widest line of problem +\newdimen\b@digitwid % width of a digit +\def\b@widthofdigit{2ex} +\newcount\b@colnum % row number of problem +\b@colnum=0% +\def\specialdigitstyle{} % style for a given digit +\def\speciallinestyle{} % style for a given digit +\b@longdivlinewidth=0.4pt +\newdimen\b@parenfontsize % size of parenthesis in longdiv +\newcount\b@linenum % row number of problem +\newdimen\b@divisorlen % length of divisor +\newdimen\b@divparenlen % width of the paren in ld +\newdimen\b@ldrowlen % length to add to b@divisorlen +\newdimen\b@fulldivlen % length of divisor + dividend +\b@fulldivlen=0pt +\newcount\b@charcount % number of chars in an argument +\b@charcount=0 +\newcount\b@loopi % generic loop counter +\b@loopi=0 +\def\b@remaindertext{R} % text for the remainder +\newdimen\b@droparrowlen % drop arrow length +\b@droparrowlen=0pt +% \end{macrocode} +% Now we define the macros that are used for counting the +% number of characters in various strings; these are adapted +% from macros by ``Florent'' at +% \url{tex-and-stuff.blogspot.com}. +% \begin{macrocode} +\def\gobblechar{\let\char= } +\def\assignthencheck{\afterassignment\checknil\gobblechar} +\def\countunlessnil{% + \ifx\char\nil \let\next=\relax% + \else% + \let\next=\auxcountchar% + \advance\b@charcount by1% + \fi% + \ifx\char;\advance\b@charcount by-1\fi% + \next% +}% +\def\auxcountchar{% + \afterassignment\countunlessnil\gobblechar% +}% +\def\countchar#1{\def\xx{#1}\b@charcount=0 \expandafter\auxcountchar\xx\nil} +% \end{macrocode} +% Now we define some macros for splitting a string into +% individual characters and putting them in boxes; these are +% adapted from David Carlisle's answer on +% \url{tex.stackexchange.com}, question 57598. +% \begin{macrocode} +\def\b@expandloop#1{% + \hbox{% + \b@xloop#1\relax + }% +} +\def\b@xloop#1{% + \if#1\fractionsymbol\else\advance\b@colnum by-1\fi% + \ifx\relax#1% + \else% + \if#1\fractionsymbol% + \rlap{\hbox to0pt{\hss#1\hss}}% + \else% + \hbox to\b@digitwid{\hfil{% + \csname speciallinestyle\romannumeral\b@linenum\endcsname% + \csname specialdigitstyle\romannumeral\b@colnum\endcsname% + #1% + }\hfil}% + \fi% + \expandafter\b@xloop% + \fi% +} +\def\b@spaceout#1{% + \countchar{#1}% + \b@colnum=\b@charcount% + \advance\b@colnum by1% + \b@expandloop{#1}% +}% +% \end{macrocode} +% Now we define our macros for non-long-division problems. +% \begin{macrocode} +\def\probline#1#2{% + \advance\b@linenum by1% + \b@digitwid=\b@widthofdigit% + \b@totalprobwid=\b@digitwid% + \multiply\b@totalprobwid by#1% + \hbox to\b@totalprobwid{% + \hfil\b@spaceout{#2}% + }% +}% +\def\opline#1#2{% + \advance\b@linenum by1% + \hbox{% + \hbox to\b@digitwid{\hfil#1}% + \advance\b@totalprobwid by-\b@digitwid% + \hbox to\b@totalprobwid{% + \hfil\b@spaceout{#2}% + }% + }% + \vskip0.5ex% + \hrule width\b@totalprobwid height\b@solverulewidth% + \vskip0.5ex% +}% +\def\noopline#1{% + \opline{}{#1}% +}% +\def\nextpline#1{% + \advance\b@linenum by1% + \hbox{% + \hbox to\b@totalprobwid{% + \hfil\b@spaceout{#1}% + }% + }% +}% +\def\soluline#1{% + \advance\b@linenum by1% + \hbox{% + \hbox to\b@totalprobwid{% + \hfil\b@spaceout{#1}% + }% + }% + \b@linenum=0% +}% +\def\carryline#1#2{% + {% + \advance\b@linenum by1% + \b@digitwid=\b@widthofdigit% + \b@totalprobwid=\b@digitwid% + \multiply\b@totalprobwid by#1% + \footnotesize% + \hbox to\b@totalprobwid{% + \hfil\b@spaceout{#2}% + }% + \hrule width\b@totalprobwid height0pt% + \vskip0.4em% + }% +} +% \end{macrocode} +% Now we proceed to define the macros for long division. +% \begin{macrocode} +\def\longdiv#1#2#3{% + \advance\b@linenum by1% + \vskip\baselineskip% + \b@digitwid=\b@widthofdigit% + \b@topdivline=\b@digitwid% + \settowidth{\b@divisorlen}{\b@spaceout{#3}} + \b@parenfontsize=\f@size pt% + \multiply\b@parenfontsize by12% + \divide\b@parenfontsize by10% + \settowidth{\b@divparenlen}{% + \fontsize{\b@parenfontsize}{\b@parenfontsize}\selectfont)}% + \multiply\b@topdivline by#1% + \advance\b@topdivline by0.5\b@digitwid% + \vskip0.5ex% + \vbox{% + \hbox{% + \hskip\b@divisorlen% + \vrule width\b@topdivline height\b@longdivlinewidth% + }% + \nointerlineskip% + \hbox{% + \b@spaceout{#3}% + \hfil{\fontsize{\b@parenfontsize}{\b@parenfontsize}\selectfont)}% + \b@spaceout{#2}% + }% + }% + \advance\b@divisorlen by\b@divparenlen% +}% +\def\ldsoluline#1#2{% + \advance\b@fulldivlen by\b@divisorlen% + \advance\b@fulldivlen by\b@topdivline% + \advance\b@fulldivlen by-\b@digitwid% + \advance\b@fulldivlen by\b@divparenlen% + \vskip-2\baselineskip% + \hbox to\b@fulldivlen{% + \hfil% + \b@spaceout{#1}% + \if#2\relax\else\rlap{\hskip1em \b@remaindertext{ }#2}\fi% + }% + \vskip\baselineskip% +}% +% \end{macrocode} +% This is an interesting little trick which gets the width +% of a box; we use this to determine the placement of the +% drop arrows when we're showing our long division work. +% \begin{macrocode} +\newdimen\b@droparrowwidth +\def\getdroparrowwidth{% + \setbox\@tempboxa\hbox{$\downarrow$}% + \b@droparrowwidth=\wd\@tempboxa% +}% +% \end{macrocode} +% Now we get back to long division macros (yes, these do +% take a rather long time). We start with the macro for +% subsequent long division lines. +% \begin{macrocode} +\def\nextldline#1#2{% + \advance\b@linenum by1% + \b@ldrowlen=\b@digitwid% + \multiply\b@ldrowlen by#1% + \hbox{% + \hskip\b@divisorlen% + \hskip\b@ldrowlen% + \b@spaceout{#2}% + \b@droparrowlen=\baselineskip% + \ifshowdivisionwork% + \ifnum\b@linenum>2% + \getdroparrowwidth% + \multiply\b@droparrowlen by\b@linenum% + \advance\b@droparrowlen by-2\baselineskip% + \hskip-0.5\b@digitwid% + \vtop{\vskip-\baselineskip\vskip-\b@droparrowlen% + \rlap{% + \vrule width0.4pt height\b@droparrowlen% + \hskip-0.5\b@droparrowwidth{$\downarrow$}% + } + }% + \fi% + \fi% + }% +}% +% \end{macrocode} +% Now we move on to the styling macros; this requires a lot +% of looping and other weirdities (weirdities for \TeX\ +% programming, anyway). First we style lines; then we style +% columns. +% \begin{macrocode} +\def\linestyle#1#2{% + \b@loopi=0% + \loop\ifnum\the\b@loopi<\the\b@maxrows% + \advance\b@loopi by1% + \ifnum#1=\the\b@loopi + \expandafter\def\csname speciallinestyle\romannumeral\b@loopi\endcsname{#2}% + \fi + \repeat +}% +\def\digstyle#1#2{% + \b@loopi=0% + \loop\ifnum\the\b@loopi<\the\b@maxcols% + \advance\b@loopi by1% + \ifnum#1=\the\b@loopi + \expandafter\def\csname specialdigitstyle\romannumeral\b@loopi\endcsname{#2}% + \fi + \repeat +}% +% \end{macrocode} +% Now we get our commands to clear the styling; again, first +% lines, then columns. +% \begin{macrocode} +\def\clearlinestyles{% + \b@loopi=0% + \loop\ifnum\the\b@loopi<\the\b@maxrows% + \advance\b@loopi by1% + \expandafter\def\csname speciallinestyle\romannumeral\b@loopi\endcsname{}% + \repeat +}% +\def\cleardigitstyles{% + \b@loopi=0% + \loop\ifnum\the\b@loopi<\the\b@maxcols% + \advance\b@loopi by1% + \expandafter\def\csname specialdigitstyle\romannumeral\b@loopi\endcsname{}% + \repeat +}% +% \end{macrocode} +% A few miscellanies; a box for binding together problems, +% so that they can be positioned on the page more easily; a +% macro for doing strikethroughts, quite useful in the +% carries; and macros for showing or not showing our long +% division work. +% \begin{macrocode} +\def\problembox#1{% + \leavevmode\vbox{#1}% +}% +\def\strike#1{% + {\rlap{\bf---}#1}% +} +\def\showdivwork{% + \showdivisionworktrue% +} +\def\noshowdivwork{% + \showdivisionworkfalse% +} +% \end{macrocode} +% Now, finally, we clear all the digit styles (so that they +% at least exist), and then we're done. Thanks for reading; +% happy \TeX{}ing! +% \begin{macrocode} +\cleardigitstyles +% \end{macrocode} +% \PrintIndex |