% \iffalse
% -------------------------------------------------------------------
%
% Copyright 2001--2006, Daniel H. Luecking
%
% Mathdots may be distributed and/or modified under the conditions of the
% LaTeX Project Public License, either version 1.3 of this license or (at
% your option) any later version. The latest version of this license is in
%    <http://www.latex-project.org/lppl.txt>
% and version 1.3 or later is part of all distributions of LaTeX version
% 2003/12/01 or later.
%
% Mathdots has maintenance status "author-maintained". The Current
% Maintainer is Daniel H. Luecking. The Base Interpreters associated with
% mathdots are TeX and LaTeX.
%
%<*sty|tex>
%<*driver>
\ProvidesFile{mathdots.dtx}%
%</driver>
%<sty>\ifx\documentclass\UndEfInEd\input mathdots \expandafter\endinput\fi
%<sty>\ProvidesPackage{mathdots}
%<*sty>
[2006/03/16 v0.8 Improve and add various macros for dots in math.]%
%</sty>
%<tex>\def\mathdotsfiledate{2006/03/16}%
%<tex>\def\mathdotsfileversion{0.8}%
%<*driver>
\documentclass[draft]{ltxdoc}

\addtolength{\textwidth}{.5878pt}

\def\mytt{\upshape\mdseries\ttfamily}
\renewcommand\marg[1]{{\mytt \{#1\}}}
\renewcommand\oarg[1]{{\mytt  [#1]}}
\renewcommand\parg[1]{{\mytt  (#1)}}
\renewcommand\arg[1]{{\mytt\##1}}
\renewcommand{\meta}[1]{{$\langle$\rmfamily\itshape#1\/$\rangle$}}
\DeclareRobustCommand\cs[1]{{\mytt\char`\\#1}}
\def\prog#1{{\mdseries\scshape #1}}
\def\opt#1{{\sffamily\upshape#1}}
\def\mtt#1{{\mytt#1}}
\let\env\mtt
\let\file\mtt
\def\MD{\prog{mathdots}}
\renewcommand\{{\mtt{\char`\{}}
\renewcommand\}{\mtt{\char`\}}}
\renewcommand\|{${}\mathrel{|}{}$}

\makeatletter
\newcommand\bsl{{\mytt\@backslashchar}}
% Stupid lists!
\def\@listi{\leftmargin\leftmargini
  \parsep \z@ \@plus\p@ \@minus\z@
  \topsep 4\p@ \@plus\p@ \@minus2\p@
  \itemsep\parsep}
\let\@listI\@listi \@listi
\renewcommand\labelitemi{\normalfont\bfseries \textendash}
\renewcommand\labelitemii{\textasteriskcentered}
\renewcommand\labelitemiii{\textperiodcentered}
\leftmargini\parindent
% Stupid index!
\def\usage#1{\textrm{#1}}
\def\index@prologue{\section*{Index}\markboth{Index}{Index}%
  Numbers refer to the page where the corresponding entry is described.
}
\def\IndexParms{%
  \parindent \z@ \columnsep 15pt
  \parskip 0pt plus 1pt
  \rightskip 5pt plus2em \mathsurround \z@
  \parfillskip-5pt \small
  % less hanging:
  \def\@idxitem{\par\hangindent 20pt}%
  \def\subitem{\@idxitem\hspace*{15pt}}%
  \def\subsubitem{\@idxitem\hspace*{25pt}}%
  \def\indexspace{\par\vspace{10pt plus 2pt minus 3pt}}}
\makeatother

\title{The \MD{} package\thanks{This file has version number
        \fileversion, last revised \filedate.}}
\author{Dan Luecking}
\date{\filedate}
\DisableCrossrefs
\CodelineIndex
\AlsoImplementation

\begin{document}
  \DeleteShortVerb{\|}
  \DocInput{mathdots.dtx}
\end{document}
%</driver>
%\fi
% \CheckSum{327}
% \CharacterTable
%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%   Digits        \0\1\2\3\4\5\6\7\8\9
%   Exclamation   \!     Double quote  \"     Hash (number) \#
%   Dollar        \$     Percent       \%     Ampersand     \&
%   Acute accent  \'     Left paren    \(     Right paren   \)
%   Asterisk      \*     Plus          \+     Comma         \,
%   Minus         \-     Point         \.     Solidus       \/
%   Colon         \:     Semicolon     \;     Less than     \<
%   Equals        \=     Greater than  \>     Question mark \?
%   Commercial at \@     Left bracket  \[     Backslash     \\
%   Right bracket \]     Circumflex    \^     Underscore    \_
%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%   Right brace   \}     Tilde         \~}
%
% \catcode`\_=12
% \GetFileInfo{mathdots.dtx}
% \maketitle
%
% \begin{abstract}
% This package provides vertical dots and diagonal dots in math, slanting
% in either direction. It should work equally well in \LaTeX{} or plain
% \TeX{}. It improves on the default definitions of plain \TeX{} and
% \LaTeX{}. Similar improvements are provided for the triple and
% quadruple dot accents of AMS\TeX{}/\LaTeX{}.
% \end{abstract}
%
% \StopEventually{\PrintIndex}
%
% \section{Introduction}
%
%  Running \LaTeX{} or \TeX{} on \file{mathdots.ins} generates
% \file{mathdots.sty}, a \LaTeX{} package, and \file{mathdots.tex} a plain
% \TeX{} input file. If one puts \verb"\input mathdots.sty" in a plain
% \TeX{} file, it will cause \file{mathdots.tex} to be input. This is for
% backward compatibility.
%
% Unlike the commands \cs{vdots} and \cs{ddots} provided by \LaTeX{},
% the versions defined by \MD{} change size with \LaTeX{} size
% changing commands, as well as in \{sub[sub]\|super[super]\}scripts.
% After \MD{} is loaded, \verb"\Large$\ddots$" will be larger and
% \verb"\small$\ddots$" will be smaller than \verb"$\ddots$". Moreover,
% \verb"$2^{2^\ddots}$" will also produce a smaller symbol. This last
% example is very unlikely to be needed, but the version with the
% opposite slant is very common.
%
% The default \LaTeX{} (and plain \TeX) definition changes the size of the
% dots, and the horizontal dimensions, but not the vertical dimensions.
% Using the default version in 'scripts produces symbols identical to
% those produced elsewhere. Finally, the default takes the dots from the
% current text font, whereas the \MD{} package takes them from the
% current math symbol font, so they should match other dots in math mode.
% This is only really a concern in \mtt{17pt} sizes or larger where
% \file{cmr17} is scaled to get text dots, but \file{cmsy12} is scaled to
% get math dots.
%
% \cs{iddots} is similar to \cs{ddots}, except it produces the other
% diagonal. This command is not provided in basic \TeX{} or \LaTeX{}.
%
% \cs{vdots} produces vertical dots (as in standard \TeX{} or \LaTeX{}),
% but again, the \MD{} version will change size with size
% changing commands.
%
% The old behavior is stored in \cs{fixedddots} and \cs{fixedvdots}.
% If you wish \cs{iddots} to behave similarly then use \cs{fixediddots}.
%
% The \cs{fixed...} versions try to maintain the (awful) default behavior,
% which is to let the horizontal dimensions change size, as well as the
% dots themselves, but hard code unchanging vertical dimensions.
%
% On the chance that some other package changes the behavior before \MD{}
% is loaded, use \cs{originalddots}, \cs{originalvdots}, and
% \cs{originaliddots} to obtain the versions in force before the \MD{} is
% loaded.
%
% If the \LaTeX{} and the \prog{amsmath} package are detected, the
% commands \cs{dddot} and \cs{ddddot} are modified to get the same
% size changing behavior in 'scripts. They also correct a positioning bug
% in the \prog{amsmath} code. The correction requires the command
% \cs{text}, and so is only applied if \prog{amsmath} has been loaded
% \emph{before} \MD{}. The old amsmath commands are saved
% in \cs{originaldddot} and \cs{originalddddot}. Similar comments apply
% to plain \TeX{} with regard to \file{amstex.tex}.
%
% In \LaTeX{}, all these commands have been made robust as of version 0.6.
%
% \section{The implementation}
%
% We define the version and date for plain\TeX{}. The file
% \file{mathdots.sty} immediately switches to \file{mathdots.tex} if
% \LaTeX{} is not being used.
% \iffalse
%<*dtx>
% \fi
%    \begin{macrocode}
%<tex>\def\mathdotsfiledate{2006/02/07}%
%<tex>\def\mathdotsfileversion{0.7}%
%<sty>\ifx\documentclass\UndEfInEd\input mathdots \expandafter\endinput\fi
%    \end{macrocode}
% \iffalse
%</dtx>
% \fi
%
% The following are commands for plain \TeX{} that prevent double loading,
% announce the package name, and change/restore the category of \mtt{@}.
%    \begin{macrocode}
%<*tex>
\expandafter
\ifx\csname MathDots\mathdotsfileversion\endcsname\relax
\else
  \immediate\write16{Mathdots already loaded.}\expandafter\endinput
\fi
\immediate\write16{Package mathdots, \mathdotsfiledate\space version
  \mathdotsfileversion.}%
\expandafter\edef\csname MathDots\mathdotsfileversion\endcsname{%
    \catcode`\noexpand\@=\the\catcode`@}%
\catcode`\@=11
\def\@nameuse#1{\csname#1\endcsname}%
%</tex>
%    \end{macrocode}
%
% Now various shorthands. For example `\cs{MD@us}\cs{MD@t}' becomes
% `\cs{textstyle}' and `\cs{MD@uf}\cs{MD@ss}' produces
% `\cs{scriptscriptfont 0}'.
%    \begin{macrocode}
\def\MD@us#1{\@nameuse{#1style}}%
\def\MD@uf#1{\@nameuse{#1font}0}%
\def\MD@t{text}\def\MD@s{script}\def\MD@ss{scriptscript}%
\newdimen\MD@unit \MD@unit\p@
%    \end{macrocode}
%
% The following are the main utility macros to implement changes of style.
% Since most of our symbols are built with boxes, they have to exit math
% mode and need \cs{mathchoice} so we know the current style (i.e., size)
% when we re-enter math mode.
%
% We detect differences in sizes (for example, after \cs{large}) by
% examining the appropriate \cs{fontdimen} of family 0. Instead of the
% hard coded \mtt{1pt}, we use \mtt{0.1em} from this family.
%
% We pass along the current style via \cs{everymath}.
%
% In \cs{MD@palette}, \arg1 is a command which we feed the current
% style name. For example, \cs{MD@palette}\cs{MD@ddots} will be our
% definition of \cs{ddots}. Then \cs{MD@ddots} will see the current style
% as its first argument.
%    \begin{macrocode}
\def\MD@changestyle#1{\relax\MD@unit0.1\fontdimen6\MD@uf{#1}%
  \everymath\expandafter{\the\everymath\MD@us{#1}}}%
\def\MD@dot{$\m@th\ldotp$}%
\def\MD@palette#1{\mathchoice{#1\MD@t}{#1\MD@t}{#1\MD@s}{#1\MD@ss}}%
%    \end{macrocode}
%
% In the following commands, \arg1 is the current style (supplied via
% \cs{MD@palette}). Except for the change in the unit used and the dot
% used, the first two definitions are essentially the same as plain's
% \cs{ddots} and \cs{vdots}, and the third is the same as the first with
% the oxes reversed.
%    \begin{macrocode}
\def\MD@ddots#1{{\MD@changestyle{#1}%
  \mkern1mu\raise7\MD@unit\vbox{\kern7\MD@unit\hbox{\MD@dot}}%
  \mkern2mu\raise4\MD@unit\hbox{\MD@dot}%
  \mkern2mu\raise \MD@unit\hbox{\MD@dot}\mkern1mu}}%
\def\MD@vdots#1{\vbox{\MD@changestyle{#1}%
  \baselineskip4\MD@unit\lineskiplimit\z@
  \kern6\MD@unit\hbox{\MD@dot}\hbox{\MD@dot}\hbox{\MD@dot}}}%
\def\MD@iddots#1{{\MD@changestyle{#1}%
  \mkern1mu\raise \MD@unit\hbox{\MD@dot}%
  \mkern2mu\raise4\MD@unit\hbox{\MD@dot}%
  \mkern2mu\raise7\MD@unit\vbox{\kern7\MD@unit\hbox{\MD@dot}}}}%
%    \end{macrocode}
%
% \DescribeMacro{\fixedddots}
% \DescribeMacro{\fixedvdots}
% We include current (2005/12/01) \LaTeX{}/plain\TeX{} definitions
% so a user can choose them. \LaTeX{} and plain\TeX{} don't have the other
% diagonal, so we provide a \DescribeMacro{fixediddots}\cs{fixediddots}
% which is just \cs{fixedddots} with the boxes reversed.
%
% \DescribeMacro{\originalvdots}
% \DescribeMacro{\originalddots}
% We save the versions at load time so user can use them in case he
% loads \MD{} for its other features. Chances are the original
% \DescribeMacro{\originaliddots}\cs{iddots} is undefined.
%    \begin{macrocode}
%<sty>\DeclareRobustCommand\fixedvdots{%
%<tex>\def\fixedvdots{%
  \vbox{\baselineskip4\p@ \lineskiplimit\z@
  \kern6\p@\hbox{.}\hbox{.}\hbox{.}}}%
%<sty>\DeclareRobustCommand\fixedddots{%
%<tex>\def\fixedddots{%
  \mathinner{\mkern1mu
  \raise7\p@\vbox{\kern7\p@\hbox{.}}\mkern2mu
  \raise4\p@\hbox{.}\mkern2mu
  \raise\p@\hbox{.}\mkern1mu}}%
%<sty>\DeclareRobustCommand\fixediddots{%
%<tex>\def\fixediddots{%
  \mathinner{\mkern1mu
  \raise\p@\hbox{.}\mkern2mu
  \raise4\p@\hbox{.}\mkern2mu
  \raise7\p@\vbox{\kern7\p@\hbox{.}}\mkern1mu}}%
\let\originalddots=\ddots
\let\originalvdots=\vdots
\let\originaliddots=\iddots
%    \end{macrocode}
%
% \DescribeMacro{\ddots}
% \DescribeMacro{\vdots}
% \DescribeMacro{\iddots}
% Here are the actual (re)definitions of these three commands. The
% plain\TeX{} version emits messages similar to that produced by
% \LaTeX{}'s \cs{DeclareRobustCommand}.
%    \begin{macrocode}
%<sty>\DeclareRobustCommand\ddots{%
%<tex>\def\ddots{%
  \mathinner{\MD@palette\MD@ddots}}%
%<sty>\DeclareRobustCommand\iddots{%
%<tex>\def\iddots{%
  \mathinner{\MD@palette\MD@iddots}}%
%<sty>\DeclareRobustCommand\vdots{%
%<tex>\def\vdots{%
  \mathinner{\MD@palette\MD@vdots}}%
%<tex>\wlog{Mathdots Info: Redefining \string\ddots.}%
%<tex>\wlog{Mathdots Info: Redefining \string\vdots.}%
%    \end{macrocode}
%
% Now we try to get AMS \cs{dddot} and \cs{ddddot} accents to behave.
%
% \DescribeMacro{\dddot}
% \DescribeMacro{\ddddot}
% We add a \verb"\kern\z@" to prevent \TeX{} from vertically centering
% \arg1. I don't know if the \cs{text} command is necessary, but it
% doesn't seem to hurt. I included it in the original version because that
% one used text dots and needed the text to change size. Now I use a math
% symbol (the dot accent) and mathpalette to implement the change.
% Still, I don't really understand how \cs{ex@} works in the AMS packages,
% so I leave it in. For possible tuning, I have used two macros that
% represent the math spacing placed before and after the sequence of
% dots (\cs{MD@prekern} and \cs{MD@postkern}). Also, the actual dot is in
% the definition of \cs{MD@D} where another spacing command follows the
% dot (\cs{MD@dotkern}). In fact, by redefining \cs{MD@D} and possibly the
% spacing, one can define other double accent commands.
%
% \DescribeMacro{\originaldddot}
% \DescribeMacro{\originalddddot}
% We also save the original \prog{amsmath} versions.
%    \begin{macrocode}
\newbox\MD@dotsbox
\newmuskip\MD@prekern
\newmuskip\MD@postkern
\newmuskip\MD@dotkern
\MD@prekern 0mu
\MD@postkern -1mu
\MD@dotkern -1.3mu
\def\MD@dotsaccent#1{\mathpalette{\MD@@dotsaccent{#1}}}%
\def\MD@@dotsaccent#1#2#3{%
  {\setbox\MD@dotsbox\hbox{$#2\mkern\MD@prekern#1\mkern\MD@postkern$}%
   \mathop{#3\kern\z@}\limits^{%
   \text{\vbox to-1.4\ex@{\kern-1.8\ex@\copy\MD@dotsbox\vss}}}}%
}%
\let\originaldddot \dddot
\let\originalddddot\ddddot
%<*sty>
\@ifpackageloaded{amsmath}{%
  \def\MD@D{\mathchar"5F\mkern\MD@dotkern}%
  \DeclareRobustCommand\dddot {\MD@dotsaccent{\MD@D\MD@D\MD@D}}%
  \DeclareRobustCommand\ddddot{\MD@dotsaccent{\MD@D\MD@D\MD@D\MD@D}}%
}{}%
%</sty>
%<*tex>
\def\amstexfmtname{AmS-TeX}%
\ifx\amstexfmtname\fmtname
  \def\MD@D{\mathchar"5F\mkern\MD@dotkern}%
  \wlog{Mathdots Info: Redefining \string\dddot.}%
  \wlog{Mathdots Info: Redefining \string\ddddot.}%
  \def\dddot {\MD@dotsaccent{\MD@D\MD@D\MD@D}}%
  \def\ddddot{\MD@dotsaccent{\MD@D\MD@D\MD@D\MD@D}}%
\fi
\csname MathDots\mathdotsfileversion\endcsname
%</tex>
%</sty|tex>
%    \end{macrocode}
%\Finale
