我试图让我的列在网格上排列,这个任务在 LaTeX 中有时很棘手。(参见本文了解我正在使用的一些技巧。)
一切都很顺利,除了这种情况:在我的环境结束时tabularx
,TeX 跳过了轻微地空间比应有的要小。请注意,直到编号 9006 的表格环境结束,这些行都是完美对齐的,然后对于页面的其余部分来说,有几个点太高了:
从我对代码的阅读来看,它应该\par
在空行中插入一个,跳过 0pt,然后跳过1\baselineskip
开头的垂直空间\itemheading
,从而得到整数倍的\baselineskip
垂直空间。这就是与表格环境不相邻的段落所发生的情况。
我确信有一些长度(\aftertabularxskip
?)我没有设置好,但我无论如何也找不到任何关于表格环境前后垂直间距如何工作的信息,除了表格被视为盒子,这没有多大帮助,因为它仍然没有解释盒子是尺寸。
上面示例的代码(我的实际文档有一组更干净的宏,但我为这个示例内联了几乎所有的宏,以排除宏的问题):
% I'm using memoir for this document, but the same issue occurs if
% using the book class and the tabularx package
\documentclass[openany, letter]{memoir}
\usepackage[utf8]{inputenc}
\usepackage{mathpazo}
% the following three lines don't change the problem, it's just easier to see the issue when the page is formatted
\usepackage[inner=1.3in, outer=1.2in, top=54pt, bottom=71pt, columnsep=12pt, headsep=10pt, headheight=12pt, marginparwidth=0.6in, marginparsep=0.2in, heightrounded=true]{geometry}
\usepackage[colaction]{multicol}
\setlength\columnseprule{0.5pt}
\renewcommand\bigskip{\vspace{1\baselineskip}}
\lineskip=0pt
\lineskiplimit=-10pt
\topskip=1\baselineskip
\setlength{\parskip}{0.0pt}
\setlength{\parindent}{15pt}
\newcommand\itemheading[1]{\vspace*{1\baselineskip}\noindent\textbf{#1}\enspace}
\usepackage{lipsum}
\begin{document}
\begin{multicols}{2}
\itemheading{9000}%
\lipsum[1]
\itemheading{9001}%
\lipsum[2]
\itemheading{9002}%
\lipsum[3]
\itemheading{9003}%
\lipsum[4]
\itemheading{9006}\bigskip
\noindent \begin{tabularx}{\linewidth}{r >{\raggedright\arraybackslash}X}
%\setlength{\extrarowheight}{0pt}
%\setlength{\extratabsurround}{0pt}
%\setlength{\aboverulesep}{0pt}
%\setlength{\belowrulesep}{0pt}
\emph{X}: & ``This is some test text.''\\
\emph{Y}: & ``This is some more test text.''\\
\emph{Z}: & ``This is even more test text.''\\
\end{tabularx}
\itemheading{9007}%
\lipsum[5]
\end{multicols}
\end{document}
编辑:如果有帮助的话,我发现了一个有趣的现象:如果环境中只有一两行,则不会出现问题tabularx
。如果环境中只有三行或更多行,则会出现问题,并且错误会根据行数而有所不同。如果环境中只有四行或更多行,则顶部插入的空格量也会不正确。
答案1
TeX 通过插入胶水来保持线条之间的距离恒定。如果你这样做,例如
\documentclass{article}
\parindent=0pt
\begin{document}
\showoutput
aa\\aa\\AA\\..
\end{document}
您将在日志中看到如下内容:
\glue(\baselineskip) 7.69446
\glue(\baselineskip) 5.16669
\glue(\baselineskip) 10.94446
胶水价值不同取决于相邻线的高度和深度:第一条线位于 aa 和 aa 之间,第二条线位于 aa 和 AA 之间,第三条线位于 A 和点之间。
如果你用同样的方式分开这些行,\par
就会发生同样的情况:TeX 会插入这种粘连,这样你在这里也会得到统一的间距:
\documentclass{article}
\parindent=0pt
\parskip=10pt
\begin{document}
\showoutput
aa\par aa\par AA\par ..
\end{document}
当您插入一个大对象,其高度或深度超出了线条的默认高度/深度(而您的 tabularx 就是这样一个大对象)时,不再插入此粘连,而是\lineskip
使用修复。这意味着不再考虑相邻线条的高度和深度:如果它们只包含点,它们将更靠近大对象,就像其中有一个 Aj 的情况一样。
因此,为了再次获得一致,我建议
- 对表格使用 [t] 对齐(以将问题仅减少到底部)
- 在以下标题中使用支柱来强制执行正常的行高。
tikz行显示效果:
\documentclass[openany, letter]{memoir}
\usepackage[utf8]{inputenc}
\usepackage{mathpazo}
\usepackage{tikz}
% the following three lines don't change the problem, it's just easier to see the issue when the page is formatted
\usepackage[inner=1.3in, outer=1.2in, top=54pt, bottom=71pt, columnsep=12pt, headsep=10pt, headheight=12pt, marginparwidth=0.6in, marginparsep=0.2in, heightrounded=true]{geometry}
\usepackage[colaction]{multicol}
\setlength\columnseprule{0.5pt}
\renewcommand\bigskip{\vspace{1\baselineskip}}
\lineskip=0pt
\lineskiplimit=-10pt
\topskip=1\baselineskip
\setlength{\parskip}{0.0pt}
\setlength{\parindent}{15pt}
\newcommand\itemheading[1]{\vspace*{1\baselineskip}\noindent\textbf{\strut #1}\enspace}
\usepackage{lipsum}
\begin{document}
\begin{multicols}{2}
\itemheading{9000}%
\lipsum[1]
\itemheading{9001}%
\lipsum[2]
\itemheading{9002}%
\lipsum[3]
\itemheading{9003}%
\lipsum[4]
\itemheading{9006}\bigskip
\noindent \begin{tabularx}{\linewidth}[t]{r >{\raggedright\arraybackslash}X}
%\setlength{\extrarowheight}{0pt}
%\setlength{\extratabsurround}{0pt}
%\setlength{\aboverulesep}{0pt}
%\setlength{\belowrulesep}{0pt}
\emph{X}: & ``This is some test text.''\\
\emph{Y}: & ``This is some more test text.''\\
\emph{Z}: & ``This is even more test text.''\\
\end{tabularx}
\itemheading{\tikz[overlay]\draw[red](0,0)--++(-10cm,0);9007}%
\lipsum[5]
\end{multicols}
\end{document}