Suivant: , Précédent: , Monter: Boxes   [Table des matières][Index]


20.5 \sbox & \savebox

Synopsis, l’un parmi les suivants :

\sbox{cmd-boîte}{texte}
\savebox{cmd-boîte}{texte}
\savebox{cmd-boîte}[largeur]{texte}
\savebox{cmd-boîte}[largeur][pos]{texte}

Cette commande compose texte dans une boîte de la même façon qu’avec \makebox (voir \mbox & \makebox), à ceci près qu’au lieu de sortir la boîte résultante, elle la sauvegarde dans un registre boîte référencé par la variable nommée cmd-boîte. Le nom de variable cmd-boîte commence avec une controblique, \. Vous devez préalablement avoir alloué le registre boîte cmd-boîte avec avec \newsavebox (voir \newsavebox). La commande \sbox est robuste, alors que \savebox est fragile (voir \protect).

L’exemple suivant crée et utilise un registre boîte.

\newsavebox{\nomcomplet}
\sbox{\nomcomplet}{Cadet Rousselle}
  ...
\usebox{\nomcomplet} a trois maisons qui n'ont ni poutres, ni chevrons !
C'est pour loger les hirondelles,
Que direz-vous d'\usebox{\nomcomplet} ?

Un avantage de l’usage répété d’un registre boîte par rapport à une variable macro \newcommand est l’efficacité, c.-à-d. que LaTeX n’a pas besoin de répéter la composition du contenu. Voir l’exemple plus bas.

Les deux invocations de commande \sbox{cmd-boîte}{texte} et \savebox{cmd-boîte}{texte} sont sensiblement équivalentes. Quant aux troisième et quatrième, les arguments optionnels vous permettent de spécifier la largeur de la boîte comme largeur, et la position du texte au sein de cette boîte comme position. Voir \mbox & \makebox, pour une description complète.

Dans les commandes \sbox et \savebox le texte est composé en mode LR, aussi il n’a pas de sauts de lignes (voir Modes). Si vous utilisez ce qui suit alors LaTeX ne produit pas d’erreur mais ignore ce que vous voulez faire : si vous entrez \sbox{\nouvreg}{test \\ test} et \usebox{\nouvreg} alors vous obtenez ‘testtest’, et si vous entrez \sbox{\nouvreg}{test \par test} et \usebox{\nouvreg} alors vous obtenez ‘test test’, mais ni erreur ni avertissement. La solution est d’utiliser une \parbox ou une minipage comme dans l’exemple qui suit :

\newsavebox{\unreg}
\savebox{\unreg}{%
  \begin{minipage}{\linewidth}
    \begin{enumerate}
      \item Premier article
      \item Second article
    \end{enumerate}
  \end{minipage}}
  ...
\usebox{\unreg}

En exemple de l’efficacité de réutiliser le contenu d’un registre boîte, ce qui suit place la même image sur chaque page du document en le plaçant dans l’en-tête. LaTeX ne la compose qu’une fois.

\usepackage{graphicx}  % tout cela dans le préambule
\newsavebox{\cachetreg}
\savebox{\cachetreg}{%
  \setlength{\unitlength}{2.5cm}%
  \begin{picture}(0,0)%
     \put(1.5,-2.5){%
       \begin{tabular}{c}
          \includegraphics[height=5cm]{companylogo.png} \\
          Bureau du Président
       \end{tabular}}
  \end{picture}%
}
\markright{\usebox{\cachetreg}}
\pagestyle{headings}

L’environnement picture est bien adapté pour régler finement le placement.

Si le registre \noreg n’a pas déjà été défini alors vous obtenez quelque chose du genre de ‘Undefined control sequence. <argument> \noreg’.


Suivant: , Précédent: , Monter: Boxes   [Table des matières][Index]