76

I'm writing a short document listing some chronological events. I want to pick out a period with a big brace. Here's a quick mockup:

alt text

What's the best way to do this? Can I set the size declaratively - ie from line A to line B - somehow?

2
  • 1
    Although it might not be best for your particular situation: Unicode provides for characters that are just the top of the brace, the bottom, and the middle. They can be connected with vertical lines of whatever length is necessary. Then, the resulting composite brace is as tall as it needs to be, but without being heavier in weight. Not specific to TeX. Of course, hardly any fonts have these characters.
    – user103221
    Feb 23, 2017 at 18:43
  • @RobtA seems awesome! what are the characters (top of the brace, the bottom, and the middle)? oops, found it: discover your character
    – nilon
    Apr 29, 2017 at 7:48

7 Answers 7

28

I suggest a variation of Giel's answer with tabular

$\left.\begin{tabular}{l}
line \\
one more line
\end{tabular}\right\}$

(or smth like {tabular}{p{5cm}} if you need not a couple of short lines but a paragraph inside the tabular).

1
  • 1
    Good idea. To span more rows, use \parbox instead of tabular. $\left. \parbox{\linewidth}{\lipsum[1]} \,\right\} \textrm{Title}$. Note: \lipsum[1] is a dummy text from lipsum.sty package.
    – xport
    Nov 27, 2010 at 14:10
81
+500

As this is one of the initial, and therefore most visible, incarnations of \tikzmark, I thought it a good idea to update it to an answer using the \tikzmark library.

\documentclass{article}
%\url{https://tex.stackexchange.com/a/1570/86}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing,calc,tikzmark}

\begin{document}

\hfill\tikzmark{right}
\begin{itemize}
\item First line
\item Second line \tikzmark{2nd}
\item Third line, which is quite long and seemingly tedious in the extreme
\item Fourth line, which isn't as long as the third \tikzmark{4th}
\item Fifth line
\end{itemize}

\begin{tikzpicture}[overlay, remember picture]
\node[anchor=base] (a) at (pic cs:2nd) {\vphantom{h}}; % push the mark to the top of the line (ie including ascenders)
\node[anchor=base] (b) at (pic cs:4th) {\vphantom{g}}; % push the mark to the bottom of the line (ie including descenders)
\draw [decoration={brace,amplitude=0.5em},decorate,ultra thick,gray]
 (a.north -| {pic cs:right}) -- (b.south -| {pic cs:right});
\end{tikzpicture}
\end{document}

braces next to text


Original Answer

I'd seriously suggest using tikz for this. Here's an alternative to Caramdir's (excellent) solution:

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing,calc}

\newcommand{\tikzmark}[1]{\tikz[overlay,remember picture] \node (#1) {};}

\begin{document}

\hfill\tikzmark{right}
\begin{itemize}
\item First line
\item Second line \tikzmark{2nd}
\item Third line, which is quite long and seemingly tedious in the extreme
\item Fourth line, which isn't as long as the third \tikzmark{4th}
\item Fifth line
\end{itemize}

\begin{tikzpicture}[overlay, remember picture]
\draw [decoration={brace,amplitude=0.5em},decorate,ultra thick,gray]
 ($(right)!(2nd.north)!($(right)-(0,1)$)$) --  ($(right)!(4th.south)!($(right)-(0,1)$)$);
\end{tikzpicture}
\end{document}

What I like about this one is that it doesn't mess around with how the actual data is put in, the decoration is added afterwards almost as an afterthought, which (to me) fits in better with the feel of what you're trying to do.

What isn't so good is the placement of the brace horizontally. Because I don't know how your are typesetting your data, nor what sort of data it is, I've just shoved the brace to the right-hand side. If your data is more structured, as the graphic suggests, then it would be easy to make it appear in the right place. (Indeed, from experimenting, I'd say that if your data isn't nicely structured - by which I mean that the lines should be of similar widths - then a brace at the right-hand side doesn't look good as it's not easy to see exactly which lines it is including or excluding.)

18
  • 6
    That \tikzmark macro is a good idea, I have to remember that.
    – Caramdir
    Aug 11, 2010 at 21:00
  • I think the result looks nicer if the tikzmark places its not slightly above the baseline: \node at (0,0.7ex) (#1)...
    – Seamus
    Mar 1, 2011 at 14:37
  • 7
    Why \node (#1) {};? \coordinate (#1); would be better. It avoids border issues with (name) versus (name.center) etc. Jun 24, 2011 at 12:20
  • 1
    @Raama Given that this is quite an old question and that that change would need a few bits that I'm not sure how to do, I think that's worth asking as a new question (refer back to this one, of course). Oct 25, 2012 at 16:37
  • 1
    @Rollo99 simplest way is to draw it in the opposite direction, so specify the coordinates in the other order. Or I think you can use a negative amplitude, check the tikz documentation on that one. Jan 19, 2020 at 15:14
24

A simpler solution:

\documentclass{article}
\usepackage{lipsum}
\usepackage{schemata}
\begin{document}
\lipsum[1]
\schema[close]{\lipsum[2]}{}
\lipsum[3]
\end{document}

MWE

1
  • 4
    A very elegant solution. It's worth mentioning that the second argument can be used to place text in the margin, i.e. \schema[close]{body text}{margin text}
    – onewhaleid
    Jul 22, 2014 at 23:33
21

Just for fun an answer using TikZ:

\usetikzlibrary{matrix,decorations.pathreplacing}

\begin{tikzpicture}
    \matrix (m) [matrix of nodes,column 1/.style={anchor=west}]
    {
    The first line. \\
    The second line. \\
    A very long third line that goes on. \\
    A fourth line. \\
    And finally a last line. \\
    };

    \draw [decoration={brace,amplitude=0.5em},decorate,ultra thick,gray]
        (m-2-1.north -| m.east) -- (m-4-1.south -| m.east);
\end{tikzpicture}

example rendering

To specify from which row to which row the brace should go change m-2-1 and m-4-1 accordingly (the second number is always the row). To change thickness and color, change the ultra thick and gray parts (see section 14.3 of the TikZ manual). To add a text to the right of the brace change -- to -- node[black, right=0.7em] {some text}. The amplitude option defines how much the brace extends and you can add ,aspect=factor (with factor replaced by a number between 0 and 1) to specify where the pointy part lies on the brace (see section 27.3). Changing anchor=west to anchor=east make the lines right aligned, removing it centers them.

2
  • Additional question: if I want some further text to the right of the brace, could you say how to do it? (The idea is that in the document I'm trying to typeset, a bunch of lines need to be collected together with a brace and some text like "and their spouses" on the right of the brace.) I could ask a new question, but if the answer is a trivial variation of this, it would pretty much be a duplication. Oct 26, 2011 at 16:55
  • @ShreevatsaR: Simply replace -- in the \draw command by -- node[right=1em] {and their spouses} (adjust the 1em to whatever distance looks good for your text). Exactly the same also works for Andrew's solution.
    – Caramdir
    Oct 26, 2011 at 23:16
10

In mathmode you could use some trickery like putting a matrix to the left of a \right}, e.g.:

\documentclass{article}

\begin{document}

\begin{displaymath}
    \left. \begin{array}{cc}
        - & - \\
        - & - \\
        - & -
    \end{array} \right\}
\end{displaymath}

\end{document}
2
  • Ooh, actually this works nicely, though I'm not sure how it will copy with a body of text. I might also be able to use \cases in an unconventional way... Aug 11, 2010 at 19:51
  • @tex-offender you can wrap bodies of text in an \mbox{}, within that box text is rendered in normal (i.e. non-math) mode
    – Giel
    Aug 13, 2010 at 21:29
7

Here's an implementation that gives the output of Andrew Stacey's excellent (and very famous) tikzmark idea but using the tcolorbox package.

screenshot

As you can see, it allows page breaks, although the brace is repeated across pages.

% arara: pdflatex
% !arara: indent: {overwrite: on}
\documentclass{article}

\usepackage{lipsum}
\usepackage[many]{tcolorbox}
\usetikzlibrary{decorations.pathreplacing}

\newtcolorbox{rightbrace}{%
    enhanced jigsaw, 
    breakable, % allow page breaks
    frame hidden, % hide the default frame
    overlay={%
        \draw [
            fill=none, % fill paper
            decoration={brace,amplitude=0.5em},
            decorate,
            ultra thick,
            gray,
        ]
        % right line
        (frame.north east)--(frame.south east);
    },
    % paragraph skips obeyed within tcolorbox
    parbox=false,
}

\begin{document}

\begin{itemize}
    \item First line
          \begin{rightbrace}
            \item Second line 
            \item Third line, which is quite long and seemingly tedious in the extreme
            \item Fourth line, which isn't as long as the third 
          \end{rightbrace}
    \item Fifth line
\end{itemize}

\begin{rightbrace}
    \lipsum[1]
\end{rightbrace}
\lipsum[2]

\end{document}
8
  • 1
    @cmughes How to do the same for a curly bracket on the left side of the text please? I have posted a new question, particularly for a curly bracket spanning Items inside an Itemize environment, for which your knowledge might be particularly useful. Could you know an anwer?
    – O0123
    Apr 17, 2016 at 20:42
  • @vincent: try using frame.north west and frame.south west :)
    – cmhughes
    Apr 17, 2016 at 20:49
  • 1
    Oh, I see the problem now :) not sure of the answer, maybe there could be a trick like reflecting the brace? Don't know if tikz has a left brace?...
    – cmhughes
    Apr 17, 2016 at 21:20
  • 1
    To reflect the brace, reverse the direction of the path. So use (frame.south west) -- (frame.north west). Feb 15, 2018 at 19:28
  • 1
    @cmhughes I like very much your solution and the style of the output.
    – Sebastiano
    Jul 28, 2019 at 10:53
6

You can use pstricks-add.sty as follows: (details can be found here on page 18)

\documentclass{article}

\usepackage{pstricks-add}
\usepackage{lipsum}

\begin{document}
\lipsum[1]
\par\noindent%
\begin{minipage}{0.99\linewidth}%adjust if necessary
\noindent\hfill\rnode{A}{}~
\par
\vspace*{-0.5ex}%adjust if necessary
\lipsum[1]
\vspace*{-2ex}%adjust if necessary
\noindent\hfill\hspace{5mm}\rnode{B}{}~%
\psbrace[linecolor=red,ref=lC](B)(A){Important!}
\end{minipage}
\par
\lipsum[1]
\end{document}

This is the output:

alt text

1
  • 1
    the braced paragraph lacks the expected paragraph indent. Nov 7, 2011 at 19:38

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.