编辑:
似乎我可以\noalign\bgroup
在 之前使用\halign
。没问题。但是我如何测试我是否在 halign 组中?我可以编写自己的 if,但最好询问 tex 的状态,而不是引入自己的状态变量。
原始问题:
\halign 表宏的纯 TeX 嵌套
为什么我不能嵌套使用我的 \begindescrows 宏,或者我怎样才能更改命令以便可以嵌套它:
\def\begindescrows #1,#2,#3.{\begingroup\baselineskip 2em\parindent 0pt
\parskip 6pt plus1pt minus1pt
\def\bullet{#1}
\setbox0=\hbox{{\datefont ~\bullet~~ }} \def\dateSize{#2}
\def\descSize{#3}
\def\dcol{\hsize \descSize}
\def\fcol{\hsize \dateSize}
\def\desc##1{\vtop{\tolerance=5000\dcol\baselineskip 1.1em ##1\vskip 1em}}
\def\date##1 -- ##2:{\vtop{\datefont\tolerance=5000\fcol\parskip0pt\baselineskip 1.1em
\hskip-\wd0\copy0 ##1 --\hfill\break
##2\par\vskip 1em}}
\def\row ##1 -- ##2:##3\cr{\date ##1 -- ##2: &\desc{##3}\cr}
\halign\bgroup##\hfil&##\hfil\cr
}
\def\enddescrows{\crcr\egroup\endgroup\par\vskip -1em plus .5em\noindent}
\begindescrows von,3.5cm,13cm.
\row November 2006 -- now: Some time went by.\cr
\begindescrows als,2.5cm,10cm.
\row This -- makes: no sense, but actually I want to nest a command similar to \\begindescrows.\cr
\enddescrows
\enddescrows
\bye
错误日志如下:
$ pdftex --file-line-error testfile.tex
This is pdfTeX, Version 3.14159265-2.6-1.40.16 (TeX Live 2015) (preloaded format=pdftex)
restricted \write18 enabled.
entering extended mode
encTeX v. Jun. 2004, reencoding enabled.
(./testfile.tex
Runaway definition?
#1 -- #2:#3\hfil
./testfile.tex:19: Forbidden control sequence found while scanning definition o
f \row.
<inserted text>
}
<to be read again>
\endtemplate
<template> \hfil \endtemplate
\begindescrows ...m}} \def \row ##1 -- ##2:##3\cr
{\date ##1 -- ##2: &\desc ...
l.19 \begindescrows als,2.5cm,10cm.
? X
No pages of output.
Transcript written on testfile.log.
答案1
我发现在宏内部不使用 \noalign 会更简单,但在外部(我知道我在 \halign 内部)使用会更简单。因此
\begindescrows ...
可以简单地嵌套在任何级别,使用
\noalign{\begindescrows ...
....
\enddescrows}
实际上,从宏外部可以看到嵌套和对齐特性是件好事。