对于 PlainTeX(我确实发现了有关 latex 的类似问题):
- 问题 1:如何确保左上角单元格有两行高?
- 问题 2:如何确保左上角单元格中的条目垂直和水平居中?
在下图中,左侧的表格按照下面的代码排列;需要指导如何开发右侧表格的代码:
代码(左表):
% plain TeX with pdftex
\parskip3mm
Attempt at adapting example from Seroul and Levy's {\it A Beginner's Book of $TeX$}:
\leftskip10mm
\item{Q 1}How to ensure upper left cell is two rows tall?
\item{Q 2}How to ensure entry in upper left cell is vertically and horizontlly centered?
\leftskip0mm
$$\vbox{\offinterlineskip
\catcode`\*=\active \def*{\hphantom{0}}
\def\vr{\vrule height 12pt depth 5pt} \def\vrq{\vr\quad}
\settabs
\+\vr\quad A \quad&\vr\quad Col A\quad&\vr\quad Col B\quad&\cr
\hrule
\+\vrq &\vrq Spanning 2 Cols&&\vr\cr
\hrule
\+\vrq \# &\vr\hfill Col A\hfill&\vr\hfill Col B\hfill&\vr\cr
\hrule
\+\vrq 1 &\vr\hfill R1C1\hfill&\vr\hfill R1C2\hfill&\vr\cr
\hrule
\+\vrq 2 &\vr\hfill R2C1\hfill&\vr\hfill R2C2\hfill&\vr\cr
\hrule
}$$
\bye
更新:
使用图书馆并查阅了大约 10 本关于纯 TeX 的书——只有一本,Malcolm Clark 的简单的 TeX 入门解决创建不仅包含水平组合单元格而且包含垂直组合单元格的表格的问题(参考该书的图 15.3 和 16.3)。
我尝试修改 Seroul 和 Levy 的 9.10 节中的表格TeX 初学者指南通过使用 Clark 的想法来添加水平和垂直组合的单元格——但从下图可以看出,存在垂直居中、垂直空间过大和垂直“倒钩”的问题:
代码如下:
% plain TeX with pdftex
$$\vbox{\offinterlineskip
\def\foovrule{\vrule}
%\def\foovrule{\vrule height 0pt depth 0pt}
%\def\foovrule{}
\def\foohrulefill{\hrulefill}
%\def\foohrulefill{\leaders\hrule height 0pt depth 0pt \hfill}
\def\mr{\omit&height 2pt&&&&&&\cr}
\def\vspan#1#2{\parindent0pt\setbox0
\vbox to#1\normalbaselineskip
{\null\vfill#2\vfill\null}%
\ht0\ht\strutbox
\dp0\dp\strutbox
\setbox1\hbox{#2}\wd0\wd1\box0}
\halign{\strut#&\vrule#\quad&
\hfil$#$\hfil&
\quad\vrule#\quad&
\it#\hfil&\quad\vrule#\quad&
\hfil#&\quad\vrule#\cr
\noalign{\hrule} \mr
&&\omit\bf name&&
\bf type&&
\bf value&\cr
\mr \noalign{\hrule} \mr
&&x&& integer&& 1987& \cr
\mr \noalign{\hrule} \mr
&&y&& real&& 3.14159& \cr
\mr \noalign{\hrule} \mr
&&\vspan2{entry needs lowering}&& excess space below&& excess space below& \cr
&&&\omit\quad\foovrule\foohrulefill&
\omit\foohrulefill&\omit\foohrulefill\foovrule\foohrulefill&
\omit\foohrulefill&
\omit\foohrulefill\foovrule \cr
&&&& \multispan3 small vertical barbs from column divider& \cr
\mr \noalign{\hrule} \mr
&&z&& boolean&& false& \cr
\mr \noalign{\hrule}
}}$$
\bye
尝试通过调整 \vrule 和 \hrulefill 的高度和深度(参见 \foovrule 和 \foohrulefill)来解决垂直问题(居中、多余的空间和倒钩),但没有帮助。
又一个更新:
能够调整@wipet 的解决方案以获得以下内容
以下是调整内容:
1)通过将倒钩高度设为0来移除倒钩:
\def\barb{\omit \vrule height 0pt \hfil\vrule}
2) 通过增加 \halign 的深度使条目上方和下方的空间相等:
\halign{\vrule height3ex depth2ex
3) 通过修改 \def\low#1 重新调整居中:
\def\low#1{\vbox{\hbox{\rm#1}\kern-12pt}}
我怀疑@wipet 可以想出更好的方法来实现调整;将等待这种可能性发生后再接受他的解决方案。
答案1
我不明白你的代码为什么这么复杂。这里有更简单的代码,它创建的表与问题中提到的表完全相同。
\vbox{\offinterlineskip
\def\crl{\cr\noalign{\hrule}}
\def\barb{\omit \vrule height 3pt \hfil\vrule}
\def\low#1{\vbox{\hbox{\rm#1}\kern-9pt}}
\halign{\vrule height3ex depth1ex
\quad\hfil\it #\unskip\hfil\quad\vrule&%
\quad\it#\unskip\hfil\quad\vrule&\hfil\quad#\unskip\quad\vrule\span\crl
% data:
\bf name\hfill\ & \bf type & \bf value \crl
x & integer & 1987 \crl
y & real & 3.14159 \crl
\low{entry needs lowering} & excess space below & exess space below \cr
\omit &\omit\hrulefill &\omit\hrulefill \cr
\barb && \cr
& \multispan2 \hfil small vertical barbs from column divider \hfil\vrule\cr
\barb &&\crl
z & boolean & false \crl
}}
答案2
你可以使用\valign
:
\newskip\colskip \colskip=2em
\newtoks\cellformat \cellformat={
\parindent=0pt
\raggedright
\hsize=\dimexpr\hsize/4 % the width of a cell
}
{
\def\cr{\crcr\noalign{\hskip\colskip}} % gets inserted between columns
\valign{& \vfill\the\cellformat #\vfill\tabskip=\baselineskip\crcr
\span Two rows& 3rd row& 4th row\cr
1st row 2nd col& 2nd row \& col\cr
\multispan3\vfil\the\cellformat cell spanning 3 rows\vfil\cr
}
}
\bye