\documentclass[11pt,a4paper]{article}
\usepackage[a4paper,margin=3cm]{geometry}
\setlength{\parskip}{2pt}
\makeatletter

\newcommand\cs[1]{\texttt{\char`\\#1}}
\renewcommand\arg[1]{\nolinebreak[2]\mbox{\texttt{\string{#1\string}}}}
\newcommand\oarg[1]{\nolinebreak[2]\mbox{\texttt{[#1]}}}
\newcommand\sarg{\texttt{*}}

\newcommand\meta[1]{\mbox{\ensuremath{\langle}\textit{#1}\ensuremath{\rangle}}}
\newcommand\prototype[1]{\par\pagebreak[1]\bigskip\begingroup
   \noindent\samepage #1\par \nopagebreak \smallskip \endgroup \@afterheading}

% meaningful names, as in faq.sty
\let\environment\texttt
\let\Package\textsf
\makeatother

\begin{document}
\title{The \Package{tabto} package}
\author{Donald Arseneau\thanks{Thanks to Robin
    Fairbairns for making typeset documentation.}}
\date{Dec 2018, version 1.4}
\maketitle

\section*{Tabbing to fixed positions in a paragraph}

Two new text positioning commands are defined: \cs{tabto} and \cs{tab}.

\prototype{\cs{tabto}\arg{\meta{length}}}

Tab to a position relative to the left margin in a paragraph
(any indentation due to a list is part of the `margin' in this
context).  If the text on the line already goes past the desired
position, the tab starts a new line and moves to the requested
horizontal position.


\prototype{\cs{tabto}\sarg\arg{\meta{length}}}

Similar to \cs{tabto}, except it will perform backspacing, and 
over-print previous text on the line whenever that text is already
longer than the specified length (i.e., no linebreak is produced).
Line-breaks are suppressed immediately after \cs{tabto} or \cs{tabto*}.

The length register \cs{CurrentLineWidth} will report the width
of the existing text on the line, and it may be used in the
\meta{length} argument (using calc.sty, for example). Also, there
is \cs{TabPrevPos} which stores the \cs{CurrentLineWidth} from the
previous tab command (the position where the tab command occurred,
not where it went to), and can be used to return to that position
if no line breaks have occurred in between, or directly below it,
if there were line breaks.

\prototype{\cs{tab}}

Tab to the next tab-stop chosen from a list of tab positions, in
the traditional style of typewriters.  A \cs{tab} will always move
to the next tab stop (or the next line), even if it is already
exactly at a tab stop. Thus, ``\cs{tab}\cs{tab}'' skips a position.  A
linebreak is permitted immediately following a \cs{tab}, in case the
ensuing text does not fit well in the remaining space.

The tab-stop positions are declared using either \cs{TabPositions}
or \cs{NumTabs}:

\prototype{\cs{TabPositions}\arg{\meta{length}, \meta{length},
             \textrm{\dots}\meta{length}}}

Declares the tab stops as a comma-separated list of positions 
relative to the left margin. A tab-stop at \texttt{0pt} is implicit, and 
need not be listed.

\prototype{\cs{NumTabs}\arg{\meta{number}}}

Declares a list of \meta{number} equally-spaced tabs, starting at the
left margin and spanning \cs{linewidth}.  For example
\cs{NumTabs}\arg{2} declares tab-stops at \texttt{0pt} and
\texttt{0.5}\cs{linewidth}, the same as
\cs{TabPositions}\arg{0pt, 0.5\cs{linewidth}}
or \cs{TabPositions}\arg{0.5\cs{linewidth}}.


\end{document}
