% tex-squares.sty  05 Feb 2004

% Macros for inserting pictures of square dance formations into TeX documents.
%
% This style option is designed to work with the article document
% style of LaTeX 2e.  Use
% \documentclass{article}
% \usepackage{tex-squares}

% Authors: Larry Denenberg and Stephen Gildea
%  Comments and suggestions welcome.

%  29 Jul 88: allow dancers to be on half-spots.
%  30 Aug 88: made font-independent, added \displayfive
%  31 Aug 88: added offset phantom dancers
%  14 Sep 88: added other useful non-picture commands and renamed .tex => .sty
%  27 Apr 89: added \setdancersize to allow changing the size of the dancers
%  04 May 89: fix to \setdancersize to scale offset dancer offset, too
%  30 May 89: added table of contents support
%  17 Oct 89: added \caption
%  07 Mar 90: changed \displaythree spacing from .25in to .5in (Sue's idea)
%  16 Apr 90: stretchable glue between setups in the \display-n commands
%  19 Nov 90: displays now use \halign instead of array env so stretchable
%		glue really works
%  10 Dec 91: Always use shortskips with new \halign.  Changed my address.
%  08 Jul 98: Update for LaTeX2e.
%  04 Feb 04: Remove authors' email addresses to avoid harvesting.
%  09 Dec 07: Add \example.
%  03 Jan 08: Add \sequence.

\NeedsTeXFormat{LaTeX2e}[1994/12/01]	%for \textbullet
\ProvidesPackage{tex-squares}[2004/02/05 Square Dance Formations]

\AtBeginDocument{\font\dancerfont=\fontname\font}

\def\bulletchar{\textbullet}

\newdimen\side			%size of dancers
\newdimen\thickness\thickness=0.6pt %width of rules
\newskip\formationhspread\formationhspread=0.25em %was 0.5, sue: 0.25
\newskip\formationvspread\formationvspread=0.25em %1/2 the total dist
\newcount\phantomdashes\phantomdashes=2	%Eric's value.  Larry used 4.
\newdimen\bullethmargin\bullethmargin=1.4pt
\newdimen\bulletvmargin\bulletvmargin=0.9pt
\newdimen\captionskip\captionskip=0.2cm

% separation between formations in a display
\newskip\dtwosep     \dtwosep 1.0in minus 0.50in
\newskip\dthreesep \dthreesep 0.5in minus 0.25in
\newskip\dfoursep   \dfoursep 0.3in minus 0.10in
\newskip\dfivesep   \dfivesep 0.3in minus 0.10in
% my old valuse
%\newskip\dfoursep   \dfoursep 0.125in
%\newskip\dfivesep   \dfivesep 0.125in

\newdimen\outside
\newbox\bulletbox\setbox\bulletbox=\hbox{\bulletchar}
\newdimen\totalheight

\newbox\left\setbox\left=\hbox to \wd\bulletbox{} \let\right=\left
\newbox\top\setbox\top=\vbox to \ht\bulletbox{} \let\bottom=\top
\newbox\hbullet
\newbox\vbullet

\newbox\vbar
\newbox\vpbar
\newbox\hbar
\newbox\hpbar

\newskip\halfhoffset
\newskip\halfvoffset

% Set the size of the box that is a dancer.  This does not change
% the font used inside the dancer or the font used for the nose.

\def\setdancersize#1{
  \side=#1
  \outside=\side
    \advance\outside by 2\thickness
  \totalheight=\outside
    \advance\totalheight by 2\ht\bulletbox
    \advance\totalheight by -2\bulletvmargin

  \setbox\hbullet=\vbox to \totalheight{\vfil\copy\bulletbox\vfil}
  \setbox\vbullet=\hbox to \side{\hfil\copy\bulletbox\hfil}

  \setbox\vbar=\vbox to \totalheight
    {\vfil\hrule height\outside width\thickness\vfil}
  \dimen0=\outside \divide\dimen0 by \phantomdashes
  \setbox0=\vbox to \dimen0
    {\xleaders\vrule width\thickness\vfil\vfil\vfil
     \xleaders\vrule width\thickness\vfil}
  \setbox\vpbar=\vbox to \totalheight
    {\vfil\vbox to \outside{\xleaders\box0\vfil}\vfil}

  \setbox\hbar=\hbox{\vrule height\thickness width\side}
  \dimen0=\side \divide\dimen0 by \phantomdashes
  \setbox0=\hbox to \dimen0
    {\xleaders\hrule height\thickness\hfil\hfil\hfil
     \xleaders\hrule height\thickness\hfil}
  \setbox\hpbar=\hbox to \side{\xleaders\box0\hfil}

  \halfhoffset=\totalheight \advance\halfhoffset\formationhspread
  \halfvoffset=\totalheight \advance\halfvoffset\formationvspread
} % end of \setdancersize

% Set up default size

%\setdancersize{3.7ex}		%Larry's original
\setdancersize{2ex}

% Draw a dancer.
% First arg: character to draw inside.
% Second arg: n, s, e, or w (the direction the dancer is facing).
%    Can also be v (n and s combined) or h (e and w combined).
%    Using x causes no nose at all to be drawn.
\def\dancer#1#2{{\offinterlineskip
\if#2n\let\top\vbullet\fi\if#2e\let\right\hbullet\fi
\if#2s\let\bottom\vbullet\fi\if#2w\let\left\hbullet\fi
\if#2v\let\top\vbullet\let\bottom\vbullet\fi
\if#2h\let\left\hbullet\let\right\hbullet\fi
\hbox{\copy\left\kern-\bullethmargin\copy\vbar
      \vbox{\copy\top\kern-\bulletvmargin\copy\hbar
            \vbox to \side{\vss\hbox to \side{\hss\dancerfont #1\hss}\vss}
            \copy\hbar\kern-\bulletvmargin\copy\bottom}\relax
      \copy\vbar\kern-\bullethmargin\copy\right}}}

% Phantom dancer: drawn with dashes
\def\pdancer#1#2{{\let\vbar\vpbar\let\hbar\hpbar\dancer{#1}{#2}}}

% Invisible dancer: just takes up space.
\def\idancer{\nsdancerbox{}}

% Four dancers that are offset half a position
%  to the n, s, e, and w respectively
\def\ndancer#1#2{\nsdancerbox{\vss\kern -\halfvoffset\dancer{#1}{#2}\vss}}
\def\sdancer#1#2{\nsdancerbox{\vss\kern +\halfvoffset\dancer{#1}{#2}\vss}}
\def\edancer#1#2{\ewdancerbox{\hss\kern +\halfhoffset\dancer{#1}{#2}\hss}}
\def\wdancer#1#2{\ewdancerbox{\hss\kern -\halfhoffset\dancer{#1}{#2}\hss}}

% offset phantom dancers.
\def\npdancer#1#2{\nsdancerbox{\vss\kern -\halfvoffset\pdancer{#1}{#2}\vss}}
\def\spdancer#1#2{\nsdancerbox{\vss\kern +\halfvoffset\pdancer{#1}{#2}\vss}}
\def\epdancer#1#2{\ewdancerbox{\hss\kern +\halfhoffset\pdancer{#1}{#2}\hss}}
\def\wpdancer#1#2{\ewdancerbox{\hss\kern -\halfhoffset\pdancer{#1}{#2}\hss}}

% dancers rotated 45 degrees clockwise
% added by sue, oct 2010.

% Not user-level macros, but useful in the above definitions.
% Larry:
%   The first \totalheight in this definition is technically wrong.  Tough.
\def\nsdancerbox#1{\hbox to \totalheight{\hss\vbox to \totalheight{#1}}}
\def\ewdancerbox#1{\vbox to \totalheight{\vss\hbox to \totalheight{#1}}}

\def\formation#1{
  {\def\quad{\hskip\formationhspread}
   \def\cr{\crcr\noalign{\vskip\formationvspread}}
   \let\\=\cr
   \matrix{#1}}}

% \wideformation and \tallformation make quarter tags look better

\def\wideformation#1{
  {\def\quad{\hskip 2\formationhspread}
   \def\cr{\crcr\noalign{\vskip\formationvspread}}
   \matrix{#1}}}

\def\tallformation#1{
  {\def\quad{\hskip\formationhspread}
   \def\cr{\crcr\noalign{\vskip 2\formationvspread}}
   \matrix{#1}}}

% Some LaTeX definitions:

% define displays in terms of \halign because array environment
% insists \tabskip=0pt at edges of table.  We need more control.

% Since the \haligns always go all the way across the page, we always
% get \abovedisplayskip and \belowdisplayskip, and never
% \abovedisplayshortskip and \belowdisplayshortskip like we sometimes
% used to with array env.
% This is bad, and so to conserve space and keep old documents fitting
% on the page, it might as well always use the short skips.

\def\@beforedisplay{%
  \abovedisplayskip\abovedisplayshortskip
  \belowdisplayskip\belowdisplayshortskip}

\def\displayone#1#2{\@beforedisplay\nopagebreak[2]$$
  \vcenter{{\tabskip=0pt plus 1 fil
   \halign to \hsize
    {\hfil##\hfil\cr
      $\formation{#1}$\cr\noalign{\vskip\captionskip}
      \mbox{#2}\cr}}}$$\afterdisplay}

\def\displaytwo#1#2#3#4{\@beforedisplay\nopagebreak[2]$$
  \vcenter{{\tabskip=0pt plus 1 fil
   \halign to \hsize
    {\hfil##\hfil\tabskip=\dtwosep &\hfil##\hfil\tabskip=0pt plus 1 fil\cr
      $\formation{#1}$
      &$\formation{#3}$\cr\noalign{\vskip\captionskip}
      \mbox{#2}&\mbox{#4}\cr}}}$$\afterdisplay}

\def\displaythree#1#2#3#4#5#6{\@beforedisplay\nopagebreak[2]$$
  \vcenter{{\tabskip=0pt plus 1 fil
   \halign to \hsize
    {\hfil##\hfil\tabskip=\dthreesep &\hfil##\hfil &\hfil##\hfil
	 \tabskip=0pt plus 1 fil\cr
      $\formation{#1}$
      &$\formation{#3}$
      &$\formation{#5}$\cr\noalign{\vskip\captionskip}
      \mbox{#2}&\mbox{#4}&\mbox{#6}\cr}}}$$\afterdisplay}

\def\displayfour#1#2#3#4#5#6#7#8{\@beforedisplay\nopagebreak[2]$$
  \vcenter{{\tabskip=0pt plus 1 fil
   \halign to \hsize
    {\hfil##\hfil\tabskip=\dfoursep &\hfil##\hfil &\hfil##\hfil &\hfil##\hfil
	 \tabskip=0pt plus 1 fil\cr
      $\formation{#1}$
      &$\formation{#3}$
      &$\formation{#5}$
      &$\formation{#7}$\cr\noalign{\vskip\captionskip}
      \mbox{#2}&\mbox{#4}&\mbox{#6}&\mbox{#8}\cr}}}$$\afterdisplay}

% \displayfive is tricky because a macro can only have up to nine
% parameters.  Nevertheless, this behaves exactly as if it had ten.

\def\displayfive#1#2{\toks0={#1}\toks1={#2}\displayfive@}
\def\displayfive@#1#2#3#4#5#6#7#8{\@beforedisplay\nopagebreak[2]$$
  \vcenter{{\tabskip=0pt plus 1 fil
   \halign to \hsize
    {\hfil##\hfil\tabskip=\dfivesep
         &\hfil##\hfil &\hfil##\hfil &\hfil##\hfil &\hfil##\hfil
	 \tabskip=0pt plus 1 fil\cr
      $\formation{\the\toks0}$
      &$\formation{#1}$
      &$\formation{#3}$
      &$\formation{#5}$
      &$\formation{#7}$\cr\noalign{\vskip\captionskip}
      \mbox{\the\toks1}&\mbox{#2}&\mbox{#4}&\mbox{#6}&\mbox{#8}\cr}}}$$%
  \afterdisplay}

% useful for multi-line captions.  You can use \\ inside of this.
\newcommand\ctablebox[1]{\begin{tabular}[c]{@{}c@{}}#1\end{tabular}}

% Puts a page-wide caption under the FOLLOWING display.
% Yes, you specify this before the display, and it appears after.
% That's because we have to set up to ensure no page break after the display.
\def\caption#1{\postdisplaypenalty=\@M
  \def\afterdisplay{\par \vskip-\lastskip
    {\centering\ctablebox{#1}\par}\postdisplaypenalty=\z@
    \def\afterdisplay{}}}

\def\afterdisplay{}

%%%
%%%  These macros have nothing to do with the pictures, but are
%%%  commonly used in documents that define calls.
%%%

% Some general page layout parameters that are popular:

\parindent 0pt

\oddsidemargin 0pt
\textwidth 6.5in

\topmargin=0pt
\headheight=0pt
\headsep=0pt
\textheight=9in


\newcount\callnumber
\callnumber=0

% The "call" environment can be broken across pages (though it
% tries not to).  It takes one argument, the name of the call.
\def\call#1{\par\pagebreak[2]\bigskip\bigskip
  \global\advance\callnumber by 1
  {\Large\bf\the\callnumber. #1}\par
  \addcontentsline{toc}{call}{\protect\numberline{\the\callnumber.}#1}
  \nopagebreak\bigskip}
\def\endcall{\par}

% A variant, the "call*" environment, never breaks across pages.
\@namedef{call*}#1{\par\bigskip\bigskip\vbox\bgroup
  \global\advance\callnumber by 1
  {\Large\bf\the\callnumber. #1}\par\bigskip}
\@namedef{endcall*}{\par\egroup}

% Sue: A variant, the 'example' environment, is similar to 'call*'
% but has normal size headings, a separate counter, and different spacing.
\newcount\examplenumber
\examplenumber=0
\def\example#1{\par\bigskip\bigskip\vbox\bgroup
  \global\advance\examplenumber by 1
  {\bf Example \the\examplenumber. #1}\par}
\def\endexample{\par\egroup}

% Sue: A variant, the 'sequence' environment, is similar to 'call*'
% but has normal size headings, a separate counter, and different spacing.
\newcount\sequencenumber
\sequencenumber=0
\def\sequence#1{\par\bigskip\bigskip\vbox\bgroup
  \global\advance\sequencenumber by 1
  {\bf Sequence \the\sequencenumber. #1}\par}
\def\endsequence{\par\egroup}

\def\tableofcontents{\twocolumn[\Large\bf\centering
  Table of Contents\\ \vskip\baselineskip]
  \@starttoc{toc}\onecolumn}

\columnsep=30pt		%for the toc.  default is 10pt

% print one line of the toc: secdep, indent, callnumwidth
\def\l@call{\@dottedtocline{2}{0em}{2.2em}}

% Right-justify the call number in the toc.
% Taking this line out restores the default, which is to left-justify.
\def\numberline#1{\hbox to\@tempdima{\hfil#1\ }}

% tex-squares.sty ends here
