我使用的是纯 TeX。我想定义一个宏 \cpar,使
\centerline{A\cpar B}
扩大至
\centerline{A}\centerline{B}
我尝试过类似的事情
\def\cpar{\egroup\centerline\bgroup}
以及 \let 和 \expandafter 的各种变体,但无法使其工作。有什么提示吗?
答案1
您可以发出\hss\egroup
,关闭 发起的框\line{\hss#1\hss}
,然后\line\bgroup\hss
重新启动业务。
\def\cpar{\hss\egroup\line\bgroup\hss}
\centerline{A\cpar B\cpar CDEF\cpar Some more words}
\bye
请注意,之前的空格\cpar
不会被删除。
一种不同的实现方式,使用\\
和来修剪项目周围的空格。
\input expl3-generic
\ExplSyntaxOn
\cs_set_eq:NN \atdot_centerline:n \centerline
\cs_set_protected_nopar:Npn \centerline #1
{
\seq_set_split:Nnn \l_atdotde_centerline_seq { \\ } { #1 }
\seq_map_inline:Nn \l_atdotde_centerline_seq
{
\atdot_centerline:n { ##1 }
}
}
\ExplSyntaxOff
\centerline{A \\ A\\ B \\ CDEF\\ Some more words}
\bye
答案2
我创建了一个新的宏\Centerline
来执行此操作。
\input listofitems
\let\cpar\relax
\def\Centerline#1{%
\setsepchar{\cpar}%
\readlist\clarg{#1}%
\foreachitem\z\in\clarg[]{\centerline{\z}}%
}
\Centerline{Plain old Centerline}
\Centerline{Test number 1\cpar Test number 2 right now}
\Centerline{First\cpar Second\cpar Third}
\bye
我并不建议重新定义\centerline
它自己,但是那也可以做到:
\input listofitems
\let\cpar\relax
\let\svcenterline\centerline
\def\centerline#1{%
\setsepchar{\cpar}%
\readlist\clarg{#1}%
\foreachitem\z\in\clarg[]{\svcenterline{\z}}%
}
\centerline{Plain old Centerline}
\centerline{Test number 1\cpar Test number 2 right now}
\centerline{First\cpar Second\cpar Third}
\bye