summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/expl3/l3box.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/source/latex/expl3/l3box.dtx')
-rw-r--r--Master/texmf-dist/source/latex/expl3/l3box.dtx933
1 files changed, 933 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/expl3/l3box.dtx b/Master/texmf-dist/source/latex/expl3/l3box.dtx
new file mode 100644
index 00000000000..96e0d4696a8
--- /dev/null
+++ b/Master/texmf-dist/source/latex/expl3/l3box.dtx
@@ -0,0 +1,933 @@
+% \iffalse
+%% File: l3box.dtx Copyright (C) 2005-2006 LaTeX3 project
+%%
+%% It may be distributed and/or modified under the conditions of the
+%% LaTeX Project Public License (LPPL), either version 1.3c of this
+%% license or (at your option) any later version. The latest version
+%% of this license is in the file
+%%
+%% http://www.latex-project.org/lppl.txt
+%%
+%% This file is part of the ``expl3 bundle'' (The Work in LPPL)
+%% and all files in that bundle must be distributed together.
+%%
+%% The released version of this bundle is available from CTAN.
+%%
+%% -----------------------------------------------------------------------
+%%
+%% The development version of the bundle can be found at
+%%
+%% http://www.latex-project.org/cgi-bin/cvsweb.cgi/
+%%
+%% for those people who are interested.
+%%
+%%%%%%%%%%%
+%% NOTE: %%
+%%%%%%%%%%%
+%%
+%% Snapshots taken from the repository represent work in progress and may
+%% not work or may contain conflicting material! We therefore ask
+%% people _not_ to put them into distributions, archives, etc. without
+%% prior consultation with the LaTeX Project Team.
+%%
+%% -----------------------------------------------------------------------
+%
+%<package>\RequirePackage{l3names}
+%<*dtx>
+%\fi
+\def\GetIdInfo$Id: #1.dtx #2 #3-#4-#5 #6 #7$#8{%
+ \def\fileversion{#2}%
+ \def\filedate{#3/#4/#5}%
+ \ProvidesFile{#1.dtx}[#3/#4/#5 v#2 #8]%
+}
+%\iffalse
+%</dtx>
+%\fi
+\GetIdInfo$Id: l3box.dtx 573 2006-08-21 20:59:37Z morten $
+ {L3 Experimental Box module}
+%
+% \iffalse
+%<*driver>
+\documentclass{l3doc}
+
+\begin{document}
+\DocInput{l3box.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+%
+% \title{The \textsf{l3box} package\thanks{This file
+% has version number \fileversion, last
+% revised \filedate.}\\
+% Boxes}
+% \author{\Team}
+% \date{\filedate}
+% \maketitle
+%
+% \section{Boxes}
+%
+%
+% There are three kinds of box operations: horizontal mode denoted
+% with prefix |\hbox_|, vertical mode with prefix |\vbox_|, and the
+% generic operations working in both modes with prefix |\box_|.
+%
+%
+% \subsection{Generic functions}
+%
+% \begin{function}{%
+% \box_new:N |
+% \box_new:c |
+% \box_new_l:N
+% }
+% \begin{syntax}
+% "\box_new:N" <box>
+% \end{syntax}
+% Defines <box> to be a new variable of type "box".
+% \begin{texnote}
+% "\box_new:N" is the equivalent of plain \TeX{}'s \tn{newbox}.
+% However, the internal register allocation is done differently.
+% \end{texnote}
+% \end{function}
+%
+% \begin{function}{%
+% \if_hbox:N |
+% \if_vbox:N |
+% \if_box_empty:N |
+% }
+% \begin{syntax}
+% "\if_hbox:N" <box> <true code>"\else:" <false code>"\fi:"
+% "\if_box_empty:N" <box> <true code>"\else:" <false code>"\fi:"
+% \end{syntax}
+% "\if_hbox:N" and "\if_vbox:N" check if <box> is an horizontal or
+% vertical box resp. "\if_box_empty:N" tests if <box> is empty (void)
+% and executes "code" according to the test outcome.
+% \begin{texnote}
+% These are the \TeX{} primitives \tn{ifhbox}, \tn{ifvbox} and
+% \tn{ifvoid}.
+% \end{texnote}
+% \end{function}
+%
+% \begin{function}{%
+% \box_if_empty:NTF |
+% \box_if_empty:cTF |
+% \box_if_empty:NT |
+% \box_if_empty:cT |
+% \box_if_empty:NF |
+% \box_if_empty:cF |
+% }
+% \begin{syntax}
+% "\box_if_empty:NTF" <box> "{"\m{true code}"}" "{"\m{false code}"}"
+% \end{syntax}
+% Tests if <box> is empty (void) and executes "code" according to the
+% test outcome.
+% \begin{texnote}
+% "\box_if_empty:NTF" is the \LaTeX3 function name for \tn{ifvoid}.
+% \end{texnote}
+% \end{function}
+%
+%
+% \begin{function}{%
+% \box_set_eq:NN |
+% \box_set_eq:cN |
+% \box_set_eq:Nc |
+% \box_set_eq:cc |
+% }
+% \begin{syntax}
+% "\box_set_eq:NN" <box1> <box2>
+% \end{syntax}
+% Sets <box1> equal to <box2>. Note that this eradicates the contents
+% of <box2> afterwards.
+% \end{function}
+%
+%
+% \begin{function}{%
+% \box_gset_eq:NN |
+% \box_gset_eq:cN |
+% \box_gset_eq:Nc |
+% \box_gset_eq:cc |
+% }
+% \begin{syntax}
+% "\box_gset_eq:NN" <box1> <box2>
+% \end{syntax}
+% Globally sets <box1> equal to <box2>.
+% \end{function}
+%
+%
+% \begin{function}{%
+% \box_set_to_previous:N |
+% \box_set_to_previous:c |
+% \box_gset_to_previous:N |
+% \box_gset_to_previous:c |
+% }
+% \begin{syntax}
+% "\box_set_to_previous:N" <box>
+% \end{syntax}
+% Sets <box> equal to the previous box |\R_previous_box| and removes
+% |\R_previous_box| from the current list (unless in outer vertical
+% or math mode).
+% \end{function}
+%
+% \begin{function}{%
+% \box_move_right:nn |
+% \box_move_left:nn |
+% \box_move_up:nn |
+% \box_move_down:nn |
+% }
+% \begin{syntax}
+% "\box_move_left:nn" "{"<dimen>"}" "{"<box function>"}"
+% \end{syntax}
+% Moves <box function> <dimen> in the direction specified. <box
+% function> is either an operation on a box such as "\box_use:N" or a
+% ``raw'' box specification like "\vbox:n{xyz}".
+% \end{function}
+%
+% \begin{function}{%
+% \box_clear:N |
+% \box_clear:c |
+% \box_gclear:N |
+% \box_gclear:c |
+% }
+% \begin{syntax}
+% "\box_clear:N" <box>
+% \end{syntax}
+% Clears <box> by setting it to the constant "\c_void_box".
+% "\box_gclear:N" does it globally.
+% \end{function}
+%
+%
+% \begin{function}{%
+% \box_use:N |
+% \box_use:c |
+% \box_use_clear:N |
+% \box_use_clear:c |
+% }
+% \begin{syntax}
+% "\box_use:N" <box> \\
+% "\box_use_clear:N" <box>
+% \end{syntax}
+% "\box_use:N" puts a copy of <box> on the current list while
+% "\box_use_clear:N" puts the box on the current list and then
+% eradicates the contents of it.
+% \begin{texnote}
+% "\box_use:N" and "\box_use_clear:N" are the \TeX{} primitives
+% \tn{copy} and \tn{box} with new (descriptive) names.
+% \end{texnote}
+% \end{function}
+%
+%
+% \begin{function}{%
+% \box_ht:N |
+% \box_ht:c |
+% \box_dp:N |
+% \box_dp:c |
+% \box_wd:N |
+% \box_wd:c |
+% }
+% \begin{syntax}
+% "\box_ht:N" <box>
+% \end{syntax}
+% Returns the height, depth, and width of <box> for use in dimension
+% settings.
+% \begin{texnote}
+% These are the \TeX{} primitives \tn{ht}, \tn{dp} and \tn{wd}.
+% \end{texnote}
+% \end{function}
+%
+% \begin{function}{%
+% \box_show:N |
+% \box_show:c |
+% }
+% \begin{syntax}
+% "\box_show:N" <box>
+% \end{syntax}
+% Writes the contents of <box> to the log file.
+% \begin{texnote}
+% This is the \TeX{} primitive \tn{showbox}.
+% \end{texnote}
+% \end{function}
+%
+%
+% \begin{variable}{%
+% \c_empty_box |
+% \l_tmpa_box |
+% \l_tmpb_box |
+% }
+% \begin{syntax}
+% \end{syntax}
+% "\c_empty_box" is the constantly empty box. The others are scratch
+% boxes.
+% \end{variable}
+%
+%
+% \begin{variable}{%
+% \R_previous_box |
+% }
+% \begin{syntax}
+% \end{syntax}
+% "\R_previous_box" is a read-only box register. You can set other
+% boxes to this box, which will then be removed from the current
+% list.
+% \end{variable}
+%
+%
+% \subsection{Horizontal mode}
+%
+% \begin{function}{%
+% \hbox:n |
+% }
+% \begin{syntax}
+% "\hbox:n" "{"<contents>"}"
+% \end{syntax}
+% Places a "hbox" of natural size.
+% \end{function}
+%
+% \begin{function}{%
+% \hbox_set:Nn |
+% \hbox_set:cn |
+% \hbox_gset:Nn |
+% \hbox_gset:cn |
+% }
+% \begin{syntax}
+% "\hbox_set:Nn" <box> "{"\m{contents}"}"
+% \end{syntax}
+% Sets <box> to be a vertical mode box containing \m{contents}. It has
+% it's natural size. "\hbox_gset:Nn" does it globally.
+% \end{function}
+%
+%
+% \begin{function}{%
+% \hbox_set_to_wd:Nnn |
+% \hbox_set_to_wd:cnn |
+% \hbox_gset_to_wd:Nnn |
+% \hbox_gset_to_wd:cnn |
+% }
+% \begin{syntax}
+% "\hbox_set_to_wd:Nnn" <box> "{"\m{dimen}"}" "{"\m{contents}"}"
+% \end{syntax}
+% Sets <box> to contain \m{contents} and have width <dimen>.
+% "\hbox_gset_to_wd:Nn" does it globally.
+% \end{function}
+%
+%
+% \begin{function}{%
+% \hbox_to_wd:nn |
+% }
+% \begin{syntax}
+% "\hbox_to_wd:nn" "{"<dimen>"}" <contents>
+% \end{syntax}
+% Places a <box> of width <dimen> containing <contents>.
+% \end{function}
+%
+%
+% \begin{function}{%
+% \hbox_set_inline_begin:N |
+% \hbox_set_inline_end: |
+% \hbox_gset_inline_begin:N |
+% \hbox_gset_inline_end: |
+% }
+% \begin{syntax}
+% "\hbox_set_inline_begin:N" <box> <contents>
+% "\hbox_set_inline_end:"
+% \end{syntax}
+% Sets <box> to contain <contents>. This type is useful for use in
+% environment definitions.
+% \end{function}
+%
+%
+% \begin{function}{%
+% \hbox_unpack:N |
+% \hbox_unpack_clear:N |
+% }
+% \begin{syntax}
+% "\hbox_unpack:N" <box>
+% \end{syntax}
+% "\hbox_unpack:N" unpacks the contents of the <box> register and
+% "\hbox_unpack_clear:N" also clears the <box> after unpacking it.
+% \begin{texnote}
+% These are the \TeX{} primitives \tn{unhcopy} and \tn{unhbox}.
+% \end{texnote}
+% \end{function}
+%
+%
+%
+%
+%
+% \subsection{Vertical mode}
+%
+% \begin{function}{%
+% \vbox_set:Nn |
+% \vbox_set:cn |
+% \vbox_gset:Nn |
+% \vbox_gset:cn |
+% }
+% \begin{syntax}
+% "\vbox_set:Nn" <box> "{"\m{contents}"}"
+% \end{syntax}
+% Sets <box> to be a vertical mode box containing \m{contents}. It has
+% it's natural size. "\vbox_gset:Nn" does it globally.
+% \end{function}
+%
+%
+% \begin{function}{%
+% \vbox_set_to_ht:Nnn |
+% \vbox_set_to_ht:cnn |
+% \vbox_gset_to_ht:Nnn |
+% \vbox_gset_to_ht:cnn |
+% \vbox_gset_to_ht:ccn |
+% }
+% \begin{syntax}
+% "\vbox_set_to_ht:Nnn" <box> "{"\m{dimen}"}" "{"\m{contents}"}"
+% \end{syntax}
+% Sets <box> to contain \m{contents} and have total height <dimen>.
+% "\vbox_gset_to_ht:Nn" does it globally.
+% \end{function}
+%
+%
+% \begin{function}{%
+% \vbox_set_inline_begin:N |
+% \vbox_set_inline_end: |
+% \vbox_gset_inline_begin:N |
+% \vbox_gset_inline_end: |
+% }
+% \begin{syntax}
+% "\vbox_set_inline_begin:N" <box> <contents>
+% "\vbox_set_inline_end:"
+% \end{syntax}
+% Sets <box> to contain \m{contents}. This type is useful for use in
+% environment definitions.
+% \end{function}
+%
+% \begin{function}{%
+% \vbox_set_split_to_ht:NNn |
+% }
+% \begin{syntax}
+% "\vbox_set_split_to_ht:NNn" <box1> <box2> "{"<dimen>"}"
+% \end{syntax}
+% Sets <box1> to contain the top <dimen> part of <box2>.
+% \begin{texnote}
+% This is the \TeX{} primitive \tn{vsplit}.
+% \end{texnote}
+% \end{function}
+%
+% \begin{function}{%
+% \vbox:n |
+% }
+% \begin{syntax}
+% "\vbox:n" "{"<contents>"}"
+% \end{syntax}
+% Places a "vbox" of natural size with baseline equal to the baseline
+% of the last line in the box.
+% \end{function}
+%
+% \begin{function}{%
+% \vbox_to_ht:nn |
+% \vbox_to_zero:n |
+% }
+% \begin{syntax}
+% "\vbox_to_ht:nn" "{"<dimen>"}" <contents> \\
+% "\vbox_to_zero:n" <contents>
+% \end{syntax}
+% Places a <box> of size <dimen> containing <contents>.
+% \end{function}
+%
+%
+% \begin{function}{%
+% \vbox_unpack:N |
+% \vbox_unpack_clear:N |
+% }
+% \begin{syntax}
+% "\vbox_unpack:N" <box>
+% \end{syntax}
+% "\vbox_unpack:N" unpacks the contents of the <box> register and
+% "\vbox_unpack_clear:N" also clears the <box> after unpacking it.
+% \begin{texnote}
+% These are the \TeX{} primitives \tn{unvcopy} and \tn{unvbox}.
+% \end{texnote}
+% \end{function}
+%
+%
+% \StopEventually{}
+%
+%
+%
+% \subsection{The Implementation}
+%
+%
+% We start by ensuring that the required packages are loaded.
+% \begin{macrocode}
+%<package&!check>\RequirePackage{l3prg}\par
+%<package&check>\RequirePackage{l3chk}\par
+%<*initex|package>
+% \end{macrocode}
+%
+% The code in this module is very straight forward so I'm not going to
+% comment it very extensively.
+%
+%
+% \subsubsection{Generic boxes}
+%
+% \begin{macro}{\box_new:N}
+% \begin{macro}{\box_new_l:N}
+% \begin{macro}{\box_new:c}
+% Defining a new \m{box} register.
+% \begin{macrocode}
+%<*initex>
+\alloc_setup_type:nnn {box} \c_zero \c_max_register_num
+% \end{macrocode}
+% Now, remember that |\box255| has a special role in \TeX, it
+% shouldn't be allocated\dots
+% \begin{macrocode}
+\seq_put_right:Nn \g_box_allocation_seq {255}
+\def_new:Npn \box_new:N #1 {\alloc_reg:NnNN g {box} \tex_mathchardef:D #1}
+\def_new:Npn \box_new_l:N #1 {\alloc_reg:NnNN l {box} \tex_mathchardef:D #1}
+%</initex>
+% \end{macrocode}
+% When we run on top of \LaTeX, we just use its allocation
+% mechanism.
+% \begin{macrocode}
+%<package>\let_new:NN \box_new:N \newbox
+\def_new:Npn \box_new:c {\exp_args:Nc \box_new:N}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\if_hbox:N}
+% \begin{macro}{\if_vbox:N}
+% \begin{macro}{\if_box_empty:N}
+% The primitives for testing if a \m{box} is empty/void or which
+% type of box it is.
+% \begin{macrocode}
+\let_new:NN \if_hbox:N \tex_ifhbox:D
+\let_new:NN \if_vbox:N \tex_ifvbox:D
+\let_new:NN \if_box_empty:N \tex_ifvoid:D
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\box_if_empty:NTF}
+% \begin{macro}{\box_if_empty:cTF}
+% \begin{macro}{\box_if_empty:NT}
+% \begin{macro}{\box_if_empty:cT}
+% \begin{macro}{\box_if_empty:NF}
+% \begin{macro}{\box_if_empty:cF}
+% Testing if a \m{box} is empty/void.
+% \begin{macrocode}
+\def_test_function_new:npn {box_if_empty:N}#1{\if_box_empty:N #1}
+\def_new:Npn \box_if_empty:cTF {\exp_args:Nc \box_if_empty:NTF}
+\def_new:Npn \box_if_empty:cT {\exp_args:Nc \box_if_empty:NT}
+\def_new:Npn \box_if_empty:cF {\exp_args:Nc \box_if_empty:NF}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\box_set_eq:NN}
+% \begin{macro}{\box_set_eq:cN}
+% \begin{macro}{\box_set_eq:Nc}
+% \begin{macro}{\box_set_eq:cc}
+% Assigning the contents of a box to be another box.
+% This clears the second box globally (that's how \TeX{} does it).
+% \begin{macrocode}
+\def_new:Npn \box_set_eq:NN #1#2 {\tex_setbox:D #1 \tex_box:D #2}
+\def_new:Npn \box_set_eq:cN {\exp_args:Nc \box_set_eq:NN}
+\def_new:Npn \box_set_eq:Nc {\exp_args:NNc \box_set_eq:NN}
+\def_new:Npn \box_set_eq:cc {\exp_args:Ncc \box_set_eq:NN}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\box_gset_eq:NN}
+% \begin{macro}{\box_gset_eq:cN}
+% \begin{macro}{\box_gset_eq:Nc}
+% \begin{macro}{\box_gset_eq:cc}
+% Global version of the above.
+% \begin{macrocode}
+\def_new:Npn \box_gset_eq:NN {\pref_global:D\box_set_eq:NN}
+\def_new:Npn \box_gset_eq:cN {\exp_args:Nc \box_gset_eq:NN}
+\def_new:Npn \box_gset_eq:Nc {\exp_args:NNc \box_gset_eq:NN}
+\def_new:Npn \box_gset_eq:cc {\exp_args:Ncc \box_gset_eq:NN}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\R_previous_box}
+% A different name for this read-only primitive.
+% \begin{macrocode}
+\let_new:NN \R_previous_box \tex_lastbox:D
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\box_set_to_previous:N}
+% \begin{macro}{\box_set_to_previous:c}
+% \begin{macro}{\box_gset_to_previous:N}
+% \begin{macro}{\box_gset_to_previous:c}
+% Set a box to the previous box.
+% \begin{macrocode}
+\def_new:Npn \box_set_to_previous:N #1{\tex_setbox:D#1\R_previous_box}
+\def_new:Npn \box_set_to_previous:c {\exp_args:Nc \box_set_to_previous:N}
+\def_new:Npn \box_gset_to_previous:N {\pref_global:D \box_set_to_previous:N}
+\def_new:Npn \box_gset_to_previous:c {\exp_args:Nc \box_gset_to_previous:N}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\box_move_left:nn}
+% \begin{macro}{\box_move_right:nn}
+% \begin{macro}{\box_move_up:nn}
+% \begin{macro}{\box_move_down:nn}
+% Move box material in different directions.
+% \begin{macrocode}
+\def_long_new:Npn \box_move_left:nn #1#2{\tex_moveleft:D\dim_eval:n{#1}{#2}}
+\def_long_new:Npn \box_move_right:nn #1#2{\tex_moveright:D\dim_eval:n{#1}{#2}}
+\def_long_new:Npn \box_move_up:nn #1#2{\tex_raise:D\dim_eval:n{#1}{#2}}
+\def_long_new:Npn \box_move_down:nn #1#2{\tex_lower:D\dim_eval:n{#1}{#2}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\box_clear:N}
+% \begin{macro}{\box_clear:c}
+% \begin{macro}{\box_gclear:N}
+% \begin{macro}{\box_gclear:c}
+% Clear a \m{box} register.
+% \begin{macrocode}
+\def_new:Npn \box_clear:N #1{\box_set_eq:NN #1 \c_empty_box }
+\def_new:Npn \box_clear:c {\exp_args:Nc \box_clear:N }
+\def_new:Npn \box_gclear:N {\pref_global:D\box_clear:N}
+\def_new:Npn \box_gclear:c {\exp_args:Nc \box_gclear:c }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\box_ht:N}
+% \begin{macro}{\box_ht:c}
+% \begin{macro}{\box_dp:N}
+% \begin{macro}{\box_dp:c}
+% \begin{macro}{\box_wd:n}
+% \begin{macro}{\box_wd:c}
+% Accessing the height, depth, and width of a \m{box} register.
+% \begin{macrocode}
+\let_new:NN \box_ht:N \tex_ht:D
+\def_new:Npn \box_ht:c {\exp_args:Nc \box_ht:N}
+\let_new:NN \box_dp:N \tex_dp:D
+\def_new:Npn \box_dp:c {\exp_args:Nc \box_dp:N}
+\let_new:NN \box_wd:N \tex_wd:D
+\def_new:Npn \box_wd:c {\exp_args:Nc \box_wd:N}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\box_use_clear:N}
+% \begin{macro}{\box_use_clear:c}
+% \begin{macro}{\box_use:N}
+% \begin{macro}{\box_use:c}
+% Using a \m{box}. This is just \TeX{} primitives with meaningful
+% names.
+% \begin{macrocode}
+\let_new:NN \box_use_clear:N \tex_box:D
+\def_new:Npn \box_use_clear:c {\exp_args:Nc \box_use_clear:N}
+\let_new:NN \box_use:N \tex_copy:D
+\def_new:Npn \box_use:c {\exp_args:Nc \box_use:N}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\box_show:N}
+% \begin{macro}{\box_show:c}
+% Show the contents of a box and write it into the log file.
+% \begin{macrocode}
+\let:NN \box_show:N \tex_showbox:D
+\def_new:Npn \box_show:c {\exp_args:Nc \box_show:N}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\c_empty_box}
+% \begin{macro}{\l_tmpa_box}
+% \begin{macro}{\l_tmpb_box}
+% We allocate some \m{box} registers here (and borrow a few from \LaTeX).
+% \begin{macrocode}
+%<package>\let:NN \c_empty_box \voidb@x
+%<package>\let_new:NN \l_tmpa_box \@tempboxa
+%<initex>\box_new:N \c_empty_box
+%<initex>\box_new:N \l_tmpa_box
+\box_new:N \l_tmpb_box
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{Vertical boxes}
+%
+%
+% \begin{macro}{\vbox:n}
+% Put a vertical box directly into the input stream.
+% \begin{macrocode}
+\def_new:Npn \vbox:n {\tex_vbox:D \scan_stop:}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\vbox_set:Nn}
+% \begin{macro}{\vbox_set:cn}
+% \begin{macro}{\vbox_gset:Nn}
+% \begin{macro}{\vbox_gset:cn}
+% Storing material in a vertical box with a natural height.
+% \begin{macrocode}
+\def_long_new:Npn \vbox_set:Nn #1#2 {\tex_setbox:D #1 \tex_vbox:D {#2}}
+\def_new:Npn \vbox_set:cn {\exp_args:Nc \vbox_set:Nn}
+\def_new:Npn \vbox_gset:Nn {\pref_global:D \vbox_set:Nn}
+\def_new:Npn \vbox_gset:cn {\exp_args:Nc \vbox_gset:Nn}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\vbox_set_to_ht:Nnn}
+% \begin{macro}{\vbox_set_to_ht:cnn}
+% \begin{macro}{\vbox_gset_to_ht:Nnn}
+% \begin{macro}{\vbox_gset_to_ht:cnn}
+% \begin{macro}{\vbox_gset_to_ht:ccn}
+% Storing material in a vertical box with a specified height.
+% \begin{macrocode}
+\def_long_new:Npn \vbox_set_to_ht:Nnn #1#2#3 {
+ \tex_setbox:D #1 \tex_vbox:D to #2 {#3}}
+\def_new:Npn \vbox_set_to_ht:cnn{\exp_args:Nc \vbox_set_to_ht:Nnn }
+\def_new:Npn \vbox_gset_to_ht:Nnn {\pref_global:D \vbox_set_to_ht:Nnn }
+\def_new:Npn \vbox_gset_to_ht:cnn{\exp_args:Nc \vbox_gset_to_ht:Nnn }
+\def_new:Npn \vbox_gset_to_ht:ccn {\exp_args:Ncc \vbox_gset_to_ht:Nnn}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\vbox_set_inline_begin:N}
+% \begin{macro}{\vbox_set_inline_end:}
+% \begin{macro}{\vbox_gset_inline_begin:N}
+% \begin{macro}{\vbox_set_inline_end:}
+% Storing material in a vertical box. This type is useful in
+% environment definitions.
+% \begin{macrocode}
+\def_new:Npn \vbox_set_inline_begin:N #1 {
+ \tex_setbox:D #1 \tex_vbox:D \c_group_begin_token }
+\let_new:NN \vbox_set_inline_end: \c_group_end_token
+\def_new:Npn \vbox_gset_inline_begin:N {
+ \pref_global:D \vbox_set_inline_begin:N }
+\let_new:NN \vbox_gset_inline_end: \c_group_end_token
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\vbox_to_ht:nn}
+% \begin{macro}{\vbox_to_zero:n}
+% Put a vertical box directly into the input stream.
+% \begin{macrocode}
+\def_long_new:Npn \vbox_to_ht:nn #1#2{\tex_vbox:D to \dim_eval:n{#1}{#2}}
+\def_long_new:Npn \vbox_to_zero:n #1 {\tex_vbox:D to \c_zero_dim {#1}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\vbox_set_split_to_ht:NNn}
+% Splitting a vertical box in two.
+% \begin{macrocode}
+\def_new:Npn \vbox_set_split_to_ht:NNn #1#2#3{
+ \tex_setbox:D #1 \tex_vsplit:D #2 to #3
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\vbox_unpack:N}
+% \begin{macro}{\vbox_unpack:c}
+% \begin{macro}{\vbox_unpack_clear:N}
+% \begin{macro}{\vbox_unpack_clear:c}
+% Unpacking a box and if requested also clear it.
+% \begin{macrocode}
+\let_new:NN \vbox_unpack:N \tex_unvcopy:D
+\def_new:Npn \vbox_unpack:c {\exp_args:Nc \vbox_unpack:N}
+\let_new:NN \vbox_unpack_clear:N \tex_unvbox:D
+\def_new:Npn \vbox_unpack_clear:c {\exp_args:Nc \vbox_unpack_clear:N}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+%
+%
+% \subsubsection{Horizontal boxes}
+%
+%
+% \begin{macro}{\hbox:n}
+% Put a horizontal box directly into the input stream.
+% \begin{macrocode}
+\def_new:Npn \hbox:n {\tex_hbox:D \scan_stop:}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\hbox_set:Nn}
+% \begin{macro}{\hbox_set:cn}
+% \begin{macro}{\hbox_gset:Nn}
+% \begin{macro}{\hbox_gset:cn}
+% Assigning the contents of a box to be another box.
+% This clears the second box globally (that's how \TeX{} does it).
+% \begin{macrocode}
+\def_long_new:Npn \hbox_set:Nn #1#2 {\tex_setbox:D #1 \tex_hbox:D {#2}}
+\def_new:Npn \hbox_set:cn {\exp_args:Nc \hbox_set:Nn}
+\def_new:Npn \hbox_gset:Nn {\pref_global:D \hbox_set:Nn}
+\def_new:Npn \hbox_gset:cn {\exp_args:Nc \hbox_gset:Nn}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\hbox_set_to_wd:Nnn}
+% \begin{macro}{\hbox_set_to_wd:cnn}
+% \begin{macro}{\hbox_gset_to_wd:Nnn}
+% \begin{macro}{\hbox_gset_to_wd:cnn}
+% Storing material in a horizontal box with a specified width.
+% \begin{macrocode}
+\def_long_new:Npn \hbox_set_to_wd:Nnn #1#2#3 {
+ \tex_setbox:D #1 \tex_hbox:D to \dim_eval:n{#2} {#3}}
+\def_new:Npn \hbox_set_to_wd:cnn{\exp_args:Nc \hbox_set_to_wd:Nnn }
+\def_new:Npn \hbox_gset_to_wd:Nnn {\pref_global:D \hbox_set_to_wd:Nnn }
+\def_new:Npn \hbox_gset_to_wd:cnn{\exp_args:Nc \hbox_gset_to_wd:Nnn }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\hbox_set_inline_begin:N}
+% \begin{macro}{\hbox_set_inline_end:}
+% \begin{macro}{\hbox_gset_inline_begin:N}
+% \begin{macro}{\hbox_set_inline_end:}
+% Storing material in a horizontal box. This type is useful in
+% environment definitions.
+% \begin{macrocode}
+\def_new:Npn \hbox_set_inline_begin:N #1 {
+ \tex_setbox:D #1 \tex_hbox:D \c_group_begin_token }
+\let_new:NN \hbox_set_inline_end: \c_group_end_token
+\def_new:Npn \hbox_gset_inline_begin:N {
+ \pref_global:D \hbox_set_inline_begin:N }
+\let_new:NN \hbox_gset_inline_end: \c_group_end_token
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\hbox_to_wd:nn}
+% \begin{macro}{\hbox_to_zero:n}
+% Put a horizontal box directly into the input stream.
+% \begin{macrocode}
+\def_long_new:Npn \hbox_to_wd:nn #1#2 {\tex_hbox:D to #1 {#2}}
+\def_long_new:Npn \hbox_to_zero:n #1 {\tex_hbox:D to \c_zero_skip {#1}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\hbox_unpack:N}
+% \begin{macro}{\hbox_unpack:c}
+% \begin{macro}{\hbox_unpack_clear:N}
+% \begin{macro}{\hbox_unpack_clear:c}
+% Unpacking a box and if requested also clear it.
+% \begin{macrocode}
+\let_new:NN \hbox_unpack:N \tex_unhcopy:D
+\def_new:Npn \hbox_unpack:c {\exp_args:Nc \hbox_unpack:N}
+\let_new:NN \hbox_unpack_clear:N \tex_unhbox:D
+\def_new:Npn \hbox_unpack_clear:c {\exp_args:Nc \hbox_unpack_clear:N}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%^^A xo-or.sty:1528: \setbox\z@\vsplit\c_twohundred_fifty_five to\l_tmpa_dim
+%^^A xo-or.dtx:222: \global\setbox\removed@guard@box\lastbox}
+%
+%^^A it probably should be \vbox_set:nn not \vbox_set:Nn as we can
+%^^A have a number as the first arg ... do do we argue that this is not
+%^^A supported on this level?
+%^^A MH comment:
+%^^A I don't think we should ever see people using numbers directly.
+%^^A If they do it's \vbox_set:Nn \c_zero {...} anyway, not two-digit
+%^^A numbers.
+%
+% \begin{macrocode}
+%</initex|package>
+%<*showmemory>
+\showMemUsage
+%</showmemory>
+% \end{macrocode}
+%
+% \endinput
+%
+% $Log$
+% Revision 1.10 2006/03/20 18:26:34 braams
+% Updated the copyright notice (2006) and demoted all implementation
+% sections to subsections and so on to clean up the toc for source3.tex
+%
+% Revision 1.9 2006/01/19 22:30:30 morten
+% Added functions for accessing \tex_lastbox:D and moving box material
+% in the four directions.
+%
+% Revision 1.8 2005/12/27 16:04:12 morten
+% Changed RCS information retrieval
+%
+% Revision 1.7 2005/10/27 23:11:12 morten
+% Moved \if_hbox:N, \if_vbox:N and _if_box_empty:N here
+%
+% Revision 1.6 2005/04/25 16:15:17 morten
+% Fixed \bgroup/\egroup and made it run under initex
+%
+% Revision 1.5 2005/04/06 22:35:33 braams
+% Now we have register allocation fitted
+%
+% Revision 1.4 2005/03/26 21:08:12 morten
+% Fix \c_zero -> \c_zero_skip
+%
+% Revision 1.3 2005/03/16 22:36:46 braams
+% Added the tweaks necessary to be able to load with initex
+%
+% Revision 1.2 2005/03/11 21:31:07 braams
+% Fixed the use of RCS information; added \StopEventually
+%