我正在排版一个 tabularx,其中一列(类型)中的一些单元格X
包含 itemize 列表。我不喜欢列表上方和下方(甚至列表项之间)有过多的空间,所以我使用了这个答案消除上部垂直空间,这个答案消除下部(尝试使用后一个答案的建议消除上部垂直空间没有奏效)。具体来说,我在序言中定义了这个命令:
\makeatletter
\newcommand{\compress}{\@minipagetrue}
\makeatother
并且我已经在列规范>{\compress}
之前插入了。X
就其本身而言,这很好,只是 (a) 表格的最后一行包含常规文本,而不是列表,并且 (b) 表格后面紧跟着一个\section
。这两个事实结合在一起导致输出中表格和节标题之间的空间明显太小。如果我删除表格的最后一行,留下一行列表作为新的最后一行,或者如果我删除命令\section
,或者如果我删除>{\compress}
,间距就会恢复正常,但前两个不是我想要排版的,最后一个导致行的顶行不对齐。
最小工作示例:
\documentclass{article}
\usepackage{tabularx}
\makeatletter
\newcommand{\compress}{\@minipagetrue}
\makeatother
\usepackage{enumitem}
\setlist[itemize]{
itemsep=0.15\baselineskip,
parsep=0pt,
% Trick from answer 126505; did not work:
%before=\vspace*{\dimexpr-\baselineskip-\parskip},
after=\vspace*{-\baselineskip}
}
\begin{document}
\noindent
\begin{tabularx}{\linewidth}{l>{\compress}X}
\textbf{Colors} & \begin{itemize}
\item Red
\item Green
\item Blue
\end{itemize} \\
\textbf{Gems} & \begin{itemize}
\item Ruby
\item Sapphire
\item Emerald
\end{itemize} \\
\textbf{Elements} & \begin{itemize}
\item Fire
\item Water
\item Earth
\end{itemize} \\
\textbf{Foo} & Bar \\
\end{tabularx}
\section{Next Section}
Lorem ipsum\ldots
\end{document}
结果:
答案1
\documentclass{article}
\usepackage{tabularx}
\makeatletter
\newcommand{\compress}{\@minipagetrue}
\newcommand\ifyoudothatyoudbetterdothis{\@minipagefalse}
\makeatother
\usepackage{enumitem}
\setlist[itemize]{
itemsep=0.15\baselineskip,
parsep=0pt,
% Trick from answer 126505; did not work:
%before=\vspace*{\dimexpr-\baselineskip-\parskip},
after=\vspace*{-\baselineskip}
}
\begin{document}
\noindent
\begin{tabularx}{\linewidth}{l>{\compress}X<{\ifyoudothatyoudbetterdothis}}
\textbf{Colors} & \begin{itemize}
\item Red
\item Green
\item Blue
\end{itemize} \\
\textbf{Gems} & \begin{itemize}
\item Ruby
\item Sapphire
\item Emerald
\end{itemize} \\
\textbf{Elements} & \begin{itemize}
\item Fire
\item Water
\item Earth
\end{itemize} \\
\textbf{Foo} & Bar \\
\end{tabularx}
\section{Next Section}
Lorem ipsum\ldots
\end{document}
@minipage
是全球的标志。如果将其设置为 true,则需要确保将其设置为 false,否则将影响文档中某些任意意外部分,例如强制以下部分标题表现为位于页面顶部而不添加垂直空间。
如果单元格中有一个列表,列表代码将安排将标志设置为 false,但如果只有一个段落,您将使其保持 true。
比直接使用更安全的\@minipagetrue
做法是按照其定义的方式minipage
进行操作\@setminipage
\def \@setminipage{%
\@minipagetrue
\everypar{\@minipagefalse\everypar{}}%
}
那么,即使你的裸段落也会将其设置为 false,但是你仍然需要在最后将其设置为 false(就像这样\endminipage
做一样),以防单元格为空或者只是有一个规则,或者以其他方式避免触发段落\everypar
。