diff options
Diffstat (limited to 'Master/texmf-dist/source/latex/expl3/l3skip.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex/expl3/l3skip.dtx | 1086 |
1 files changed, 1086 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/expl3/l3skip.dtx b/Master/texmf-dist/source/latex/expl3/l3skip.dtx new file mode 100644 index 00000000000..fee0baa4d0a --- /dev/null +++ b/Master/texmf-dist/source/latex/expl3/l3skip.dtx @@ -0,0 +1,1086 @@ +% \iffalse +%% File: l3skip.dtx Copyright (C) 2005-2006 Frank Mittelbach, 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: l3skip.dtx 573 2006-08-21 20:59:37Z morten $ + {L3 Experimental skip registers} +% +% \iffalse +%<*driver> +\documentclass{l3doc} + +\begin{document} +\DocInput{l3skip.dtx} +\end{document} +%</driver> +% \fi +% +% +% \title{The \textsf{l3skip} package\thanks{This file +% has version number \fileversion, last +% revised \filedate.}\\ +% Dimension and skip registers} +% \author{\Team} +% \date{\filedate} +% \maketitle +% +% +% \section{Length registers} +% +% +% \LaTeX3 knows about two types of length registers for internal use: +% rubber lengths ("skip"s) and rigid lengths ("dim"s). +% +% \subsection{Skip registers} +% +% +% +% \subsubsection{Functions} +% +% \begin{function}{% +% \skip_new:N | +% \skip_new:c | +% \skip_new_l:N +% } +% \begin{syntax} +% "\skip_new:N" <skip> +% \end{syntax} +% Defines <skip> to be a new variable of type "skip". +% \begin{texnote} +% "\skip_new:N" is the equivalent to plain \TeX{}'s \tn{newskip}. +% However, the internal register allocation is done differently. +% \end{texnote} +% \end{function} +% +% \begin{function}{% +% \skip_zero:N | +% \skip_zero:c | +% \skip_gzero:N | +% \skip_gzero:c | +% } +% \begin{syntax} +% "\skip_zero:N" <skip> +% \end{syntax} +% Locally or globally reset <skip> to zero. +% For global variables the global versions +% should be used. +% \end{function} +% +% +% \begin{function}{% +% \skip_set:Nn | +% \skip_set:cn | +% \skip_gset:Nn | +% \skip_gset:cn | +% } +% \begin{syntax} +% "\skip_set:Nn" <skip> "{" <skip value> "}" +% \end{syntax} +% These functions will set the <skip> register to the <length> value. +% \end{function} +% +% +% \begin{function}{% +% \skip_add:Nn | +% \skip_add:cn | +% \skip_gadd:Nn | +% } +% \begin{syntax} +% "\skip_add:Nn" <skip> "{" <length> "}" +% \end{syntax} +% These functions will add to the <skip> register the value <length>. If +% the second argument is a <skip> register too, the surrounding braces +% can be left out. +% \end{function} +% +% \begin{function}{% +% \skip_sub:Nn | +% \skip_gsub:Nn | +% } +% \begin{syntax} +% "\skip_gsub:Nn" <skip> "{" <length> "}" +% \end{syntax} +% These functions will subtract from the <skip> register the value +% <length>. If the second argument is a <skip> register too, the +% surrounding braces can be left out. +% \end{function} +% +% \begin{function}{% +% \skip_use:N | +% \skip_use:c | +% } +% \begin{syntax} +% "\skip_use:N" <skip> +% \end{syntax} +% This function returns the length value kept in <skip> in a way +% suitable for further processing. +% \begin{texnote} +% The function "\skip_use:N" could be implemented directly as the \TeX{} +% primitive "\tex_the:D" which is also responsible to produce the values for +% other internal quantities. We have chosen to use individual functions +% for counters, dimensions etc.\ to allow checks and to make the code +% more self-explanatory. +% \end{texnote} +% \end{function} +% +% +% \begin{function}{% +% \skip_horizontal:N | +% \skip_horizontal:c | +% \skip_horizontal:n | +% \skip_vertical:N | +% \skip_vertical:c | +% \skip_vertical:n | +% } +% \begin{syntax} +% "\skip_horizontal:N" <skip> \\ +% "\skip_horizontal:n" "{" <length> "}" +% \end{syntax} +% The "hor" functions insert <skip> or <length> with the \TeX\ +% primitive \tn{hskip}. The "vertical" variants do the same with +% \tn{vskip}. The "n" versions evaluate <length> with "\skip_eval:n". +% \end{function} +% +% +% \begin{function}{% +% \skip_infinite_glue:nTF | +% } +% \begin{syntax} +% "\skip_infinite_glue:nTF" "{"<skip>"}" "{"<true>"}" "{"<false>"}" +% \end{syntax} +% Checks if <skip> contains infinite stretch or shrink components +% and executes either <true> or <false>. Also works on input like +% "3pt plus .5in". +% \end{function} +% +% +% +% \begin{function}{% +% \skip_split_finite_else_action:nnNN | +% } +% \begin{syntax} +% "\skip_split_finite_else_action:nnNN" "{"<skip>"}" "{"<action>"}" +% <dimen1> <dimen2> +% \end{syntax} +% Checks if <skip> contains finite glue. If it does then it assigns +% <dimen1> the stretch component and <dimen2> the shrink component. If +% it contains infinite glue set <dimen1> and <dimen2> to zero and execute +% "#2" which is usually an error or warning message of some sort. +% \end{function} +% +% +% +% \begin{function}{% +% \skip_eval:n | +% } +% \begin{syntax} +% "\skip_eval:n" "{"<skip expr>"}" +% \end{syntax} +% Evaluates the value of <skip expr> so that +% "\skip_eval:n {5pt plus 3fil + 3pt minus 1fil}" puts +% "8.0pt plus 3.0fil minus 1.0fil" back into the input stream. +% Expandable. +% \begin{texnote} +% This is the \eTeX{} primitive \tn{glueexpr} turned into a function +% taking an argument. +% \end{texnote} +% \end{function} +% +% +% \subsubsection{Formatting a skip register value} +% +% +% \subsubsection{Variable and constants} +% +% \begin{variable}{% +% \c_max_skip | +% } +% Constant that denotes the maximum value which can be stored in a <skip> +% register. +% \end{variable} +% +% \begin{variable}{% +% \c_zero_skip | +% } +% Set of constants denoting useful values. +% \end{variable} +% +% \begin{variable}{% +% \l_tmpa_skip | +% \l_tmpb_skip | +% \l_tmpc_skip | +% \g_tmpa_skip | +% \g_tmpb_skip | +% } +% Scratch register for immediate use. +% \end{variable} +% +% +% +% +% +% \subsection{Dim registers} +% +% +% \subsubsection{Functions} +% +% +% +% +% \begin{function}{% +% \dim_new:N | +% \dim_new:c | +% \dim_new_l:N +% } +% \begin{syntax} +% "\dim_new:N" <dim> +% \end{syntax} +% Defines <dim> to be a new variable of type "dim". +% \begin{texnote} +% "\dim_new:N" is the equivalent to plain \TeX{}'s \tn{newdimen}. +% However, the internal register allocation is done differently. +% \end{texnote} +% \end{function} +% +% \begin{function}{% +% \dim_zero:N | +% \dim_zero:c | +% \dim_gzero:N | +% \dim_gzero:c | +% } +% \begin{syntax} +% "\dim_zero:N" <dim> +% \end{syntax} +% Locally or globally reset <dim> to zero. +% For global variables the global versions +% should be used. +% \end{function} +% +% +% \begin{function}{% +% \dim_set:Nn | +% \dim_set:cn | +% \dim_gset:Nn | +% \dim_gset:cn | +% } +% \begin{syntax} +% "\dim_set:Nn" <dim> "{" <dim value> "}" +% \end{syntax} +% These functions will set the <dim> register to the <dim value> value. +% \end{function} +% +% +% \begin{function}{% +% \dim_add:Nn | +% \dim_add:cn | +% \dim_gadd:Nn | +% } +% \begin{syntax} +% "\dim_add:Nn" <dim> "{" <length> "}" +% \end{syntax} +% These functions will add to the <dim> register the value <length>. If +% the second argument is a <dim> register too, the surrounding braces +% can be left out. +% \end{function} +% +% \begin{function}{% +% \dim_sub:Nn | +% \dim_gsub:Nn | +% } +% \begin{syntax} +% "\dim_gsub:Nn" <dim> "{" <length> "}" +% \end{syntax} +% These functions will subtract from the <dim> register the value +% <length>. If the second argument is a <dim> register too, the +% surrounding braces can be left out. +% \end{function} +% +% \begin{function}{% +% \dim_use:N | +% \dim_use:c | +% } +% \begin{syntax} +% "\dim_use:N" <dim> +% \end{syntax} +% This function returns the length value kept in <dim> in a way +% suitable for further processing. +% \begin{texnote} +% The function "\dim_use:N" could be implemented directly as the \TeX{} +% primitive "\tex_the:D" which is also responsible to produce the values for +% other internal quantities. We have chosen to use individual functions +% for counters, dimensions etc.\ to allow checks and to make the code +% more self-explanatory. +% \end{texnote} +% \end{function} +% +% +% +% \begin{function}{% +% \dim_eval:n | +% } +% \begin{syntax} +% "\dim_eval:n" "{"<dim expr>"}" +% \end{syntax} +% Evaluates the value of a dimension expression so that +% "\dim_eval:n {5pt+3pt}" puts "8pt" back into the input stream. +% Expandable. +% \begin{texnote} +% This is the \eTeX{} primitive \tn{dimexpr} turned into a function +% taking an argument. +% \end{texnote} +% \end{function} +% +% \begin{function}{% +% \if_dim:w | +% } +% \begin{syntax} +% "\if_dim:w" <dimen1> <rel> <dimen2> <true> "\else:" <false> "\fi:" +% \end{syntax} +% Compare two dimensions. It is recommended to use "\dim_eval:n" to +% correctly evaluate and terminate these numbers. <rel> is one of +% "<", "=" or ">" with catcode 12. +% \begin{texnote} +% This is the \TeX{} primitive \tn{ifdim}. +% \end{texnote} +% \end{function} +% +% \begin{function}{% +% \dim_compare:nNnTF | +% \dim_compare:nNnT | +% \dim_compare:nNnF | +% } +% \begin{syntax} +% "\dim_compare:nNnTF" "{"<dim~expr>"}" <rel> "{"<dim~expr>"}" +% "{"<true>"}" "{"<false>"}" +% \end{syntax} +% These functions test two dimension expressions against each other. They +% are both evaluated by "\dim_eval:n". Note that if both expressions +% are normal dimension variables as in +% \begin{verbatim} +% \dim_compare:nNnTF \l_temp_dim < \c_zero_skip {negative}{non-negative} +% \end{verbatim} +% you can safely omit the braces. +% \begin{texnote} +% This is the \TeX{} primitive \tn{ifdim} turned into a function. +% \end{texnote} +% \end{function} +% +% \begin{function}{% +% \dim_compare_p:nNn | +% } +% \begin{syntax} +% "\dim_compare_p:nNn" "{"<dim~expr>"}" <rel> "{"<dim~expr>"}" +% \end{syntax} +% Predicate version of the above functions. +% \end{function} +% +% \begin{function}{% +% \dim_while:nNnT | +% \dim_while:nNnF | +% \dim_dowhile:nNnT | +% \dim_dowhile:nNnF | +% } +% \begin{syntax} +% "\dim_while:nNnT" <dim expr> <rel> <dim~expr> <true> +% \end{syntax} +% "\dim_while:nNnT" tests the dimension expressions and if true performs +% the body "T" until the test fails. "\dim_dowhile:nNnT" is similar +% but executes the body first and then performs the check, thus +% ensuring that the body is executed at least once. The "F" versions +% are similar but continue the loop as long as the test is false. +% \end{function} +% +% +% +% \subsubsection{Variable and constants} +% +% \begin{variable}{% +% \c_max_dim | +% } +% Constant that denotes the maximum value which can be stored in a <dim> +% register. +% \end{variable} +% +% \begin{variable}{% +% \c_zero_dim | +% } +% Set of constants denoting useful values. +% \end{variable} +% +% \begin{variable}{% +% \l_tmpa_dim | +% \l_tmpb_dim | +% \l_tmpc_dim | +% \l_tmpd_dim | +% \g_tmpa_dim | +% \g_tmpb_dim | +% } +% Scratch register for immediate use. +% \end{variable} +% +% \subsection{Muskips} +% +% \begin{function}{% +% \muskip_new:N | +% \muskip_new_l:N +% } +% \begin{syntax} +% "\muskip_new:N" <muskip> +% \end{syntax} +% Defines <muskip> to be a new variable of type "muskip". +% \begin{texnote} +% "\muskip_new:N" is the equivalent to plain \TeX{}'s \tn{newmuskip}. +% However, the internal register allocation is done differently. +% \end{texnote} +% \end{function} +% +% \begin{function}{% +% \muskip_set:Nn | +% \muskip_gset:Nn | +% } +% \begin{syntax} +% "\muskip_set:Nn" <muskip> "{" <muskip value> "}" +% \end{syntax} +% These functions will set the <muskip> register to the <length> +% value. +% \end{function} +% +% +% \begin{function}{% +% \muskip_add:Nn | +% \muskip_gadd:Nn | +% } +% \begin{syntax} +% "\muskip_add:Nn" <muskip> "{" <length> "}" +% \end{syntax} +% These functions will add to the <muskip> register the value +% <length>. If the second argument is a <muskip> register too, the +% surrounding braces can be left out. +% \end{function} +% +% \begin{function}{% +% \muskip_sub:Nn | +% \muskip_gsub:Nn | +% } +% \begin{syntax} +% "\muskip_gsub:Nn" <muskip> "{" <length> "}" +% \end{syntax} +% These functions will subtract from the <muskip> register the value +% <length>. If the second argument is a <muskip> register too, the +% surrounding braces can be left out. +% \end{function} +% +% +% \StopEventually{} +% +% \subsection{The Implementation} +% +% +% We start by ensuring that the required packages are loaded. +% \begin{macrocode} +%<package&!check>\RequirePackage{l3int} +%<package&!check>\RequirePackage{l3prg} +%<package&check>\RequirePackage{l3chk} +%<*initex|package> +% \end{macrocode} +% +% \subsubsection{Skip registers} +% +% \begin{macro}{\skip_new:N} +% \begin{macro}{\skip_new:c} +% \begin{macro}{\skip_new_l:N} +% Allocation of a new internal registers. +% \begin{macrocode} +%<*initex> +\alloc_setup_type:nnn {skip} \c_zero \c_max_register_num +\def_new:Npn\skip_new:N #1 {\alloc_reg:NnNN g {skip} \tex_skipdef:D #1 } +\def_new:Npn\skip_new_l:N #1 {\alloc_reg:NnNN l {skip} \tex_skipdef:D #1 } +%</initex> +%<package>\let:NN \skip_new:N \newskip +\def_new:Npn \skip_new:c {\exp_args:Nc \skip_new:N} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\skip_set:Nn} +% \begin{macro}{\skip_set:cn} +% \begin{macro}{\skip_gset:Nn} +% \begin{macro}{\skip_gset:cn} +% Setting skips is again something that I would like to make +% uniform at the moment to get a better overview. +% \begin{macrocode} +\def_new:Npn \skip_set:Nn #1#2{#1\skip_eval:n{#2} +%<*check> +\chk_local_or_pref_global:N #1 +%</check> +} +\def_new:Npn \skip_gset:Nn { +%<*check> + \pref_global_chk: +%</check> +%<-check> \pref_global:D + \skip_set:Nn } +\def_new:Npn \skip_set:cn {\exp_args:Nc \skip_set:Nn } +\def_new:Npn \skip_gset:cn {\exp_args:Nc \skip_gset:Nn } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\skip_zero:N} +% \begin{macro}{\skip_gzero:N} +% \begin{macro}{\skip_zero:c} +% \begin{macro}{\skip_gzero:c} +% Reset the register to zero. +% \begin{macrocode} +\def_new:Npn \skip_zero:N #1{#1\c_zero_skip \scan_stop: +%<*check> + \chk_local_or_pref_global:N #1 +%</check> +} +\def_new:Npn \skip_gzero:N { +% \end{macrocode} +% We make sure that a local variable is not updated globally by +% changing the internal test (i.e.\ |\chk_local_or_pref_global:N|) before +% making the assignment. This is done by |\pref_global_chk:| which also +% issues the necessary |\pref_global:D|. This is not very efficient, but +% this code will be only included for debugging purposes. Using +% |\pref_global:D| in front of the local function is better in the +% production versions. +% \begin{macrocode} +%<*check> + \pref_global_chk: +%</check> +%<-check> \pref_global:D + \skip_zero:N} +\def_new:Npn \skip_zero:c {\exp_args:Nc \skip_zero:N} +\def_new:Npn \skip_gzero:c {\exp_args:Nc \skip_gzero:N} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\skip_add:Nn} +% \begin{macro}{\skip_add:cn} +% \begin{macro}{\skip_gadd:Nn} +% \begin{macro}{\skip_sub:Nn} +% \begin{macro}{\skip_gsub:Nn} +% Adding and subtracting to and from <skip>s +% \begin{macrocode} +\def_new:Npn \skip_add:Nn #1#2{ +% \end{macrocode} +% We need to say |by| in case the first argment is a register +% accessed by its number, e.g., |\skip23|. +% \begin{macrocode} + \tex_advance:D#1 by \skip_eval:n{#2} +%<*check> + \chk_local_or_pref_global:N #1 +%</check> +} +\def_new:Npn\skip_add:cn{\exp_args:Nc\skip_add:Nn} +\def_new:Npn \skip_sub:Nn #1#2{ + \tex_advance:D#1-\skip_eval:n{#2} +%<*check> +\chk_local_or_pref_global:N #1 +%</check> +} +\def_new:Npn \skip_gadd:Nn { +%<*check> + \pref_global_chk: +%</check> +%<-check> \pref_global:D + \skip_add:Nn } +\def_new:Npn \skip_gsub:Nn { +%<*check> + \pref_global_chk: +%</check> +%<-check> \pref_global:D + \skip_sub:Nn } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\skip_horizontal:N} +% \begin{macro}{\skip_horizontal:c} +% \begin{macro}{\skip_horizontal:n} +% \begin{macro}{\skip_vertical:N} +% \begin{macro}{\skip_vertical:c} +% \begin{macro}{\skip_vertical:n} +% Inserting skips. +% \begin{macrocode} +\let_new:NN \skip_horizontal:N \tex_hskip:D +\def_new:Npn \skip_horizontal:c {\exp_args:Nc\skip_horizontal:N} +\def_new:Npn \skip_horizontal:n #1{\skip_horizontal:N \skip_eval:n{#1}} +\let_new:NN \skip_vertical:N \tex_vskip:D +\def_new:Npn \skip_vertital:c {\exp_args:Nc\skip_vertical:N} +\def_new:Npn \skip_vertical:n #1{\skip_vertical:N \skip_eval:n{#1}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\skip_use:N} +% \begin{macro}{\skip_use:c} +% Here is how skip registers are accessed: +% \begin{macrocode} +\let_new:NN \skip_use:N \tex_the:D +\def_new:Npn \skip_use:c #1{\exp_args:Nc\skip_use:N} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\skip_eval:n} +% Evaluating a calc expression. +% \begin{macrocode} +\def_new:Npn \skip_eval:n #1 {\etex_glueexpr:D #1 \scan_stop:} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l_tmpa_skip} +% \begin{macro}{\l_tmpb_skip} +% \begin{macro}{\l_tmpc_skip} +% \begin{macro}{\g_tmpa_skip} +% \begin{macro}{\g_tmpb_skip} +% We provide three local and two global scratch registers, maybe we +% need more or less. +% \begin{macrocode} +%%\chk_new_cs:N \l_tmpa_skip +%%\tex_skipdef:D\l_tmpa_skip 255 %currently taken up by \skip@ +\skip_new:N \l_tmpa_skip +\skip_new:N \l_tmpb_skip +\skip_new:N \l_tmpc_skip +\skip_new:N \g_tmpa_skip +\skip_new:N \g_tmpb_skip +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\c_zero_skip} +% \begin{macro}{\c_max_skip} +% \begin{macrocode} +%<*!package> +\skip_new:N \c_zero_skip +\skip_set:Nn \c_zero_skip {0pt} +\skip_new:N \c_max_skip +\skip_set:Nn \c_max_skip {16383.99999pt} +%</!package> +%<*!initex> +\let:NN \c_zero_skip \z@ +\let:NN \c_max_skip \maxdimen +%</!initex> +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% +% \begin{macro}{\skip_infinite_glue:nTF} +% With \eTeX{} we all of a sudden get access to a lot information we +% should otherwise consider ourselves lucky to get. One is +% the stretch and shrink components of a skip register and the order +% or those components. "\skip_infinite_glue:nTF" tests it directly by +% looking at the stretch and shrink order. If either of the predicate +% functions return \m{true} "\prg_logic_or_p:nn" will return \m{true} +% and the logic test will take the true branch. +% \begin{macrocode} +\def_new:Npn \skip_infinite_glue:nTF #1{ + \prg_logic_test:nTF { + \prg_logic_or_p:nn + { \int_compare_p:nNn {\etex_gluestretchorder:D #1 } > \c_zero } + { \int_compare_p:nNn {\etex_glueshrinkorder:D #1 } > \c_zero } + } +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\skip_split_finite_else_action:nnNN} +% This macro is useful when performing error checking in certain +% circumstances. If the \m{skip} register holds finite glue it sets +% "#3" and "#4" to the stretch and shrink component resp. If it holds +% infinite glue set "#3" and "#4" to zero and issue the special action +% "#2" which is probably an error message. +% Assignments are global. +% \begin{macrocode} +\def_new:Npn \skip_split_finite_else_action:nnNN #1#2#3#4{ + \skip_infinite_glue:nTF {#1} + { + #3 = \c_zero_skip + #4 = \c_zero_skip + #2 + } + { + #3 = \etex_gluestretch:D #1 \scan_stop: + #4 = \etex_glueshrink:D #1 \scan_stop: + } +} +% \end{macrocode} +% \end{macro} +% +% +% +% \subsubsection{Dimen registers} +% +% \begin{macro}{\dim_new:N} +% \begin{macro}{\dim_new:c} +% \begin{macro}{\dim_new_l:N} +% Allocating \meta{dim} registers... +% \begin{macrocode} +%<*initex> +\alloc_setup_type:nnn {dimen} \c_zero \c_max_register_num +\def_new:Npn \dim_new:N #1 {\alloc_reg:NnNN g {dimen} \tex_dimendef:D #1 } +\def_new:Npn \dim_new_l:N #1 {\alloc_reg:NnNN l {dimen} \tex_dimendef:D #1 } +%</initex> +%<package>\let:NN \dim_new:N \newdimen +\def_new:Npn \dim_new:c {\exp_args:Nc \dim_new:N} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\dim_set:Nn} +% \begin{macro}{\dim_gset:Nn} +% \begin{macro}{\dim_set:cn} +% \begin{macro}{\dim_set:Nc} +% \begin{macro}{\dim_gset:cn} +% \begin{macro}{\dim_gset:Nc} +% \begin{macro}{\dim_gset:cc} +% We add |\dim_eval:n| in order to allow simple arithmetic +% and a space just for those using |\dimen1| or alike. See OR! +% \begin{macrocode} +\def_new:Npn \dim_set:Nn #1#2{#1~ \dim_eval:n{#2}} +\def_new:Npn \dim_gset:Nn {\pref_global:D \dim_set:Nn } +\def_new:Npn \dim_set:cn {\exp_args:Nc \dim_set:Nn } +\def_new:Npn \dim_set:Nc {\exp_args:NNc \dim_set:Nn } +\def_new:Npn \dim_gset:cn {\exp_args:Nc \dim_gset:Nn } +\def_new:Npn \dim_gset:Nc {\exp_args:NNc \dim_gset:Nn } +\def_new:Npn \dim_gset:cc {\exp_args:Ncc \dim_gset:Nn } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\dim_zero:N} +% \begin{macro}{\dim_gzero:N} +% \begin{macro}{\dim_zero:c} +% \begin{macro}{\dim_gzero:N} +% Resetting. +% \begin{macrocode} +\def_new:Npn \dim_zero:N #1{#1\c_zero_skip} +\def_new:Npn \dim_gzero:N {\pref_global:D \dim_zero:N} +\def_new:Npn \dim_zero:c {\exp_args:Nc \dim_zero:N} +\def_new:Npn \dim_gzero:c {\exp_args:Nc \dim_gzero:N} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\dim_add:Nn} +% \begin{macro}{\dim_add:cn} +% \begin{macro}{\dim_add:Nc} +% \begin{macro}{\dim_gadd:Nn} +% Addition. +% \begin{macrocode} +\def_new:Npn \dim_add:Nn #1#2{ +% \end{macrocode} +% We need to say |by| in case the first argment is a register +% accessed by its number, e.g., |\dimen23|. +% \begin{macrocode} + \tex_advance:D#1 by \dim_eval:n{#2}\scan_stop: +} +\def_new:Npn\dim_add:cn{\exp_args:Nc\dim_add:Nn} +\def_new:Npn\dim_add:Nc{\exp_args:NNc\dim_add:Nn} +\def_new:Npn \dim_gadd:Nn { \pref_global:D \dim_add:Nn } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\dim_sub:Nn} +% \begin{macro}{\dim_sub:cn} +% \begin{macro}{\dim_sub:Nc} +% \begin{macro}{\dim_gsub:Nn} +% Subtracting. +% \begin{macrocode} +\def_new:Npn \dim_sub:Nn #1#2{\tex_advance:D#1-#2\scan_stop:} +\def_new:Npn\dim_sub:cn{\exp_args:Nc\dim_sub:Nn} +\def_new:Npn\dim_sub:Nc{\exp_args:NNc\dim_sub:Nn} +\def_new:Npn \dim_gsub:Nn {\pref_global:D \dim_sub:Nn } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\dim_use:N} +% \begin{macro}{\dim_use:c} +% Accessing a \meta{dim}. +% \begin{macrocode} +\let_new:NN \dim_use:N \tex_the:D +\def_new:Npn \dim_use:c {\exp_args:Nc\dim_use:N} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\l_tmpa_dim} +% \begin{macro}{\l_tmpb_dim} +% \begin{macro}{\l_tmpc_dim} +% \begin{macro}{\l_tmpd_dim} +% \begin{macro}{\g_tmpa_dim} +% \begin{macro}{\g_tmpb_dim} +% Some scratch registers. +% \begin{macrocode} +\dim_new:N \l_tmpa_dim +\dim_new:N \l_tmpb_dim +\dim_new:N \l_tmpc_dim +\dim_new:N \l_tmpd_dim +\dim_new:N \g_tmpa_dim +\dim_new:N \g_tmpb_dim +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\c_zero_dim} +% \begin{macro}{\c_max_dim} +% Just aliases. +% \begin{macrocode} +\let_new:NN \c_zero_dim \c_zero_skip +\let_new:NN \c_max_dim \c_max_skip +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\dim_eval:n} +% Evaluating a calc expression. +% \begin{macrocode} +\def_new:Npn \dim_eval:n #1 {\etex_dimexpr:D #1 \scan_stop:} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\if_dim:w} +% The comparison primitive. +% \begin{macrocode} +\let_new:NN \if_dim:w \tex_ifdim:D +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\dim_compare:nNnTF} +% \begin{macro}{\dim_compare:nNnT} +% \begin{macro}{\dim_compare:nNnF} +% Check the expression and choose branch. +% \begin{macrocode} +\def_new:Npn \dim_compare:nNnTF #1#2#3{ + \if_dim:w \dim_eval:n {#1} #2 \dim_eval:n {#3} + \exp_after:NN \use_arg_i:nn + \else: + \exp_after:NN \use_arg_ii:nn + \fi: +} +\def_new:Npn \dim_compare:nNnT #1#2#3{ + \if_dim:w \dim_eval:n {#1} #2 \dim_eval:n {#3} + \exp_after:NN \use_arg_ii:nn + \fi: + \use_none:n +} +\def_new:Npn \dim_compare:nNnF #1#2#3{ + \if_dim:w \dim_eval:n {#1} #2 \dim_eval:n {#3} + \exp_after:NN \use_none:n + \else: + \exp_after:NN \use_arg_i:n + \fi: +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\dim_compare_p:nNn} +% A predicate function. +% \begin{macrocode} +\def_new:Npn \dim_compare_p:nNn #1#2#3{ + \if_dim:w \dim_eval:n {#1} #2 \dim_eval:n {#3} + \c_true + \else: + \c_false + \fi: +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\dim_while:nNnT} +% \begin{macro}{\dim_while:nNnF} +% \begin{macro}{\dim_dowhile:nNnT} +% \begin{macro}{\dim_dowhile:nNnF} +% "while" and "do-while" functions for dimensions. Same as for the +% "int" type only the names have changed. +% \begin{macrocode} +\def_new:Npn \dim_while:nNnT #1#2#3#4{ + \dim_compare:nNnT {#1}#2{#3}{#4 \dim_while:nNnT {#1}#2{#3}{#4}} +} +\def_new:Npn \dim_while:nNnF #1#2#3#4{ + \dim_compare:nNnF {#1}#2{#3}{#4 \dim_while:nNnF {#1}#2{#3}{#4}} +} +\def_new:Npn \dim_dowhile:nNnT #1#2#3#4{ + #4 \dim_compare:nNnT {#1}#2{#3}{\dim_dowhile:nNnT {#1}#2{#3}{#4}} +} +\def_new:Npn \dim_dowhile:nNnF #1#2#3#4{ + #4 \dim_compare:nNnF {#1}#2{#3}{\dim_dowhile:nNnF {#1}#2{#3}{#4}} +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \subsubsection{Muskips} +% +% \begin{macro}{\muskip_new:N} +% \begin{macro}{\muskip_new_l:N} +% And then we add muskips. +% \begin{macrocode} +%<*initex> +\alloc_setup_type:nnn {muskip} \c_zero \c_max_register_num +\def_new:Npn \muskip_new:N #1{\alloc_reg:NnNN g {muskip} \tex_muskipdef:D #1} +\def_new:Npn \muskip_new_l:N #1{\alloc_reg:NnNN l {muskip} \tex_muskipdef:D #1} +%</initex> +%<package>\let_new:NN \muskip_new:N \newmuskip % nicked from LaTeX +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\muskip_set:Nn} +% \begin{macro}{\muskip_gset:Nn} +% \begin{macro}{\muskip_add:Nn} +% \begin{macro}{\muskip_gadd:Nn} +% \begin{macro}{\muskip_sub:Nn} +% \begin{macro}{\muskip_gsub:Nn} +% Simple functions for muskips. +% \begin{macrocode} +\def_new:Npn \muskip_set:Nn#1#2{#1\etex_muexpr:D#2\scan_stop:} +\def_new:Npn \muskip_gset:Nn{\pref_global:D\muskip_set:Nn} +\def_new:Npn \muskip_add:Nn#1#2{\tex_advance:D#1\etex_muexpr:D#2\scan_stop:} +\def_new:Npn \muskip_gadd:Nn{\pref_global:D\muskip_add:Nn} +\def_new:Npn \muskip_sub:Nn#1#2{\tex_advance:D#1-\etex_muexpr:D#2\scan_stop:} +\def_new:Npn \muskip_gsub:Nn{\pref_global:D\muskip_sub:Nn} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macrocode} +%</initex|package> +% \end{macrocode} +% +% \endinput +% +% $Log$ +% Revision 1.18 2006/03/20 18:26:40 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.17 2006/01/27 11:22:38 morten +% Added \muskip_set:Nn and friends (since l3calc uses them). +% +% Revision 1.16 2006/01/17 22:46:37 morten +% Moved \skip_eval:n earlier to avoid error. +% +% Revision 1.15 2006/01/17 22:05:35 morten +% Minor updates +% +% Revision 1.14 2006/01/14 19:13:16 morten +% Added operations for \vskip and \hskip +% +% Revision 1.13 2005/12/27 15:54:44 morten +% Changed RCS information retrieval +% +% Revision 1.12 2005/10/27 22:56:15 morten +% Moved \if_dim:w to this module. +% +% Revision 1.11 2005/04/12 12:07:10 morten +% Added muskips +% +% Revision 1.10 2005/04/09 21:09:48 morten +% Both documentation and implementation cleaned up. +% +% Revision 1.9 2005/04/06 22:35:57 braams +% Now we have register allocation fitted +% +% Revision 1.8 2005/03/26 21:05:42 morten +% Make \c_zero_skip different from \c_zero +% +% Revision 1.7 2005/03/16 22:35:47 braams +% Added the tweaks necessary to be able to load with initex +% +% Revision 1.6 2005/03/11 21:42:48 braams +% Fixed the use of RCS information; added \StopEventually +% |