在 TeXbook 中,Knuth 给出了一个例子:
你是否厌倦了输入? 你可以使用下面的方法让 plain TEX 在每行输入的末尾
\cr
插入一个自动命令:\cr
\begingroup \let\par=\cr \obeylines % \halign{⟨preamble⟩ ⟨first line of alignment⟩ ... ⟨last line of alignment}\endgroup
如何将其包装成宏?这样就可以使用:
\mytable{%
This & is & the & first & row
This & is & the & second & row
}
答案1
我可能忽略了一个技术问题,但下面的方法似乎有效。我只是用序言本身替换了约瑟夫的序言构造,并使用了双井号,因为我们在定义中。
关键点(取自约瑟夫的回答)是使用一个宏(\mytable
)来做\obeylines
(即设置换行符的 catcode),前使用不同的宏读取参数\mytableAux
。
\def\mytable{%
\begingroup
\let\par=\cr
\obeylines
\mytableAux
}
\def\mytableAux#1{%
\halign{##&##&##&##&##\cr#1}%
\endgroup
}
\mytable{%
This & is & the & first & row
This & is & the & second & row
}
\bye
答案2
例如
\def\mytable{%
\begingroup
\let\par=\cr
\obeylines
\mytableAux
}
\def\mytableAux#1{%
\mytoks=\expandafter{\the\myhash}%
\mytoks=\expandafter\expandafter\expandafter
{\expandafter\the\expandafter\myhash\expandafter&\the\mytoks}%
\mytoks=\expandafter\expandafter\expandafter
{\expandafter\the\expandafter\myhash\expandafter&\the\mytoks}%
\mytoks=\expandafter\expandafter\expandafter
{\expandafter\the\expandafter\myhash\expandafter&\the\mytoks}%
\mytoks=\expandafter\expandafter\expandafter
{\expandafter\the\expandafter\myhash\expandafter&\the\mytoks\cr#1}%
\halign\expandafter{\the\mytoks}%
\endgroup
}
\newtoks\mytoks
\newtoks\myhash
\myhash={#}
\mytable{%
This & is & the & first & row
This & is & the & second & row
}
\bye
这里的大部分工作都是关于构建模板:我没有使用循环或任何微妙的东西,尽管在实际应用中你会这样做。(例如,看看 LaTeX2e 如何\halign
为表格构建模板。)你需要\halign
在设置 的组中拥有^^M=\cr
,因为这不能扩展来执行替换。