将 \obeylines 与 \halign 包装成宏

将 \obeylines 与 \halign 包装成宏

在 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,因为这不能扩展来执行替换。

相关内容