% \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.3c of this license or (at % your option) any later version. The latest version of this license is in % % and version 1.3c or later is part of all distributions of LaTeX version % 2008/05/04 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}% % %\ifx\documentclass\UndEfInEd\input mathdots \expandafter\endinput\fi %\ProvidesPackage{mathdots} %<*sty> [2014/06/11 v0.9 Improve and add various macros for dots in math.]% % %\def\mathdotsfiledate{2014/06/11}% %\def\mathdotsfileversion{0.9}% %<*driver> \documentclass{ltxdoc} \usepackage{amsmath} \usepackage{mathdots} \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(s) 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} % %\fi % \CheckSum{364} % \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{}/AMS\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{ddots} and \cs{vdots} 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$" at normal % size. 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 (and is provided by \MD{}). % % The \prog{amsmath} accents \cs{dddot} and \cs{ddddot} have similar % problems that \MD{} attempts to correct when \prog{amsmath} is loaded. % % See Table~\ref{examples} for examples of the \MD{} commands at % different sizes and in exponents. See Table~\ref{compare} for % comparison, showing the results without \MD{}. % % \def\dott#1{$#1$} % \def\dotts#1{$2^{#1}\quad 2^{2^{#1}}$} % \begin{table}[htbp] % \centering \renewcommand\arraystretch{1.4} % \begin{tabular}{c|cccc} % \multicolumn{1}{l}{\large With \MD{}:}\\[4pt] % \multicolumn{1}{c}{\textbf{Command}}% % &\textbf{Large} &\textbf{normal} &\textbf{scriptsize} % &\textbf{in exponents}\\ % \hline % \verb$\ddots$ & \Large\dott{\ddots} & \dott{\ddots} & \scriptsize\dott{\ddots} % & \dotts{\ddots}\\ % \verb$\vdots$ & \Large\dott{\vdots} & \dott{\vdots} & \scriptsize\dott{\vdots} % & \dotts{\vdots}\\ % \verb$\iddots$ & \Large\dott{\iddots} & \dott{\iddots} & \scriptsize\dott{\iddots} % & \dotts{\iddots}\\ % \verb$\dddot{X}$ & \Large\dott{\dddot{X}} & \dott{\dddot{X}} & \scriptsize\dott{\dddot{X}} % & \dotts{\dddot{X}}\\ % \verb$\ddddot{X}$& \Large\dott{\ddddot{X}}& \dott{\ddddot{X}}& \scriptsize\dott{\ddddot{X}} % & \dotts{\ddddot{X}} % \end{tabular} % \caption{Dots at different sizes and in exponents.} % \label{examples} % \end{table} % % \begin{table}[htbp] % \centering \renewcommand\arraystretch{1.4} % \begin{tabular}{c|cccc} % \multicolumn{1}{l}{\large Without \MD{}:}\\[4pt] % \multicolumn{1}{c}{\textbf{Command}}% % &\textbf{Large} &\textbf{normal} &\textbf{scriptsize} % &\textbf{in exponents}\\ % \hline % \verb$\ddots$ & \Large\dott{\originalddots} & \dott{\originalddots} & \scriptsize\dott{\originalddots} % & \dotts{\originalddots}\\ % \verb$\vdots$ & \Large\dott{\originalvdots} & \dott{\originalvdots} & \scriptsize\dott{\originalvdots} % & \dotts{\originalvdots}\\ % \verb$\dddot{X}$ & \Large\dott{\originaldddot{X}} & \dott{\originaldddot{X}} & \scriptsize\dott{\originaldddot{X}} % & \dotts{\originaldddot{X}}\\ % \verb$\ddddot{X}$& \Large\dott{\originalddddot{X}} & \dott{\originalddddot{X}}& \scriptsize\dott{\originalddddot{X}} % & \dotts{\originalddddot{X}} % \end{tabular} % \caption{Dots without \MD{}.} % \label{compare} % \end{table} % % \DescribeMacro{\ddots} % The default \LaTeX{} (and plain \TeX) definition changes the size of the % dots, and the horizontal dimensions, but not the vertical dimensions, % giving them different slants at different sizes. Also, 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. % % \DescribeMacro{\iddots} % \MD{} supplies also \cs{iddots}, with behavior similar to \cs{ddots}, % except it produces the other diagonal. This command is not provided in % basic \TeX{} or \LaTeX{}. % % \DescribeMacro{\vdots} % \cs{vdots} produces vertical dots (as in standard \TeX{} or \LaTeX{}), % but again, the \MD{} version will change size with size % changing commands. % % \DescribeMacro{\fixedddots} % \DescribeMacro{\fixedvdots} % \DescribeMacro{\fixediddots} % 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. The % `fixed' part of the name does not mean `corrected', but rather % `unchanging' or `frozen'. % % \DescribeMacro{\originalddots} % \DescribeMacro{\originalvdots} % \DescribeMacro{\originaliddots} % 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 \MD{} is % loaded. % % \DescribeMacro{\dddot} % \DescribeMacro{\ddddot} % If the \prog{amsmath} package is detected in \LaTeX{}, 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. Compare the old and new versions and the 2-dot accent % (from basic \LaTeX{}): $\originaldddot{X},\dddot{X},\ddot{X}$. I have % also taken the liberty of changing the spacing between dots to match % that in the 2-dot accent. % % \DescribeMacro{\originaldddot} % \DescribeMacro{\originalddddot} % Some of the changes to \cs{dddot} and \cs{ddddot} require 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}. % % \DescribeMacro{\MDoprekern} % \DescribeMacro{\MDodotkern} % \DescribeMacro{\MDopostkern} % Different math fonts have different metrics for the \cs{dot} and % \cs{ddot} accents. If you use a math font family other than the CM % fonts, you can adjust the positioning and spacing of the the dots in % \cs{dddot} and \cs{ddddot} to better match the spacing in \cs{ddot} % with the following length commands: \cs{MDoprekern}, \cs{MDodotkern} and % \cs{MDopostkern}. These adjust the space before the first dot, between % the dots and after the last dot, respectively. They are in units of % \texttt{mu}, which is $1/3$ the size of the space made by \cs{,}. % Reducing the first and/or increasing the last one cause the dots to be % shifted left. Reducing the middle one causes the dots to be closer % together. As there is usually a bit of white on either side of the dot % character, these usually have to be given negative values (so ``reduce'' % means ``make more negative''). The defaults for the CM fonts are % accomplished by the commands % \begin{verbatim} % \MDoprekern=0mu % \MDodotkern=-1.3mu % \MDopostkern=-1mu \end{verbatim} % I have found that the \prog{mathptmx} package (Times fonts in text and % math) benefits from changing these via the following commands % \begin{verbatim} % \MDoprekern=-1mu % \MDodotkern=-2mu % \MDopostkern=0mu \end{verbatim} % \cs{MDoprekern}, \cs{MDodotkern}, and \cs{MDopostkern} were made % user-accessible commands in version 0.9. % % \DescribeMacro{\MDoddots} % \DescribeMacro{\MDovdots} % \DescribeMacro{\MDoiddots} % \DescribeMacro{\MDodddot} % \DescribeMacro{\MDoddddot} % In \LaTeX{}, all these commands have been made robust as of version 0.6. % On the chance that some later loaded package changes things, the \MD{} % versions can be obtained with \cs{MDoddots}, \cs{MDovdots}, % \cs{MDoiddots}, \cs{MDodddot} and \cs{MDoddddot} (as of version 0.9). % % \section{The implementation} % % 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}% % % \end{macrocode} % % Now various shorthands. For example `\cs{MDo@us}\cs{MDo@t}' becomes % `\cs{textstyle}' and `\cs{MDo@uf}\cs{MDo@ss}' produces % `\cs{scriptscriptfont0}'. % \begin{macrocode} \def\MDo@us#1{\@nameuse{#1style}}% \def\MDo@uf#1{\@nameuse{#1font}0}% \def\MDo@t{text}\def\MDo@s{script}\def\MDo@ss{scriptscript}% \newdimen\MDo@unit \MDo@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{MDo@palette}, \arg1 is a command which we feed the current % style name. For example, \cs{MDo@palette}\cs{MDo@ddots} will be our % definition of \cs{ddots}. Then \cs{MDo@ddots} will see the current style % as its first argument. % \begin{macrocode} \def\MDo@changestyle#1{\relax\MDo@unit0.1\fontdimen6\MDo@uf{#1}% \everymath\expandafter{\the\everymath\MDo@us{#1}}}% \def\MDo@dot{$\m@th\ldotp$}% \def\MDo@palette#1{\mathchoice{#1\MDo@t}{#1\MDo@t}{#1\MDo@s}{#1\MDo@ss}}% % \end{macrocode} % % In the following commands, \arg1 is the current style (supplied via % \cs{MDo@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 boxes reversed. % \begin{macrocode} \def\MDo@ddots#1{{\MDo@changestyle{#1}% \mkern1mu\raise7\MDo@unit\vbox{\kern7\MDo@unit\hbox{\MDo@dot}}% \mkern2mu\raise4\MDo@unit\hbox{\MDo@dot}% \mkern2mu\raise \MDo@unit\hbox{\MDo@dot}\mkern1mu}}% \def\MDo@vdots#1{\vbox{\MDo@changestyle{#1}% \baselineskip4\MDo@unit\lineskiplimit\z@ \kern6\MDo@unit\hbox{\MDo@dot}\hbox{\MDo@dot}\hbox{\MDo@dot}}}% \def\MDo@iddots#1{{\MDo@changestyle{#1}% \mkern1mu\raise \MDo@unit\hbox{\MDo@dot}% \mkern2mu\raise4\MDo@unit\hbox{\MDo@dot}% \mkern2mu\raise7\MDo@unit\vbox{\kern7\MDo@unit\hbox{\MDo@dot}}}}% % \end{macrocode} % % \DescribeMacro{\fixedddots} % \DescribeMacro{\fixedvdots} % We include current (as of 2014/06/11) \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} %\DeclareRobustCommand\fixedvdots{% %\def\fixedvdots{% \vbox{\baselineskip4\p@ \lineskiplimit\z@ \kern6\p@\hbox{.}\hbox{.}\hbox{.}}}% %\DeclareRobustCommand\fixedddots{% %\def\fixedddots{% \mathinner{\mkern1mu \raise7\p@\vbox{\kern7\p@\hbox{.}}\mkern2mu \raise4\p@\hbox{.}\mkern2mu \raise\p@\hbox{.}\mkern1mu}}% %\DeclareRobustCommand\fixediddots{% %\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}. % % Since \cs{ddots} et al.\ are defined in \LaTeX{} with % \cs{DeclareRobustCommand}, saving the original definition with % \verb$\let\originalddots\ddots$ will not work unless the internal % command ``\verb*$\ddots $'' is unchanged. Thus we can't use % \verb$\DeclareRobustCommand\ddots$ directly because it changes that % internal. Instead we define \cs{MDoddots} and then do % \verb$\let\ddots\MDoddots$ % \begin{macrocode} %\DeclareRobustCommand\MDoddots{% %\def\MDoddots{% \mathinner{\MDo@palette\MDo@ddots}}% %\DeclareRobustCommand\MDoiddots{% %\def\MDoiddots{% \mathinner{\MDo@palette\MDo@iddots}}% %\DeclareRobustCommand\MDovdots{% %\def\MDovdots{% \mathinner{\MDo@palette\MDo@vdots}}% %\wlog{Mathdots Info: Redefining \string\ddots.}% %\wlog{Mathdots Info: Redefining \string\vdots.}% \let\ddots \MDoddots \let\iddots\MDoiddots \let\vdots \MDovdots % \end{macrocode} % % Now we try to get AMS \cs{dddot} and \cs{ddddot} accents to behave % nicely. % % \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 \cs{mathpalette} to implement the change. % Still, I don't really understand how \cs{ex@} works in the AMS packages, % so I leave it in. % \DescribeMacro{MDoprekern} % \DescribeMacro{MDodotkern} % \DescribeMacro{MDopostkern} % For possible fine tuning, I have used two macros that % represent the math spacing placed before and after the sequence of % dots (\cs{MDoprekern} and \cs{MDopostkern}). Also, the actual dot is in % the definition of \cs{MDo@D} where another spacing command follows the % dot (\cs{MDodotkern}). In fact, by redefining \cs{MDo@D} and changing % the spacing, one can define other multiple ``dot'' accent commands. % % \DescribeMacro{\originaldddot} % \DescribeMacro{\originalddddot} % We also save the original \prog{amsmath} versions. % \begin{macrocode} \newbox\MDo@dotsbox \newmuskip\MDoprekern \newmuskip\MDopostkern \newmuskip\MDodotkern \MDoprekern 0mu \MDopostkern -1mu \MDodotkern -1.3 mu \def\MDo@dotsaccent#1{\mathpalette{\MDo@@dotsaccent{#1}}}% \let\originaldddot \dddot \let\originalddddot\ddddot %<*sty> \def\MDo@@dotsaccent#1#2#3{% {\setbox\MDo@dotsbox\hbox{$#2\mkern\MDoprekern#1\mkern\MDopostkern$}% \mathop{#3\kern\z@}\limits^{% \text{\vbox to-1.4\ex@{\kern-1.8\ex@\copy\MDo@dotsbox\vss}}}}% }% \@ifpackageloaded{amsmath}{% \def\MDo@D{\mathchar"5F\mkern\MDodotkern}% \DeclareRobustCommand\MDodddot {% \MDo@dotsaccent{\MDo@D\MDo@D\MDo@D}}% \DeclareRobustCommand\MDoddddot{% \MDo@dotsaccent{\MDo@D\MDo@D\MDo@D\MDo@D}}% \let\dddot \MDodddot \let\ddddot\MDoddddot }{}% % % \end{macrocode} % % For plain tex + amstex: \cs{ex@} is set in \file{amstex.tex} to % \texttt{.2326ex}, so its value depends on the value of \texttt{ex} when % \prog{amstex} is loaded. Unlike \prog{amsmath}, it doesn't seem to be % recalculated with size changes. Thus, in plain TeX we add a reset. % \begin{macrocode} %<*tex> \def\MDo@@dotsaccent#1#2#3{% {% \setbox\MDo@dotsbox\hbox{$#2\mkern\MDoprekern#1\mkern\MDopostkern$}% \mathop{#3\kern\z@}\limits^{\text{\ex@.2326ex \vbox to-1.4\ex@{\kern-1.8\ex@\copy\MDo@dotsbox\vss}}}% }}% \ifx\amstexloaded@\relax % true if amstex has been loaded % A backup test in case \amstexloaded@ became \relax by accident: \ifx\ddddot\UndEfInEd \else \def\MDo@D{\mathchar"5F\mkern\MDodotkern}% \wlog{Mathdots Info: Redefining \string\dddot.}% \wlog{Mathdots Info: Redefining \string\ddddot.}% \def\MDodddot {\MDo@dotsaccent{\MDo@D\MDo@D\MDo@D}}% \def\MDoddddot{\MDo@dotsaccent{\MDo@D\MDo@D\MDo@D\MDo@D}}% \let\dddot \MDodddot \let\ddddot\MDoddddot \fi \fi \csname MathDots\mathdotsfileversion\endcsname % % % \end{macrocode} %\Finale