hbox-vbox-halign 可穿透宏,可以吗?

hbox-vbox-halign 可穿透宏,可以吗?

我目前有一个 Plain TeX 文件,它在很多地方执行类似这样的操作:

\indent\hbox{\vbox{\halign{#\hfil\quad&#\hfil\cr
... table content here ...
}}}

我希望将一些东西抽象出来,这样就可以读成这样:

\mySpecialHAlign{
... table content here ...
}

然而,对于我这样的新手来说,定义这样的宏并不容易,原因对于任何尝试过的人来说都是显而易见的。

从技术上讲,是否可以使用正确的 TeX 咒语来创建这种宏,还是我注定每次都要重复整个 hbox-vbox-halign 前言?

(再次注意,我使用的是 Plain TeX)

答案1

\long\def\mytable#1{%
  \leavevmode
  \vbox{%
    \halign{%
      ##\hfil\quad&##\hfil\cr
      #1\crcr
    }%
  }%
}

\mytable{a&b\cr cc&dd\cr}% or
\mytable{a&b\cr cc&dd}

评论

  • \long:的论据\mytable可以使用段落(\par)。
  • 我不认为,如果表格宏用作段落的开头,则它属于表格宏来决定当前段落是否以缩进开头。恕我直言,这\leavevmode是更好的选择,它也用于 LaTeX。
  • 附加的\hbox没有任何用处,因此我已从宏中删除它。
  • \crcr有助于捕捉这种情况,用户忘记了最后的\cr\crcr如果它跟在\cr或之后\noalign{...},则不执行任何操作,否则\cr将关闭最后的表行。
  • #需要\halign加倍内部定义。

无参数的变体:

也可以避免争论。如果争论可能包含需要更改 catcode 的逐字代码,这很有用:

\def\BeginTable{%
  \leavevmode
  \vbox\bgroup
    \halign\bgroup
      ##\hfil\quad&##\hfil\cr
}
\def\EndTable{%
      \crcr
    \egroup
  \egroup
}

\BeginTable a&b\cr cc&dd\cr\EndTable % or
\BeginTable a&b\cr cc&dd\EndTable

答案2

尝试

\def\mySpecialHAlign#1{\indent\hbox{\vbox{\halign{##\hfil\quad&##\hfil\cr #1 }}}}

#注意由于定义在宏内部所以加倍。

相关内容