我目前有一个 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 }}}}
#
注意由于定义在宏内部所以加倍。