summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/basicarith/basicarith.dtx
blob: 949d4c7fd9609b383c8a14cbd78e599874988fce (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
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