![在文本周围创建统一大小的框](https://linux22.com/image/259918/%E5%9C%A8%E6%96%87%E6%9C%AC%E5%91%A8%E5%9B%B4%E5%88%9B%E5%BB%BA%E7%BB%9F%E4%B8%80%E5%A4%A7%E5%B0%8F%E7%9A%84%E6%A1%86.png)
我想将单个单词放入相邻的框中。我使用了命令\framebox
,但这会在每个单词周围产生不同大小的框。我怎样才能让所有框的大小相同,例如 [This] [is] [an] [example]?
答案1
\framebox
在您指定的框周围放置一个框架,而在 TeX 中,框会紧密贴合其对象。因此,两个\framebox
不同的文本框(例如“This”和“example”)将具有不同的大小,如下面的 MWE 和结果输出中所示:
\documentclass{article}
\newcommand*{\mybox}[1]{\framebox{#1}}
\begin{document}
\mybox{This} \mybox{is} \mybox{an} \mybox{example}
\end{document}
因此,为了使框架具有固定大小,您需要固定您提供的框的大小。
增加盒子的“高度”
最常见的愿望是设置总高度盒子。总高度因为我们通常所说的“高度”实际上是两个长度的总和:高度对于文本来说,取决于上升者,以及它的深度,对于文本来说,取决于下行者。
如果您想创建比原始框更高的框架,这很容易:您只需在框内放置一个具有所需高度和深度的不可见元素(即宽度为零)。这样的元素在排版中非常常见,并且有一个名称:支撑。
LaTeX 中的默认支柱 的\strut
高度为两条基线之间距离 ( \baselineskip
) 的 70%,深度为相同长度的 30%。因此,将我们之前的\mybox
定义 (第 3 行) 更改为包含支柱,结果如下:
\newcommand*{\mybox}[1]{\framebox{\strut #1}}
如果该高度不适合您,您只需定义自己的支柱。假设我们想要的深度仅为基线跳跃的 5%,高度为其 195%(请注意,的最后一个参数\rule
是规则的总高度,而不仅仅是其高度):
\newcommand*{\mystrut}{\rule[-0.05\baselineskip]{0pt}{2\baselineskip}}
\newcommand*{\mybox}[1]{\framebox{\mystrut #1}}
增加或减少框的“高度”
因此,上一种使用支柱的技术在大多数情况下都有效,但我选择的特定示例也显示了此技术的局限性(仔细查看底部边框):如果支柱是最高和最深的元素,则框将恰好适合支柱。如果其余内容比您的自定义支柱更高或更深,例如由于我们示例中的“p”,则框将适应额外的高度。
现在,如果你想要一个比内容更小的框架框怎么办?好吧,你只需让 TeX 相信你的内容是你的目标尺寸(比如高度为基线跳跃的 15%,深度为基线跳跃的 5%),使用\raisebox
:
\newcommand*{\mybox}[1]{%
\framebox{\raisebox{0pt}[0.15\baselineskip][0.05\baselineskip]{%
#1}}}
设置框的宽度
最后,如果您还想设置宽度您可以使用固定宽度的框来包含内容水平拉伸或收缩在每个尺寸上粘上胶水(\hss
):
\newcommand*{\mybox}[1]{%
\framebox{\raisebox{0pt}[0.15\baselineskip][0.05\baselineskip]{%
\hbox to 0.8cm{\hss#1\hss}}}}
答案2
原因是内容具有不同的高度/深度。解决此问题的一种方法是使用\strut
所有框内的 ,如以下示例所示(我创建了一个\Fbox
添加\strut
到 参数的命令\fbox
):
\documentclass{article}
\newcommand{\Fbox}[1]{\fbox{\strut#1}}
\setlength{\fboxsep}{1pt}% Just for this example
\setlength{\parindent}{0pt}% Just for this example
\begin{document}
Here is some regular text. \fbox{This} \fbox{is} \fbox{an} \fbox{example}. \par
Here is some regular text. \Fbox{This} \Fbox{is} \Fbox{an} \Fbox{example}. \par
\end{document}
答案3
为了不贬低 Xavier 的出色和非常详细的回答,这里有一个可能更快的方法。这类工作的主要问题是避免增加行间空间,因此我(均匀地)减少了文本周围的填充,仍然使用支柱来获得均匀的高度和深度。
\documentclass{article}
\newcommand{\ffbox}[1]{%
{% open a group for a local setting
\setlength{\fboxsep}{-2\fboxrule}% the rule will be inside the box boundary
\fbox{\hspace{1.2pt}\strut#1\hspace{1.2pt}}% print the box, with some padding at the left and right
}% close the group
}
\begin{document}
Here is some regular text. \fbox{This} \fbox{is} \fbox{an} \fbox{example}.
% The following line is just for showing that the lines are still equally spaced
\leavevmode\smash{\llap{\vrule height 0pt depth\baselineskip\kern.5pt}}%
Here is some regular text. \ffbox{This} \ffbox{is} \ffbox{an} \ffbox{example}.
Here is some regular text. \ffbox{This} \ffbox{is} \ffbox{an} \ffbox{example}.
\end{document}