![如何制作一个高度基于当前行高的倍数的框](https://linux22.com/image/261933/%E5%A6%82%E4%BD%95%E5%88%B6%E4%BD%9C%E4%B8%80%E4%B8%AA%E9%AB%98%E5%BA%A6%E5%9F%BA%E4%BA%8E%E5%BD%93%E5%89%8D%E8%A1%8C%E9%AB%98%E7%9A%84%E5%80%8D%E6%95%B0%E7%9A%84%E6%A1%86.png)
我如何(在 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=}