我正在尝试创建两个用括号分成不同类别的项目符号列表。如下所示:
我在 Google 上搜索了一下,发现了一些相关的问题,例如:如何在项目列表的右侧创建跨越多行的括号?和如何将花括号放在偶数个项目符号前面?。
这是我编写的代码:
\documentclass[notoc,numbers]{tufte-book}
\usepackage{amsmath}
\begin{document}
\begin{itemize}
\item DTP
\item HIB
\item MMR $\smash{\left.\rule{0pt}{.4\dimexpr5\baselineskip+5\itemsep+4\parskip}\right\}
\text{1981-2017}}$
\item POL
\item HEP B $\smash{\left.\rule{0pt}{.1\dimexpr1\baselineskip+0\itemsep+0\parskip}\right\}
\text{1992-2017}}$
\end{itemize}
and:
\begin{itemize}
\item Diphteria
\item Measles
\item Mumps
\item Pertussis \smash{\raisebox{.8\dimexpr\baselineskip+\itemsep+\parskip}{%
$\left.\rule{0pt}{.8\dimexpr4\baselineskip+3\itemsep+3\parskip}\right\}$
1981-2016}}
\item Polio
\item Rubella
\item Tetanus
\end{itemize}
\end{document}
结果:
有一些错误,但我不知道如何解决。
谢谢
答案1
我真的建议您使用 Tikz 解决方案之一来解决您链接的问题。但是,按照您当前的方法,您应该这样做:
\documentclass{article}
\usepackage{amsmath}
\begin{document}
\begin{itemize}
\item DTP
\item HIB
\item MMR \smash{\raisebox{.5\dimexpr\baselineskip+\itemsep+\parskip}{$\left.\rule{0pt}{.5\dimexpr4\baselineskip+3\itemsep+3\parskip}\right\}\text{1981-2017}$}}
\item POL
\item HEP B \} 1992-2017
\end{itemize}
and:
\begin{itemize}
\item Diphteria
\item Measles
\item Mumps
\item Pertussis \smash{$\left.\rule{0pt}{.5\dimexpr7\baselineskip+6\itemsep+6\parskip}\right\}$ 1981-2016}
\item Polio
\item Rubella
\item Tetanus
\end{itemize}
\end{document}
让我们思考一下为什么这样做有效:
\smash
:“顾名思义,\smash
获取其内容并将其打印出来,就好像它的高度和深度为零一样”(来源)。这里的意思是,你可以使用非常大的括号,而不会影响周围的文本。\left. ... \right\}
:使用\left
和 ,\right
您可以打印足够大的分隔符来容纳它们之间打印的任何内容。对于第一个分隔符,我们选择.
表示“无分隔符”(因此我们仅使用它来定义用于定义高度的区域),对于第二个分隔符,选择括号。因此,我们需要在它们之间放置足够大的东西,以强制括号具有所需的高度。\rule{0pt}{...}
:这将打印零宽度的规则,即,它不会打印可见规则,但仍保留第二个参数指定的规则的高度。.5\dimexpr4\baselineskip+3\itemsep+3\parskip
\baselineskip
:这并不像看起来那么复杂。我们只需将(常规文本行的高度)的四倍、\itemsep
(两个项目之间的额外距离)的三倍和(两个段落之间的通常间距)的三倍相加\parskip
即可。总和给出了四行项目的总高度。此总和的一半取为不可见的高度\rule
。为什么是一半?因为规则没有深度即不低于基线,但括号在基线上方和下方占用相同的空间。因此,要获得与四行项目一样高的括号,您需要遵循该高度一半的规则。(试着\rule{1pt}
想象一下)\raisebox{...}{...}
: 这升降机第二个参数给出的文本与第一个参数给出的高度之比。为什么我们需要这样做?在第二个列表中,您希望跨越奇数个项目,因此将括号放在中间项目上会直接为您提供正确的位置。然而,在第一个列表中,您希望跨越偶数个项目。因此,如果您将其放在第三个\item
,它将低半行。.5\dimexpr\baselineskip+\itemsep+\parskip
:因此,这是您希望提升第一个括号的高度:常规行的高度 + 两个段落之间的间距 + 两个项目之间的额外间距的一半。
现在,当您转到具有不同数量的\item
s 的其他示例时,您必须考虑以下几点:
- 要跨越单个项目,您实际上不需要执行任何操作。只需使用 打印括号即可
\}
。 - 要跨越奇数个项目,只需取
\smash
和\rule{0pt}
部分,并将作为高度,.5\dimexprX\baselineskip+Y\itemsep+Y\parskip
其中X
是项目数,并且Y
比项目数少一个。切勿更改.5
前面的! - 要跨越偶数个项目,您必须另外拥有该
\raisebox{.5\dimexpr\baselineskip+\itemsep+\parskip}
部分,但您不需要触及这里的高度!