我正在尝试使用我构建的一些自定义命令来制作排版表单。这项工作的一部分是制作“空白”:用于空白空间的宏,在文档打印后,有人可以在其中写入内容。它们的定义在 formfields 包中(有关如何获取它的信息位于帖子底部)。
我遇到了以下问题:表格中有一些空白,而左列中的空白没有与第一列的末尾齐平。最终,我将其追溯到以下变化,如本 MWE 中的这两个表格所示:
\documentclass[draft]{article}
\usepackage{tabu}
\usepackage{formfields}
\usepackage[left=1.0in, right=.5in, top=.7in, bottom=.7in]{geometry}
\begin{document}
% not flush, and blanks don't all come up to same place.
\begin{tabu} {X<{ \hspace{.5em} }>{ \hspace{.5em} }X}
\field{thing}& \hrulefill\\
\blank & \hrulefill\\
\field{thing}& \hrulefill\\
\end{tabu}
% all blanks flush with each other at right end of 1st column.
\begin{tabu} {X<{\hspace{.5em}}>{\hspace{.5em}}X}
\field{thing}& \hrulefill\\
\blank & \hrulefill\\
\field{thing}& \hrulefill\\
\end{tabu}
% same as second table.
\begin{tabu} {XX}
\field{thing}& \hrulefill\\
\blank & \hrulefill\\
\field{thing}& \hrulefill\\
\end{tabu}
\end{document}
为什么第二和第三个表中的空白和字段都与第一列的末尾齐平,但第一个表中却不是这样?如果我对每一行做了不同的事情,我可以理解,但在这两个表中,我认为我没有做任何不同的事情,这会导致规则在右侧彼此不对齐;我假设这意味着第一个表的不同行中第一列末尾的空格长度不同。我不明白为什么会这样。我问这个问题是因为几个星期以来我都无法弄清楚表头中的空格是罪魁祸首。我希望得到一些关于如何诊断和调试这类事情。如果可以的话,请特别注意这一点。
问题的一部分似乎是我的表中<
和>
列说明符内的空格,因为 MWE 中的第二个表已删除空格,并且所有空格都与第一列的末尾齐平。我并不惊讶空格会阻止空格与第一列的右端齐平,但我不明白为什么不同的空格会有不同的作用。
其他资源
问题的图片(红色矩形是后来添加的,它们显示了线条不齐平的位置)。
放大第一张(顶部)表格的图片:
答案1
调试此问题的一种方法是查看生成的输出框。添加以下内容后,您可以看到它的表示形式:
\tracingoutput=1
\showboxbreadth=100
\showboxdepth=20
在文档的开头。然后,您可以比较三个表格及其单元格之间的差异,以便至少看到 TeX 的结果。
为什么只有某些地方才有多余的空间?
这是需要进一步调查的部分。在表 3 中,很明显,列格式中没有定义空格,因此输出中没有添加空格。在表 2 中\hspace
,只有 s(内部\hskip
s,即粘合元素)被添加到输出框中。在表 1 中,一些空格字符也出现在输出中,这可能是由于 TeX 解析宏参数的方式。
每当在框/行的开头和结尾出现粘连时,它就会从输出中删除。这就是为什么会\hspace
从表 2/列 1 中删除的原因。但是,在表 2/列 2 中,它仍然在左侧,因为框\null
(列 1 中也有)出现在它之前。我不知道为什么\hspace
列 1 中仍然没有。
为什么第一个表中有差异空格?
我们来比较一下表1/1列第1行和第2行框的相关部分:
% line 1 line 2
\hbox(0.0+0.0)x0.0 \hbox(0.0+0.0)x0.0
\OT1/cmr/m/n/10 t
\OT1/cmr/m/n/10 h
\OT1/cmr/m/n/10 i
\OT1/cmr/m/n/10 n
\OT1/cmr/m/n/10 g
\OT1/cmr/m/n/10 :
\leaders 3.50006
\rule(*+*)x0.4
\leaders 0.0 plus 1.0fill \leaders 0.0 plus 1.0fill
\rule(0.4+0.0)x* \rule(0.4+0.0)x*
\kern 0.0 \kern 0.0
\glue 4.44444 plus 3.33331 minus 0.55556 \glue 3.33333 plus 1.66666 minus 1.11111
% ^------------ here's the difference ----------^
\glue 5.0 \glue 5.0
\penalty 10000 \penalty 10000
\rule(0.0+0.0)x0.0 \rule(0.0+0.0)x0.0
\penalty 10000 \penalty 10000
\glue(\parfillskip) 0.0 plus 1.0fil \glue(\parfillskip) 0.0 plus 1.0fil
\glue(\rightskip) 0.0 \glue(\rightskip) 0.0
您可以在中间部分看到这两个\glue
值。第一个值来自空格字符之一,第二个值来自\hspace
。两者都应该获得其自然宽度,因为带有 的前导符1.0fill
占据了所有剩余空间。那么为什么第一个比第二个大呢?
答案是 TeX 处理标点符号后空格的方式。通过\sfcode
,TeX 中的每个字符都可以分配一个空间因子,该因子可以拉伸其后的空间。由于您的\field
宏在末尾打印了 a :
,因此处理空格字符时的活动空间因子仍然是分配给 的空间因子:
,默认设置下为 2000。通过添加所谓的“额外空间”,这使得以下空间比第 2 行中自然宽度的空间略大。
尝试\sfcode`\:=1000
在文档的开头添加以强制自然宽度和末尾的空格变为相同的宽度:
答案2
根本不清楚为什么要添加\hspace
列规范。
反正,
\begin{tabu} {X<{ \hspace{.5em} }>{ \hspace{.5em} }X}
所做的远不止添加 .5em,因为它添加了“空格”、“半个四边形”、“空格”。但是,在第一列中,段落结束时最后一个空格会被删除。这也发生在您的第二个示例中,其中尾随空格\hspace{.5em}
被吃掉了。
您可以使用{\hspace*{.5em}}
,但还有一个更简单的解决方案。
\documentclass[draft]{article}
\usepackage{tabu}
\usepackage{formfields}
\usepackage[left=1.0in, right=.5in, top=.7in, bottom=.7in]{geometry}
\begin{document}
% not flush, and blanks don't all come up to same place.
\begin{tabu} {X<{\hspace*{.5em}}>{\hspace*{.5em}}X}
\field{thing}& \hrulefill\\
\blank & \hrulefill\\
\field{thing}& \hrulefill\\
\end{tabu}
\bigskip
% all blanks flush with each other at right end of 1st column.
\begin{tabu} {X @{\hspace{\dimexpr1em+2\tabcolsep}} X}
\field{thing}& \hrulefill\\
\blank & \hrulefill\\
\field{thing}& \hrulefill\\
\end{tabu}
\end{document}
黑框显然是由于 的定义错误而造成的\field
。