我如何(在 XeLaTeX 中)创建一个具有定义高度的框(以行的倍数表示),并使该尺寸保持 100% 而没有任何额外的间距?
请参阅以下 MWE:
\documentclass{article}
\usepackage{lipsum}
\usepackage{multicol}
\newcommand{\mybox}[2]{\parbox[t][#1\baselineskip]{\columnwidth}{#2}}
\begin{document}
\begin{multicols}{2}\raggedcolumns
\lipsum[1]
\mybox{3}{Some more text}
\lipsum[2-8]
\end{multicols}
\end{document}
mybox 应该创建一个 3 行框。但是,与右列相比,该框之后的基线似乎偏离了~1pt
。我尝试了很多不同类型的框、间隔符、迷你页面等,但还没有找到解决方案。通常,框具有正确的高度,但它无法与周围环境完美契合,导致另一列的基线对齐偏离。
在我寻找的解决方案中,无论框内或框旁边发生什么,首要任务应该是精确的高度。框可能包含文本,也可能包含图像或小表格 - 其目的是创建可靠的“保留空间”。或者,更准确地说,框前后两列的基线应始终保持对齐。如果使用奇数字体和艺术超长字母(向上和向下,如手写),框不应该为此留出空间。如果框中的内容多于空间,则可以裁剪或溢出到周围,或者如果框内发生的事情看起来很奇怪,但必须强制执行指定的行高。此外,解决方案不应要求硬编码值(如行高、跳过或间距的点大小),而是适用于当前正在使用的任何文本/字体大小。
答案1
您必须在以下之后禁用行间跳过\parbox
:
\documentclass{article}
\usepackage[latin]{babel} % just to avoid over or underfull boxes
\usepackage{lipsum}
\usepackage{multicol}
\newcommand{\mybox}[2]{%
\par\noindent
\parbox[t][#1\baselineskip][t]{\columnwidth}{#2}%
\par\nointerlineskip
\noindent\ignorespaces
}
\begin{document}
\begin{multicols}{2}\raggedcolumns
\lipsum[2]
\mybox{3}{\bfseries Some more text that wraps to the following line}
\lipsum[3-5]
\end{multicols}
\end{document}
答案2
一种不同的方法:
\documentclass{article}
\usepackage{lipsum}
\usepackage{multicol}
\newcommand{\myfixedsizepar}[1]{\par
\def\x{\par\vskip-\prevgraf\baselineskip\vskip#1\baselineskip}%
\bgroup\aftergroup\x\let\next=}
\begin{document}\thispagestyle{empty}
\begin{multicols}{2}\raggedcolumns
\lipsum[1]
\myfixedsizepar{3}{Some more text some more text on three lines}
\lipsum[2]
\myfixedsizepar{5}{Some more text some more text on five lines}
\lipsum[3]
\end{multicols}
\end{document}
并且,这里有一个变体(可能在其他情况下有用),它可以调整高度除非它小于所要求的基线跳过的最少次数:
\newcommand{\myminimumsizepar}[1]{\par
\def\x{\par
\ifnum\prevgraf<#1 \vskip-\prevgraf\baselineskip\vskip#1\baselineskip\fi}%
\bgroup\aftergroup\x\let\next=}