本文已加入专栏文章目录,归入「进阶使用」文章系列。
在表格中,有时我们需要以斜表线来表示当前单元格无数据、无需填写等。本文尝试使用 diagbox
宏包绘制这种斜表线。
diagbox 的既有功能
diagbox
是刘海洋实现并维护的, 用于制作斜线表头的宏包。先用两个文档中的例子看看它的「设计使用场景」。
绘制斜表线
经过简单尝试(diagbox{}{}
),结合宏包文档阅读,我们大概知道,需要手动设置宽度和高度。
以下是一个尝试:
上面的尝试,包含斜表线的单元格是空的,不包含任何文字内容。继续尝试,绘制斜表线的同时,保留单元格内容。根据对齐方式,这个尝试包含三个部分。
写成宏包参数
虽然在第一次尝试中已经定义了新命令,但它在第二个尝试中又变得冗长起来。抛开具体实现,我们来给命令 diagbox
设计几个参数,让它可以胜任斜表线的绘制:
innerwidthOf = <paired text> 建议输入同列中最宽单元格的内容
heightOf = <dimen> 建议输入同行中最高单元格的高度,默认为 "1line"
text = <paired text> 单元格包含的内容,默认为空
align = l|c|r 对齐方式,默认为 "l"(left,靠左对齐)
如果这些参数都加上了,就可以这样绘制斜表线:
注意,这里的新参数,在设计上有不足(如,widest 接受内容而 highest 接受距离),在功能上也超出了 diagbox
宏包的设计使用场景。新参数的设计和实现,只是一项带有强烈个人偏好的尝试。
最后附上相关的实现。
% usepackage{xpatch}
makeatletter
newififdiagbox@cellEmpty@
define@key{diagbox}{widest}{%
ifdiagbox@cellEmpty@
setkeys{diagbox}{innerwidth=widthof{#1}}%
PackageWarning{diagbox}{innerwidth is set to thediagbox@wd}%
fi}
define@key{diagbox}{highest}{%
ifdiagbox@cellEmpty@
setkeys{diagbox}{height=#1}%
fi}
define@key{diagbox}{text}{%
defdiagbox@text{#1}}
define@key{diagbox}{align}{%
in@{#1}{l, c, r}%
ifin@
defdiagbox@align{#1}%
else
PackageError{diagbox}%
{The value of key "text" must be one of "l", "c", and "r".}%
fi}
xpatchcmd{diagbox@double}{%
setkeys{diagbox}{dir=NW,#1}%
}{%
ifrelaxdetokenize{#2}relax
ifrelaxdetokenize{#3}relax
diagbox@cellEmpty@true
setkeys{diagbox}{highest=1line, align=l, text=@empty}%
fi
fi
setkeys{diagbox}{dir=NW, #1}%
ifdiagbox@cellEmpty@
rlap{makebox
[dimexprdiagbox@wd-diagbox@insepl-diagbox@inseprrelax]%
[diagbox@align]%
{diagbox@text}}%
fi
}{}{ddt}
makeatother