% \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 %\NeedsTeXFormat{LaTeX2e}[1999/12/01] %\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} % % \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