# [texhax] tabbing in macros

Uwe Lück uwe.lueck at web.de
Thu Sep 7 14:29:43 CEST 2006

There is a simple way to avoid the problem I previously closed with
(see below). The following example may give a hint at how
to use \+ and (unmodified) \settabs in a macro (tested):

\begingroup

\let\+\relax

\gdef\table{%
\tabalign 1& 2& 3\cr
\tabalign  & 4& 5\cr
\tabalign  &  & 6\cr
}

\endgroup

\table

\bye

In general, define all your macros using \+ globally
in a group started with \let\+\relax

Bye,

Uwe.

__________________

At 21:28 05.09.06, markrichard at cox.net wrote:
>I am trying to find a way to write tabbing commands (like \+ or
>\settabs) within a macro.  Can you help me with this or direct me to
>where this info can be located? I am using plain TeX.

At 19:13 06.09.06, Oleg Katsitadze wrote:
>\+ is defined as an outer macro, therefore it cannot be used
>inside another macro.  But \tabalign (which is what \+
>calls) can.  Unfortunately, \settabs will not work if you
>use \tabalign in the sample line:
>
>   \settabs\tabalign Text& More text&\cr % <- doesn't work
>
>because \settabs looks ahead for a \+ and doesn't find it.

Another point that I missed in my previous two postings!

>Probably the easiest way to deal with this is to redefine \+
>to be non-outer:
>
>   \def\+{\tabalign}

\let\+\tabalign works as well -- I tested it with Oleg's example below.

>   \def\table{%
>     \+ 1& 2& 3\cr
>     \+  & 4& 5\cr
>     \+  &  & 6\cr
>   }
>
>   \table
>
>   \bye

To do penance additionally, I suggest another approach:
Define a variant \nosettabs of \settabs that deals with \tabalign
like \settabs deals with \+ (cf. \settabs etc. in
http://www.dante.de/CTAN/macros/plain/base/plain.tex
[which is free!!?]):

\catcode\@=11

\def\nosettabs{\setbox\tabs=\null \futurelet\next\n at sett@b}
\def\n at sett@b{\ifx\next\tabalign
\def\nxt{\afterassignment\n at s@tt at b\let\nxt}%
%% <- You may replace the previous \n at s@tt at b with \s at tt@b
%%    and drop the definition of \n at s@tt at b below if your
%%    Plain Format is suffienctly recent ->
\else\let\nxt\s at tcols\fi \let\next\relax \nxt}
\def\n at s@tt at b{\let\nxt\relax \us at false\m at ketabbox} % local

\catcode\@=12

Test this with the following adaptation of Oleg's example
(\settabs replaced by \nosettabs, \+ by \tabalign):

\def\table{%
\tabalign 1& 2& 3\cr
\tabalign  & 4& 5\cr
\tabalign  &  & 6\cr
}

\table

\bye

[OK -- better stop reading here if you are happy enough!]

A point in favour of this approach is that otherwise
your own tabbing macros should contain something like
\let\+\tabalign -- while \outer forbids such macros -- try

\def\nonoutertabbing{\let\+\tabalign}

to experience how it fails (I tried some \begingroup \gdef
in vain as well).