文本的动态大小括号/圆括号

文本的动态大小括号/圆括号

我想要一个大括号来显示一组文本与另一组文本之间的关系,如下所示:

Nam dui ligula, fringilla a,     )
euismod sodales, sollicitudin    )
vel, wisi. Morbi auctor lorem    )  Nulla malesuada porttitor diam. Donec felis erat, 
non justo. Nam lacus libero,     )  congue non, volutpat at, tincidunt tristique, libero. 
pretium at, lobortis vitae,      )  Vivamus viverra fermentum felis.
...                              )

我想用一个比例花括号)来代替一排圆括号}。我希望改变括号的大小以填充“较长”一侧的垂直文本量。

以下是对我的 ASCII 能力的测试,描述了我想要的内容(显然,这些线条是作为括号的一个字形的一部分):

Nam dui ligula, fringilla a,         euismod sodales, sollicitudin    |
vel, wisi. Morbi auctor lorem    \  Nulla malesuada porttitor diam. Donec felis erat, 
non justo. Nam lacus libero,      >  congue non, volutpat at, tincidunt tristique, libero. 
pretium at, lobortis vitae,      /  Vivamus viverra fermentum felis.
...                              |
                                 /

在退化的情况下,我想要:

Nam dui ligula, fringilla a.     } Nulla malesuada portitor diam.

当文本的一侧或另一侧变大时,我希望括号至少增长到与文本较高侧的高度一样高。

我使用 Tex 的起点是:

\documentclass[12pt]{memoir}
\usepackage{fontspec,xltxtra,xunicode}
\usepackage{lipsum}

\begin{document}
\begin{tabular}{lcr}
\parbox{0.425\textwidth}{\lipsum[2]}%
    & )%
    & \parbox{0.425\textwidth}{\lipsum[3]} \\
\end{tabular}
\end{document}

显然,在上述情况下,我们最终得到的是小的、静态大小的),而不是按比例大小的},但这只是我正在思考的一个例子。

过去,我通过为 选择一个足够大的字体来避免这个问题}。该技术需要不必要的“目测”,而我希望避免这种情况。

我在数学模式中使用了括号,如下所示:

\begin{math}
  \left[% superfluous
  \parbox{0.425\textwidth}{\lipsum[2]}%
  \right\}%
  \parbox{0.425\textwidth}{\lipsum[3]}
\end{math}

这是正确的概念,除了 (1) 括号与左侧成比例;以及 (2) 有一个多余的左括号。

我很感激任何想法和建议。

感谢您的阅读。

编辑:相关问题:

答案1

您可以使用\vphantom来调整大小,以便使用最大值。下面的宏有 4 个参数:

  1. parbox 的宽度。如果要允许不同的宽度,可以调整此宏以采用两个参数,每个宽度一个。此参数是可选的,默认为0.425\textwidth
  2. 您想要使用的支架。
  3. 左边的内容\parbox
  4. 权利内容\parbox

带花括号后的样子如下:\RelatedText{\}}{\lipsum[2]}{\lipsum[3]}

在此处输入图片描述

\documentclass[12pt]{memoir}
\usepackage{lipsum}

\newcommand{\RelatedText}[4][0.425\textwidth]{%
\begin{math}%
  \left.% 
  \parbox{#1}{#3}\vphantom{\parbox{#1}{#4}}%
  \right#2%
  \parbox{#1}{#4}\vphantom{\parbox{#1}{#3}}%
\end{math}
}%

\begin{document}
    \RelatedText{)}{\lipsum[2]}{\lipsum[3]}% Use a round )

    \RelatedText{\}}{\lipsum[2]}{\lipsum[3]}% Use a curly }

    \RelatedText{]}{\lipsum[2]}{\lipsum[3]}% Use a square ]
\end{document}

答案2

请记住,您可以提供一个空的可扩展分隔符来匹配非空分隔符。这可以使用(例如)\left.\right.来表示缺失的分隔符。我在下面的解决方案中使用了这种方法。

将左侧文本块放在一个框中(称为\leftbox),将右侧文本块放在另一个框中(称为\rightbox)。使用环境很容易做到这一点lrbox。然后,为了确保对齐尽可能大,\rule可以使用“不可见”。

\lrboxbrace[<lwidth>]{<ltext>}[<rwidth>]{<rtext>}在下面的 MWE 中,提供了命令。它<ltext>minipage宽度为 的中排版<lwidth>,在宽度为 的<rtext>中排版。带星号的版本使用环境(来自minipage<rwidth>*varwidthvarwidth包裹)。实际显示是在数学模式下使用 进行的\ensuremath,允许将其置于现有的数学模式(如$...$\[...\])或文本模式:

\documentclass{article}
\usepackage[margin=15mm]{geometry}% http://ctan.org/pkg/geometry
\usepackage{xparse}% http://ctan.org/pkg/xparse
\usepackage{varwidth}% http://ctan.org/pkg/varwidth
\begin{document}

\newsavebox{\leftbox} \newsavebox{\rightbox}%

\NewDocumentCommand{\lrboxbrace}{s O{0.4\linewidth} m O{0.4\linewidth} m}{% \lrboxbrace[<lwidth>]{<ltext>}[<rwidth>]{<rtext>}
  \begin{lrbox}{\leftbox}% Left box
    \IfBooleanTF{#1}% starred/unstarred
      {\begin{varwidth}{#2}#3\end{varwidth}}
      {\begin{minipage}{#2}#3\end{minipage}}
  \end{lrbox}
  \begin{lrbox}{\rightbox}% Right box
    \IfBooleanTF{#1}% starred/unstarred
      {\begin{varwidth}{#4}#5\end{varwidth}}
      {\begin{minipage}{#4}#5\end{minipage}}
  \end{lrbox}
  \ensuremath{\left.\usebox\leftbox\rule{0pt}{\ht\rightbox}\right\}\usebox\rightbox}
}

\begin{center}
  \lrboxbrace%
   {Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
    Sed eleifend tincidunt enim, eu tincidunt felis auctor quis. Aenean 
    eget enim urna.}%
   {Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed eleifend 
    tincidunt enim, eu tincidunt felis auctor quis. Aenean eget enim urna. 
    Pellentesque tincidunt adipiscing velit a fermentum. \endgraf    
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed eleifend 
    tincidunt enim, eu tincidunt felis auctor quis. Aenean eget enim urna. 
    Pellentesque tincidunt adipiscing velit a fermentum.}
\end{center}

\begin{center}
  \lrboxbrace%
   {Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed eleifend 
    tincidunt enim, eu tincidunt felis auctor quis. Aenean eget enim urna. 
    Pellentesque tincidunt adipiscing velit a fermentum. \endgraf    
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed eleifend 
    tincidunt enim, eu tincidunt felis auctor quis. Aenean eget enim urna. 
    Pellentesque tincidunt adipiscing velit a fermentum.}
   {Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
    Sed eleifend tincidunt enim, eu tincidunt felis auctor quis. Aenean 
    eget enim urna.}%
\end{center}

\begin{center}
  \lrboxbrace*% starred version
   {A short sentence.}
   {And another.}%
\end{center}

\begin{center}
  \lrboxbrace%
    [60pt]{Here is some different text that should be split}%
    [120pt]{This is another line that is actually wider than the box
            on the left. It should span five lines in total (one more 
            than the left box).}
\end{center}

\end{document}

在此处输入图片描述

geometry只是为了增加利润。xparse提供可以轻松混合可选参数和强制参数的接口。

这种方法的一个缺点是段落的使用略有限制。这是可能的,但需要使用\endgraf而不是\par或空行。然而,由于这未包含在原始请求中,因此这可能不是问题。

答案3

您可以使用 来删除多余的左括号,\left.并使用 根据两侧的高度进行缩放\vphantom。下面的解决方案使用 Scratch Box 来提高效率。

\newbox\braceboxa
\newbox\braceboxb

\makeatletter
\newcommand\braced[2]
    {\setbox\braceboxa\hbox{\parbox{0.45\linewidth}{#1}}%
     \setbox\braceboxb\hbox{\parbox{0.45\linewidth}{#2}}%
     \hbox to \linewidth
     \bgroup \hss \copy\braceboxa\hss
     \m@th$\left.\vphantom{\copy\braceboxa\copy\braceboxb}\right\}$%
     \hss\copy\braceboxb\hss
     \egroup}
\makeatother

请注意,我正在缩放到\linewidth而不是,\textwidth并在适当的位置添加\hss,以便剩余的空白0.1\linewidth均匀分布。

答案4

构建两个等宽列的另一种解决方案:

\documentclass[a4paper]{article}

\newenvironment{reltext}[1][1]
  {\calcreltextwd{#1}%
   \begin{center}\hbox to\linewidth\bgroup\hss
   $\mathsurround=0pt\nulldelimiterspace=0pt
   \bgroup\left.\begin{minipage}{\reltextwd}
   \vspace*{2pt}}
  {\vspace*{2pt}\end{minipage}\checkreltext$\hss\egroup\end{center}}
\newcommand{\righttext}{\end{minipage}\right\rbrace\egroup
  \def\righttextgiven{}\begin{minipage}{\reltextwd}}
\newcommand{\checkreltext}{%
  \ifdefined\righttextgiven\else\right\rbrace\egroup\fi}

\newcommand{\calcreltextwd}[1]{%
  \sbox0{$\nulldelimiterspace=0pt{\left.\vbox to 100pt{}\right\rbrace}$}%
  \edef\reltextwd{\the\dimexpr(#1\linewidth-\wd0)/2\relax}}

\usepackage{lipsum}
\begin{document}
\lipsum[2]
\begin{reltext}
\lipsum*[3]
\righttext
\lipsum*[2]
\end{reltext}
\lipsum[2]
\newpage
\lipsum[2]
\begin{reltext}[.8]
\lipsum[4]
\righttext
\lipsum[4]
\end{reltext}
\end{document}

该命令\righttext将左侧文本与右侧文本分开;如果未指定,则会很清楚,因为大括号右侧没有任何内容。

环境的可选参数(默认值为 1)是对象总宽度相对于线宽的“比例因子”。

\nulldelimiterspace设置旨在删除 TeX 在查找\left.或 时通常放置的空格\right.。补充括号用于避免出现“内部原子”。

相关内容