\sbox & \savebox

Synopsis, one of:

\sbox{box-cmd}{text}
\savebox{box-cmd}{text}
\savebox{box-cmd}[width]{text}
\savebox{box-cmd}[width][pos]{text}

Typeset text just as with \makebox (see \mbox & \makebox) except that LaTeX does not output it but instead saves it in a box register referred to by a variable named box-cmd. The variable name box-cmd begins with a backslash, \. You must have previously allocated the box register box-cmd with \newsavebox (see \newsavebox). The \sbox command is robust while \savebox is fragile (see \protect).

This creates and uses a box register.

\newsavebox{\fullname}
\sbox{\fullname}{John Jacob Jingleheimer Schmidt}
  ...
\usebox{\fullname}! His name is my name, too!
Whenever we go out, the people always shout!
There goes \usebox{\fullname}!  Ya da da da da da da.

One advantage of using and reusing a box register over a \newcommand macro variable is efficiency, that LaTeX need not repeatedly retypeset the contents. See the example below.

The first two command invocations, \sbox{box-cmd}{text} and \savebox{box-cmd}{text}, are roughly equivalent. As to the third and fourth, the optional arguments allow you to specify the box width as width, and the position of the text inside that box as position. See \mbox & \makebox, for the full description.

In the \sbox and \savebox commands the text is typeset in LR mode so it does not have line breaks (see Modes). If you use these then LaTeX doesn’t give you an error but it ignores what you want: if you enter \sbox{\newreg}{test \\ test} and \usebox{\newreg} then you get ‘testtest’, while if you enter \sbox{\newreg}{test \par test} and \usebox{\newreg} then you get ‘test test’, but no error or warning. To fix this use a \parbox or minipage as here.

\savebox{\areg}{%
  \begin{minipage}{\linewidth}
    \begin{enumerate}
      \item First item
      \item Second item
    \end{enumerate}
  \end{minipage}}
  ...
\usebox{\areg}

As an example of the efficiency of reusing a register’s contents, this puts the same picture on each page of the document by putting it in the header. LaTeX only typesets it once.

\usepackage{graphicx}  % all this in the preamble
\newsavebox{\sealreg}
\savebox{\sealreg}{%
  \setlength{\unitlength}{1in}%
  \begin{picture}(0,0)%
     \put(1.5,-2.5){%
       \begin{tabular}{c}
          \includegraphics[height=2in]{companylogo.png} \\
          Office of the President
       \end{tabular}}
  \end{picture}%
}
\markright{\usebox{\sealreg}}
\pagestyle{headings}

The picture environment is good for fine-tuning the placement.

If the register \noreg has not already been defined then you get something like ‘Undefined control sequence. <argument> \noreg’.

© 2007–2018 Karl Berry
Public Domain Software
http://latexref.xyz/_005csbox-_0026-_005csavebox.html