在纯 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