% http://tex.stackexchange.com/questions/106244/using-a-lot-of-marginpars
\ProvidesPackage{tabto}[2013/03/25 \space v 1.3 \space 
Another tabbing mechanism]\relax

\newdimen\CurrentLineWidth
\let\TabPrevPos\z@

\newcommand\tabto[1]{%
	\leavevmode
	\begingroup
	\def\@tempa{*}\def\@tempb{#1}%
	\ifx\@tempa\@tempb % \tab* 
	\endgroup
	\TTo@overlaptrue % ... set a flag and re-issue \tabto to get argument
	\expandafter\tabto
	\else
	\ifinner % in a \hbox, so ignore
	\else % unrestricted horizontal mode
	\null% \predisplaysize will tell the position of this box (must be box)
	\parfillskip\fill
	\everydisplay{}\everymath{}%
	\predisplaypenalty\@M \postdisplaypenalty\@M
	$$% math display so we can test \predisplaysize
	\lineskiplimit=-999pt % so we get pure \baselineskip
	\abovedisplayskip=-\baselineskip \abovedisplayshortskip=-\baselineskip
	\belowdisplayskip\z@skip \belowdisplayshortskip\z@skip
	\halign{##\cr\noalign{%
		% get the width of the line above
		%\message{>>> Line \the\inputlineno\space -- \predisplaydirection\the\predisplaydirection, \predisplaysize\the\predisplaysize, \displayindent\the\displayindent, \leftskip\the\leftskip, \linewidth\the\linewidth. }%
		\ifdim\predisplaysize=\maxdimen % mixed R and L; call the line full
		\message{Mixed R and L, so line is full. }%
		\CurrentLineWidth\linewidth
		\else
		\ifdim\predisplaysize=-\maxdimen % impossible, in vmode; call the line empty
		\message{Not in paragraph, so line is empty. }%
		\CurrentLineWidth\z@
		\else
		\ifnum\TTo@Direction<\z@
		\CurrentLineWidth\linewidth \advance\CurrentLineWidth\predisplaysize
		\else
		\CurrentLineWidth\predisplaysize 
		\fi
		% Correct the 2em offset
		\advance\CurrentLineWidth -2em
		\advance\CurrentLineWidth -\displayindent
		\advance\CurrentLineWidth -\leftskip
		\fi\fi
		\ifdim\CurrentLineWidth<\z@ \CurrentLineWidth\z@\fi
		% Enshrine the tab-to position; #1 might reference \CurrentLineWidth
		\@tempdimb=#1\relax
		\message{*** Tab to \the\@tempdimb, previous width is \the\CurrentLineWidth. ***}%
		% Save width for possible return use
		\xdef\TabPrevPos{\the\CurrentLineWidth}%
		% Build the action to perform
		\protected@xdef\TTo@action{%
			\vrule\@width\z@\@depth\the\prevdepth
			\ifdim\CurrentLineWidth>\@tempdimb
			\ifTTo@overlap\else
			\protect\newline \protect\null
			\fi\fi
			\protect\nobreak
			\protect\hskip\the\@tempdimb\relax
		}%
		%\message{\string\TTo@action: \meaning \TTo@action. }%
		% get back to the baseline, regardless of its depth.
		\vskip-\prevdepth
		\prevdepth-99\p@
		\vskip\prevdepth
	}}%
	$$
	% Don't count the display as lines in the paragraph
	\count@\prevgraf \advance\count@-4 \prevgraf\count@
	\TTo@action
	%%   \penalty\@m % to allow a penalized line break
	\fi
	\endgroup
	\TTo@overlapfalse
	\ignorespaces
	\fi
}

% \tab -- to the next position
% \hskip so \tab\tab moves two positions
% Allow a (penalized but flexible) line-break right after the tab.
%
\newcommand\tab{\leavevmode\hskip2sp\tabto{\NextTabStop}%
	\nobreak\hskip\z@\@plus 30\p@\penalty4000\hskip\z@\@plus-30\p@\relax}


% Expandable macro to select the next tab position from the list

\newcommand\NextTabStop{%
	\expandafter \TTo@nexttabstop \TabStopList,\maxdimen,>%
}

\def\TTo@nexttabstop #1,{%
	\ifdim#1<\CurrentLineWidth
	\expandafter\TTo@nexttabstop
	\else
	\ifdim#1<0.9999\linewidth#1\else\z@\fi
	\expandafter\strip@prefix
	\fi
}
\def\TTo@foundtabstop#1>{}

\newcommand\TabPositions[1]{\def\TabStopList{\z@,#1}}

\newcommand\NumTabs[1]{%
	\def\TabStopList{}%
	\@tempdimb\linewidth 
	\divide\@tempdimb by#1\relax
	\advance\@tempdimb 1sp % counteract rounding-down by \divide
	\CurrentLineWidth\z@
	\@whiledim\CurrentLineWidth<\linewidth\do {%
		\edef\TabStopList{\TabStopList\the\CurrentLineWidth,}%
		\advance\CurrentLineWidth\@tempdimb
	}%
	\edef\TabStopList{\TabStopList\linewidth}%
}

% default setting of tab positions:
\TabPositions{\parindent,.5\linewidth}

\newif\ifTTo@overlap \TTo@overlapfalse

\@ifundefined{predisplaydirection}{
	\let\TTo@Direction\predisplaysize
	\let\predisplaydirection\@undefined
}
{
	\let\TTo@Direction\predisplaydirection
}
