% \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