如何制作一个高度基于当前行高的倍数的框

如何制作一个高度基于当前行高的倍数的框

我如何(在 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=}

在此处输入图片描述

相关内容