在宏中使用 \settabs

在宏中使用 \settabs

在纯 TeX 中,我想定义自定义列定义并将其存储在宏中。

\def\TableHeader{\settabs\+\indent&\hskip 1.5in&\cr}

以便以后我可以定义表格

\TableHeader
\+&Foo &Text.\cr
\+&Bar &More text.\cr

但是它不能作为宏使用

Runaway definition?
->\settabs
! Forbidden control sequence found while scanning definition of \TableHeader.
<inserted text>
}
<to be read again>
\+
l.3 \def\TableHeader{\settabs\+
                             \indent&\hskip 1.5in&\cr}
?

我正在寻找用纯 TeX 编写这种宏的正确方法。

答案1

该宏\+声明为\outer,因此不能出现在宏的替换文本中。请改用\tabalign

以下是相关摘录plain.tex

601 \def\cleartabs{\global\setbox\tabsyet\null \setbox\tabs\null}
602 \def\settabs{\setbox\tabs\null \futurelet\next\sett@b}
603 \let\+=\relax % in case this file is being read in twice
604 \def\sett@b{\ifx\next\+\def\nxt{\afterassignment\s@tt@b\let\nxt}%
605   \else\let\nxt\s@tcols\fi \let\next\relax \nxt}
606 \def\s@tt@b{\let\nxt\relax \us@false\m@ketabbox}
607 \def\tabalign{\us@true\m@ketabbox} % non-\outer version of \+
608 \outer\def\+{\tabalign}

以及 TeXbook 中的相应引文:

\+此处已将宏声明为 ' \outer',以便 TeX 能够更好地检测失控参数和定义(参见第 20 章)。还提供了一个非\outer版本,称为\tabalign,以防在某些“内部”位置需要使用\+。您可以\tabalign像 一样使用\+,但在 之后除外\settabs

不过,你似乎想要在之后使用它\settabs。在这种情况下,“老把戏”奏效了:

\def\TableHeader{\expandafter\settabs\csname+\endcsname\indent&\hskip 1.5in&\cr}

\TableHeader
\+a & b & c\cr

\bye

相关内容