diff options
Diffstat (limited to 'Master/texmf-dist/source/latex/expl3/l3calc.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex/expl3/l3calc.dtx | 1165 |
1 files changed, 0 insertions, 1165 deletions
diff --git a/Master/texmf-dist/source/latex/expl3/l3calc.dtx b/Master/texmf-dist/source/latex/expl3/l3calc.dtx deleted file mode 100644 index 4d477acf7be..00000000000 --- a/Master/texmf-dist/source/latex/expl3/l3calc.dtx +++ /dev/null @@ -1,1165 +0,0 @@ -% \iffalse -%% File: l3calc.dtx Copyright (C) 2006,2009 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/svnroot/experimental/trunk/ -%% -%% 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. -%% -%% ----------------------------------------------------------------------- -%<*driver|package> -\RequirePackage{l3names} -%</driver|package> -%\fi -\GetIdInfo$Id: l3calc.dtx 2223 2011-04-09 12:57:14Z will $ - {L3 Experimental calc module} -%\iffalse -%<*driver> -%\fi -\ProvidesFile{\filename.\filenameext} - [\filedate\space v\fileversion\space\filedescription] -%\iffalse -\documentclass[full]{l3doc} -\begin{document} -\DocInput{\filename.\filenameext} -\end{document} -%</driver> -% \fi -% -% \title{The \textsf{l3calc} package\thanks{This file has version -% number \fileversion, last -% revised \filedate.}\\ -% Infix notation arithmetic in \LaTeX3} -% \author{\Team} -% \date{\filedate} -% \maketitle -% -% \begin{documentation} -% -% This is pretty much a straight adaption of the \textsf{calc} package -% and as such has same syntax for the \meta{calc expression}. However, -% there are some noticeable differences. -% \begin{itemize} -% \item The calc expression is expanded fully, which means there are -% no problems with unfinished conditionals. However, the contents of -% |\widthof| etc.\ is not expanded at all. This includes uses in -% traditional \LaTeX\ as in the \textsf{array} package, which tries -% to do an |\edef| several times. The code used in \textsf{l3calc} -% provides self-protection for these cases. -% \item Muskip registers are supported although they can only be used -% in |\ratio| if already evaluating a muskip expression. For the -% other three register types, you can use points. -% \item All results are rounded, not truncated. More precisely, the -% primitive \TeX\ operations |\divide| and |\multiply| are not -% used. The only instance where one will observe an effect is when -% dividing integers. -% \end{itemize} -% -% This version of \textsf{l3calc} is a now a complete replacement for -% the original \textsf{calc} package providing the same functionality -% and will prevent the original \textsf{calc} package from loading. -% -% \section{User functions} -% -% -% \begin{function}{ \maxof | -% \minof | -% \widthof | -% \heightof | -% \depthof | -% \totalheightof | -% \ratio | -% \real | -% \setlength | -% \gsetlength | -% \addtolength | -% \gaddtolength | -% \setcounter | -% \addtocounter | -% \stepcounter } -% See documentation for \LaTeXe\ package \pkg{calc}. -% \end{function} -% -% \begin{function}{ \calc_maxof:nn | -% \calc_minof:nn | -% \calc_widthof:n | -% \calc_heightof:n | -% \calc_depthof:n | -% \calc_totalheightof:n | -% \calc_ratio:nn | -% \calc_real:n | -% \calc_setcounter:nn | -% \calc_addtocounter:nn | -% \calc_stepcounter:n } -% Equivalent commands as the above in the \pkg{expl3} namespace. -% \end{function} -% -% \begin{function}{ -% \calc_int_set:Nn | -% \calc_int_gset:Nn | -% \calc_int_add:Nn | -% \calc_int_gadd:Nn | -% \calc_int_sub:Nn | -% \calc_int_gsub:Nn -% } -% \begin{syntax} -% "\calc_int_set:Nn" <int> \Arg{calc expression} -% \end{syntax} -% Evaluates <calc expression> and either adds or subtracts it from -% <int> or sets <int> to it. These operations can also be global. -% \end{function} -% -% -% \begin{function}{ -% \calc_dim_set:Nn | -% \calc_dim_gset:Nn | -% \calc_dim_add:Nn | -% \calc_dim_gadd:Nn | -% \calc_dim_sub:Nn | -% \calc_dim_gsub:Nn | -% } -% \begin{syntax} -% "\calc_dim_set:Nn" <dim> \Arg{calc expression} -% \end{syntax} -% Evaluates <calc expression> and either adds or subtracts it from -% <dim> or sets <dim> to it. These operations can also be global. -% \end{function} -% -% -% \begin{function}{ -% \calc_skip_set:Nn | -% \calc_skip_gset:Nn | -% \calc_skip_add:Nn | -% \calc_skip_gadd:Nn | -% \calc_skip_sub:Nn | -% \calc_skip_gsub:Nn | -% } -% \begin{syntax} -% "\calc_skip_set:Nn" <skip> \Arg{calc expression} -% \end{syntax} -% Evaluates <calc expression> and either adds or subtracts it from -% <skip> or sets <skip> to it. These operations can also be global. -% \end{function} -% -% -% \begin{function}{ -% \calc_muskip_set:Nn | -% \calc_muskip_gset:Nn | -% \calc_muskip_add:Nn | -% \calc_muskip_gadd:Nn | -% \calc_muskip_sub:Nn | -% \calc_muskip_gsub:Nn | -% } -% \begin{syntax} -% "\calc_muskip_set:Nn" <muskip> \Arg{calc expression} -% \end{syntax} -% Evaluates <calc expression> and either adds or subtracts it from -% <muskip> or sets <muskip> to it. These operations can also be -% global. -% \end{function} -% -% -% \begin{function}{ -% \calc_calculate_box_size:nnn | -% } -% \begin{syntax} -% "\calc_calculate_box_size:nnn" \Arg{dim-set} \\ -% "{"<item 1> <item 2> ... <item n>"}" \Arg{contents} -% \end{syntax} -% Sets <contents> in a temporary box "\l_tmpa_box". Then <dim-set> -% is put in front of a loop that inserts "+"\meta{item$\sb{i}$} in -% front of "\l_tmpa_box" and this is evaluated. For instance, if we -% wanted to determine the total height of the text "xyz" and store -% it in "\l_tmpa_dim", we would call it as. -% \begin{verbatim} -% \calc_calculate_box_size:nnn -% {\dim_set:Nn\l_tmpa_dim}{\box_ht:N\box_dp:N}{xyz} -% \end{verbatim} -% Similarly, if we wanted the difference between height and depth, -% we could call it as -% \begin{verbatim} -% \calc_calculate_box_size:nnn -% {\dim_set:Nn\l_tmpa_dim}{\box_ht:N{-\box_dp:N}}{xyz} -% \end{verbatim} -% \end{function} -% -% \end{documentation} -% -% \begin{implementation} -% -% -% \section{\pkg{l3calc} implementation} -% -% \subsection{Variables} -% -% \begin{function}{ \l_calc_expression_tl | -% \g_calc_A_register | -% \l_calc_B_register | -% \l_calc_current_type_int | -% \g_calc_A_int | -% \l_calc_B_int | -% \l_calc_C_int | -% \g_calc_A_dim | -% \l_calc_B_dim | -% \l_calc_C_dim | -% \g_calc_A_skip | -% \l_calc_B_skip | -% \l_calc_C_skip | -% \g_calc_A_muskip | -% \l_calc_B_muskip | -% \l_calc_C_muskip } -% Internal registers. -% \end{function} -% -% \subsection{Internal functions} -% -% \begin{function}{ \calc_assign_generic:NNNNnn | -% \calc_pre_scan:N | -% \calc_open:w | -% \calc_init_B: | -% \calc_numeric: | -% \calc_close: | -% \calc_post_scan:N | -% \calc_multiply:N | -% \calc_divide:N | -% \calc_generic_add_or_subtract:N | -% \calc_add: | -% \calc_subtract: | -% \calc_add_A_to_B: | -% \calc_subtract_A_from_B: | -% \calc_generic_multiply_or_divide:N | -% \calc_multiply_B_by_A: | -% \calc_divide_B_by_A: | -% \calc_multiply: | -% \calc_divide: | -% \calc_textsize:Nn | -% \calc_ratio_multiply:nn | -% \calc_ratio_divide:nn | -% \calc_real_evaluate:nn | -% \calc_real_multiply:n | -% \calc_real_divide:n | -% \calc_maxmin_operation:Nnn | -% \calc_maxmin_generic:Nnn | -% \calc_maxmin_div_or_mul:NNnn | -% \calc_maxmin_multiply: | -% \calc_maxmin_multiply: | -% \calc_error:N | -% \calc_chk_document_counter:nn } -% Awaiting better documentation ":)" -% \end{function} -% -% \subsection{Module code} -% -% Since this is basically a re-worked version of the \textsf{calc} -% package, I haven't bothered with too many comments except for in the -% places where this package differs. This may (and should) change at -% some point. -% -% We start by ensuring that the required packages are loaded. -% \begin{macrocode} -%<*package> -\ProvidesExplPackage - {\filename}{\filedate}{\fileversion}{\filedescription} -\package_check_loaded_expl: -%</package> -%<*initex|package> -% \end{macrocode} -% -% -% \begin{macro}{\l_calc_expression_tl} -% \begin{macro}{\g_calc_A_register} -% \begin{macro}{\l_calc_B_register} -% \begin{macro}{\l_calc_current_type_int} -% Here we define some registers and pointers we will need. -% \begin{macrocode} -\tl_new:N \l_calc_expression_tl -\cs_new_nopar:Npn \g_calc_A_register{} -\cs_new_nopar:Npn \l_calc_B_register{} -\int_new:N \l_calc_current_type_int -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\g_calc_A_int} -% \begin{macro}{\l_calc_B_int} -% \begin{macro}{\l_calc_C_int} -% \begin{macro}{\g_calc_A_dim} -% \begin{macro}{\l_calc_B_dim} -% \begin{macro}{\l_calc_C_dim} -% \begin{macro}{\g_calc_A_skip} -% \begin{macro}{\l_calc_B_skip} -% \begin{macro}{\l_calc_C_skip} -% \begin{macro}{\g_calc_A_muskip} -% \begin{macro}{\l_calc_B_muskip} -% \begin{macro}{\l_calc_C_muskip} -% For each type of register we will need three registers to do our -% manipulations. -% \begin{macrocode} -\int_new:N \g_calc_A_int -\int_new:N \l_calc_B_int -\int_new:N \l_calc_C_int -\dim_new:N \g_calc_A_dim -\dim_new:N \l_calc_B_dim -\dim_new:N \l_calc_C_dim -\skip_new:N \g_calc_A_skip -\skip_new:N \l_calc_B_skip -\skip_new:N \l_calc_C_skip -\muskip_new:N \g_calc_A_muskip -\muskip_new:N \l_calc_B_muskip -\muskip_new:N \l_calc_C_muskip -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% -% -% -% \begin{macro}{\calc_assign_generic:NNNNnn} -% The generic function. |#1| is a number denoting which type we are -% doing. (0=int, 1=dim, 2=skip, 3=muskip), |#2| = temp register A, -% |#3| = temp register B, |#4| is a function acting on |#5| which is -% the register to be set. |#6| is the calc expression. We do a -% little extra work so that |\real| and |\ratio| can still be used -% by the user. -% \begin{macrocode} -\cs_new:Npn \calc_assign_generic:NNNNnn#1#2#3#4#5#6{ - \cs_set_eq:NN\g_calc_A_register#2 - \cs_set_eq:NN\l_calc_B_register#3 - \int_set:Nn \l_calc_current_type_int {#1} - \group_begin: - \cs_set_eq:NN \real \calc_real:n - \cs_set_eq:NN \ratio\calc_ratio:nn - \tl_set:Nx\l_calc_expression_tl{#6} - \exp_after:wN - \group_end: - \exp_after:wN\calc_open:w\exp_after:wN(\l_calc_expression_tl ! - \pref_global:D\g_calc_A_register\l_calc_B_register - \group_end: - #4{#5}\l_calc_B_register -} -% \end{macrocode} -% A simpler version relying on |\real| and |\ratio| having our -% definition is -% \begin{verbatim} -% \cs_new:Npn \calc_assign_generic:NNNNnn#1#2#3#4#5#6{ -% \cs_set_eq:NN\g_calc_A_register#2\cs_set_eq:NN\l_calc_B_register#3 -% \int_set:Nn \l_calc_current_type_int {#1} -% \tl_set:Nx\l_calc_expression_tl{#6} -% \exp_after:wN\calc_open:w\exp_after:wN(\l_calc_expression_tl ! -% \pref_global:D\g_calc_A_register\l_calc_B_register -% \group_end: -% #4{#5}\l_calc_B_register -% } -% \end{verbatim} -% \end{macro} -% -% -% -% \begin{macro}{\calc_int_set:Nn} -% \begin{macro}{\calc_int_gset:Nn} -% \begin{macro}{\calc_int_add:Nn} -% \begin{macro}{\calc_int_gadd:Nn} -% \begin{macro}{\calc_int_sub:Nn} -% \begin{macro}{\calc_int_gsub:Nn} -% Here are the individual versions for the different register -% types. First integer registers. -% \begin{macrocode} -\cs_new_nopar:Npn\calc_int_set:Nn{ - \calc_assign_generic:NNNNnn\c_zero\g_calc_A_int\l_calc_B_int\int_set:Nn -} -\cs_new_nopar:Npn\calc_int_gset:Nn{ - \calc_assign_generic:NNNNnn\c_zero\g_calc_A_int\l_calc_B_int\int_gset:Nn -} -\cs_new_nopar:Npn\calc_int_add:Nn{ - \calc_assign_generic:NNNNnn\c_zero\g_calc_A_int\l_calc_B_int\int_add:Nn -} -\cs_new_nopar:Npn\calc_int_gadd:Nn{ - \calc_assign_generic:NNNNnn\c_zero\g_calc_A_int\l_calc_B_int\int_gadd:Nn -} -\cs_new_nopar:Npn\calc_int_sub:Nn{ - \calc_assign_generic:NNNNnn\c_zero\g_calc_A_int\l_calc_B_int\int_sub:Nn -} -\cs_new_nopar:Npn\calc_int_gsub:Nn{ - \calc_assign_generic:NNNNnn\c_zero\g_calc_A_int\l_calc_B_int\int_gsub:Nn -} -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\calc_dim_set:Nn} -% \begin{macro}{\calc_dim_gset:Nn} -% \begin{macro}{\calc_dim_add:Nn} -% \begin{macro}{\calc_dim_gadd:Nn} -% \begin{macro}{\calc_dim_sub:Nn} -% \begin{macro}{\calc_dim_gsub:Nn} -% Dimens. -% \begin{macrocode} -\cs_new_nopar:Npn\calc_dim_set:Nn{ - \calc_assign_generic:NNNNnn\c_one\g_calc_A_dim\l_calc_B_dim\dim_set:Nn -} -\cs_new_nopar:Npn\calc_dim_gset:Nn{ - \calc_assign_generic:NNNNnn\c_one\g_calc_A_dim\l_calc_B_dim\dim_gset:Nn -} -\cs_new_nopar:Npn\calc_dim_add:Nn{ - \calc_assign_generic:NNNNnn\c_one\g_calc_A_dim\l_calc_B_dim\dim_add:Nn -} -\cs_new_nopar:Npn\calc_dim_gadd:Nn{ - \calc_assign_generic:NNNNnn\c_one\g_calc_A_dim\l_calc_B_dim\dim_gadd:Nn -} -\cs_new_nopar:Npn\calc_dim_sub:Nn{ - \calc_assign_generic:NNNNnn\c_one\g_calc_A_int\l_calc_B_int\dim_sub:Nn -} -\cs_new_nopar:Npn\calc_dim_gsub:Nn{ - \calc_assign_generic:NNNNnn\c_one\g_calc_A_int\l_calc_B_int\dim_gsub:Nn -} -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\calc_skip_set:Nn} -% \begin{macro}{\calc_skip_gset:Nn} -% \begin{macro}{\calc_skip_add:Nn} -% \begin{macro}{\calc_skip_gadd:Nn} -% \begin{macro}{\calc_skip_sub:Nn} -% \begin{macro}{\calc_skip_gsub:Nn} -% Skips. -% \begin{macrocode} -\cs_new_nopar:Npn\calc_skip_set:Nn{ - \calc_assign_generic:NNNNnn\c_two\g_calc_A_skip\l_calc_B_skip\skip_set:Nn -} -\cs_new_nopar:Npn\calc_skip_gset:Nn{ - \calc_assign_generic:NNNNnn\c_two\g_calc_A_skip\l_calc_B_skip\skip_gset:Nn -} -\cs_new_nopar:Npn\calc_skip_add:Nn{ - \calc_assign_generic:NNNNnn\c_two\g_calc_A_skip\l_calc_B_skip\skip_add:Nn -} -\cs_new_nopar:Npn\calc_skip_gadd:Nn{ - \calc_assign_generic:NNNNnn\c_two\g_calc_A_skip\l_calc_B_skip\skip_gadd:Nn -} -\cs_new_nopar:Npn\calc_skip_sub:Nn{ - \calc_assign_generic:NNNNnn\c_two\g_calc_A_skip\l_calc_B_skip\skip_sub:Nn -} -\cs_new_nopar:Npn\calc_skip_gsub:Nn{ - \calc_assign_generic:NNNNnn\c_two\g_calc_A_skip\l_calc_B_skip\skip_gsub:Nn -} -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\calc_muskip_set:Nn} -% \begin{macro}{\calc_muskip_gset:Nn} -% \begin{macro}{\calc_muskip_add:Nn} -% \begin{macro}{\calc_muskip_gadd:Nn} -% \begin{macro}{\calc_muskip_sub:Nn} -% \begin{macro}{\calc_muskip_gsub:Nn} -% Muskips. -% \begin{macrocode} -\cs_new_nopar:Npn\calc_muskip_set:Nn{ - \calc_assign_generic:NNNNnn\c_three\g_calc_A_muskip\l_calc_B_muskip - \muskip_set:Nn -} -\cs_new_nopar:Npn\calc_muskip_gset:Nn{ - \calc_assign_generic:NNNNnn\c_three\g_calc_A_muskip\l_calc_B_muskip - \muskip_gset:Nn -} -\cs_new_nopar:Npn\calc_muskip_add:Nn{ - \calc_assign_generic:NNNNnn\c_three\g_calc_A_muskip\l_calc_B_muskip - \muskip_add:Nn -} -\cs_new_nopar:Npn\calc_muskip_gadd:Nn{ - \calc_assign_generic:NNNNnn\c_three\g_calc_A_muskip\l_calc_B_muskip - \muskip_gadd:Nn -} -\cs_new_nopar:Npn\calc_muskip_sub:Nn{ - \calc_assign_generic:NNNNnn\c_three\g_calc_A_muskip\l_calc_B_muskip - \muskip_add:Nn -} -\cs_new_nopar:Npn\calc_muskip_gsub:Nn{ - \calc_assign_generic:NNNNnn\c_three\g_calc_A_muskip\l_calc_B_muskip - \muskip_gadd:Nn -} -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% -% -% \begin{macro}{\calc_pre_scan:N} -% In case we found one of the special operations, this should just -% be executed. -% \begin{macrocode} -\cs_new_nopar:Npn \calc_pre_scan:N #1{ - \if_meaning:w(#1 - \exp_after:wN\calc_open:w - \else: - \if_meaning:w \calc_textsize:Nn #1 - \else: - \if_meaning:w \calc_maxmin_operation:Nnn #1 - \else: -% \end{macrocode} -% |\calc_numeric:| uses a primitive assignment so doesn't care about -% these dangling |\fi:|s. -% \begin{macrocode} - \calc_numeric: - \fi: - \fi: - \fi: - #1} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\calc_open:w} -% \begin{macrocode} -\cs_new_nopar:Npn \calc_open:w({ - \group_begin:\group_execute_after:N\calc_init_B: - \group_begin:\group_execute_after:N\calc_init_B: - \calc_pre_scan:N -} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\calc_init_B:} -% \begin{macro}{\calc_numeric:} -% \begin{macro}{\calc_close:} -% \begin{macrocode} -\cs_new_nopar:Npn\calc_init_B:{\l_calc_B_register\g_calc_A_register} -\cs_new_nopar:Npn\calc_numeric:{ - \tex_afterassignment:D\calc_post_scan:N - \pref_global:D\g_calc_A_register -} -\cs_new_nopar:Npn\calc_close:{ - \group_end:\pref_global:D\g_calc_A_register\l_calc_B_register - \group_end:\pref_global:D\g_calc_A_register\l_calc_B_register - \calc_post_scan:N} -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\calc_post_scan:N} -% Look at what token we have and decide where to go. -% \begin{macrocode} -\cs_new_nopar:Npn\calc_post_scan:N#1{ - \if_meaning:w#1!\cs_set_eq:NN\calc_next:w\group_end: \else: - \if_meaning:w#1+\cs_set_eq:NN\calc_next:w\calc_add: \else: - \if_meaning:w#1-\cs_set_eq:NN\calc_next:w\calc_subtract: \else: - \if_meaning:w#1*\cs_set_eq:NN\calc_next:w\calc_multiply:N \else: - \if_meaning:w#1/\cs_set_eq:NN\calc_next:w\calc_divide:N \else: - \if_meaning:w#1)\cs_set_eq:NN\calc_next:w\calc_close: \else: - \if_meaning:w#1\scan_stop:\cs_set_eq:NN\calc_next:w\calc_post_scan:N - \else: -% \end{macrocode} -% If we get here, there is an error but let's also disable -% |\calc_next:w| since it is otherwise undefined. No need to give -% extra errors just for that. -% \begin{macrocode} - \cs_set_eq:NN \calc_next:w \prg_do_nothing: - \calc_error:N#1 - \fi: - \fi: - \fi: - \fi: - \fi: - \fi: - \fi: - \calc_next:w} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\calc_multiply:N} -% \begin{macro}{\calc_divide:N} -% The switches for multiplication and division. -% \begin{macrocode} -\cs_new_nopar:Npn \calc_multiply:N #1{ - \if_meaning:w \calc_maxmin_operation:Nnn #1 - \cs_set_eq:NN \calc_next:w \calc_maxmin_multiply: - \else: - \if_meaning:w \calc_ratio_multiply:nn #1 - \cs_set_eq:NN \calc_next:w \calc_ratio_multiply:nn - \else: - \if_meaning:w \calc_real_evaluate:nn #1 - \cs_set_eq:NN \calc_next:w \calc_real_multiply:n - \else: - \cs_set_nopar:Npn \calc_next:w{\calc_multiply: #1} - \fi: - \fi: - \fi: - \calc_next:w -} -\cs_new_nopar:Npn \calc_divide:N #1{ - \if_meaning:w \calc_maxmin_operation:Nnn #1 - \cs_set_eq:NN \calc_next:w \calc_maxmin_divide: - \else: - \if_meaning:w \calc_ratio_multiply:nn #1 - \cs_set_eq:NN \calc_next:w \calc_ratio_divide:nn - \else: - \if_meaning:w \calc_real_evaluate:nn #1 - \cs_set_eq:NN \calc_next:w \calc_real_divide:n - \else: - \cs_set_nopar:Npn \calc_next:w{\calc_divide: #1} - \fi: - \fi: - \fi: - \calc_next:w -} -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\calc_generic_add_or_subtract:N} -% \begin{macro}{\calc_add:} -% \begin{macro}{\calc_subtract:} -% \begin{macro}{\calc_add_A_to_B:} -% \begin{macro}{\calc_subtract_A_from_B:} -% Here is how we add and subtract. -% \begin{macrocode} -\cs_new_nopar:Npn\calc_generic_add_or_subtract:N#1{ - \group_end: - \pref_global:D\g_calc_A_register\l_calc_B_register\group_end: - \group_begin:\group_execute_after:N#1\group_begin: - \group_execute_after:N\calc_init_B: - \calc_pre_scan:N} -\cs_new_nopar:Npn\calc_add:{\calc_generic_add_or_subtract:N\calc_add_A_to_B:} -\cs_new_nopar:Npn\calc_subtract:{ - \calc_generic_add_or_subtract:N\calc_subtract_A_from_B:} -% \end{macrocode} -% Don't use |\tex_advance:D| since it allows overflows. -% \begin{macrocode} -\cs_new_nopar:Npn\calc_add_A_to_B:{ - \l_calc_B_register - \if_case:w\l_calc_current_type_int - \etex_numexpr:D\or: - \etex_dimexpr:D\or: - \etex_glueexpr:D\or: - \etex_muexpr:D\fi: - \l_calc_B_register + \g_calc_A_register\scan_stop: -} -\cs_new_nopar:Npn\calc_subtract_A_from_B:{ - \l_calc_B_register - \if_case:w\l_calc_current_type_int - \etex_numexpr:D\or: - \etex_dimexpr:D\or: - \etex_glueexpr:D\or: - \etex_muexpr:D\fi: - \l_calc_B_register - \g_calc_A_register\scan_stop: -} -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\calc_generic_multiply_or_divide:N} -% \begin{macro}{\calc_multiply_B_by_A:} -% \begin{macro}{\calc_divide_B_by_A:} -% \begin{macro}{\calc_multiply:} -% \begin{macro}{\calc_divide:} -% And here is how we multiply and divide. Note that we do not use the -% primitive \TeX{} operations but the expandable operations provided -% by \eTeX. This means that all results are rounded not truncated! -% \begin{macrocode} -\cs_new_nopar:Npn\calc_generic_multiply_or_divide:N#1{ - \group_end: - \group_begin: - \cs_set_eq:NN\g_calc_A_register\g_calc_A_int - \cs_set_eq:NN\l_calc_B_register\l_calc_B_int - \int_zero:N \l_calc_current_type_int - \group_execute_after:N#1\calc_pre_scan:N -} -\cs_new_nopar:Npn\calc_multiply_B_by_A:{ - \l_calc_B_register - \if_case:w\l_calc_current_type_int - \etex_numexpr:D\or: - \etex_dimexpr:D\or: - \etex_glueexpr:D\or: - \etex_muexpr:D\fi: - \l_calc_B_register*\g_calc_A_int\scan_stop: -} -\cs_new_nopar:Npn\calc_divide_B_by_A:{ - \l_calc_B_register - \if_case:w\l_calc_current_type_int - \etex_numexpr:D\or: - \etex_dimexpr:D\or: - \etex_glueexpr:D\or: - \etex_muexpr:D\fi: - \l_calc_B_register/\g_calc_A_int\scan_stop: -} -\cs_new_nopar:Npn\calc_multiply:{ - \calc_generic_multiply_or_divide:N\calc_multiply_B_by_A:} -\cs_new_nopar:Npn\calc_divide:{ - \calc_generic_multiply_or_divide:N\calc_divide_B_by_A:} -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\calc_calculate_box_size:nnn} -% \begin{macro}[aux]{\calc_calculate_box_size_aux:n} -% Put something in a box and measure it. |#1| is a list of -% |\box_ht:N| etc., |#2| should be |\dim_set:Nn|\meta{dim register} -% or |\dim_gset:Nn|\meta{dim register} and |#3| is the contents. -% \begin{macrocode} -\cs_new:Npn \calc_calculate_box_size:nnn #1#2#3{ - \hbox_set:Nn \l_tmpa_box {{#3}} - #2{\c_zero_dim \tl_map_function:nN{#1}\calc_calculate_box_size_aux:n} -} -% \end{macrocode} -% Helper for calculating the final dimension. -% \begin{macrocode} -\cs_set_nopar:Npn \calc_calculate_box_size_aux:n#1{ + #1\l_tmpa_box} -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% -% \begin{macro}{\calc_textsize:Nn} -% Now we can define |\calc_textsize:Nn|. -% \begin{macrocode} -\cs_set_protected:Npn \calc_textsize:Nn#1#2{ - \group_begin: - \cs_set_eq:NN\calc_widthof_aux:n\box_wd:N - \cs_set_eq:NN\calc_heightof_aux:n\box_ht:N - \cs_set_eq:NN\calc_depthof_aux:n\box_dp:N - \cs_set_nopar:Npn\calc_totalheightof_aux:n{\box_ht:N\box_dp:N} - \exp_args:No\calc_calculate_box_size:nnn{#1} - {\dim_gset:Nn\g_calc_A_register} -% \end{macrocode} -% Restore the four user commands here since there might be a recursive -% call. -% \begin{macrocode} - { - \cs_set_eq:NN \calc_depthof_aux:n \calc_depthof_auxi:n - \cs_set_eq:NN \calc_widthof_aux:n \calc_widthof_auxi:n - \cs_set_eq:NN \calc_heightof_aux:n \calc_heightof_auxi:n - \cs_set_eq:NN \calc_totalheightof_aux:n \calc_totalheightof_auxi:n - #2 - } - \group_end: - \calc_post_scan:N -} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\calc_ratio_multiply:nn} -% \begin{macro}{\calc_ratio_divide:nn} -% Evaluate a ratio. If we were already evaluation a \meta{muskip} -% register, the ratio is probably also done with this type and we'll -% have to convert them to regular points. -% \begin{macrocode} -\cs_set_protected:Npn\calc_ratio_multiply:nn#1#2{ - \group_end:\group_begin: - \if_num:w\l_calc_current_type_int < \c_three - \calc_dim_set:Nn\l_calc_B_int{#1} - \calc_dim_set:Nn\l_calc_C_int{#2} - \else: - \calc_dim_muskip:Nn{\l_calc_B_int\etex_mutoglue:D}{#1} - \calc_dim_muskip:Nn{\l_calc_C_int\etex_mutoglue:D}{#2} - \fi: -% \end{macrocode} -% Then store the ratio as a fraction, which we just pass on. -% \begin{macrocode} - \cs_gset_nopar:Npx\calc_calculated_ratio:{ - \int_use:N\l_calc_B_int/\int_use:N\l_calc_C_int - } - \group_end: -% \end{macrocode} -% Here we set the new value of |\l_calc_B_register| and remember to -% evaluate it as the correct type. Note that the intermediate -% calculation is a scaled operation (meaning the intermediate value is -% 64-bit) so we don't get into trouble when first multiplying by a -% large number and then dividing. -% \begin{macrocode} - \l_calc_B_register - \if_case:w\l_calc_current_type_int - \etex_numexpr:D\or: - \etex_dimexpr:D\or: - \etex_glueexpr:D\or: - \etex_muexpr:D\fi: - \l_calc_B_register*\calc_calculated_ratio:\scan_stop: - \group_begin: - \calc_post_scan:N} -% \end{macrocode} -% Division is just flipping the arguments around. -% \begin{macrocode} -\cs_new:Npn \calc_ratio_divide:nn#1#2{\calc_ratio_multiply:nn{#2}{#1}} -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\calc_real_evaluate:nn} -% \begin{macro}{\calc_real_multiply:n} -% \begin{macro}{\calc_real_divide:n} -% Although we could define the |\real| function as a subcase of -% |\ratio|, this is horribly inefficient since we just want to convert -% the decimal to a fraction. -% \begin{macrocode} -\cs_new_protected_nopar:Npn\calc_real_evaluate:nn #1#2{ - \group_end: - \l_calc_B_register - \if_case:w\l_calc_current_type_int - \etex_numexpr:D\or: - \etex_dimexpr:D\or: - \etex_glueexpr:D\or: - \etex_muexpr:D\fi: - \l_calc_B_register * - \tex_number:D \dim_eval:n{#1pt}/ - \tex_number:D\dim_eval:n{#2pt} - \scan_stop: - \group_begin: - \calc_post_scan:N} -\cs_new_nopar:Npn \calc_real_multiply:n #1{\calc_real_evaluate:nn{#1}{1}} -\cs_new_nopar:Npn \calc_real_divide:n {\calc_real_evaluate:nn{1}} -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\calc_maxmin_operation:Nnn} -% \begin{macro}{\calc_maxmin_generic:Nnn} -% \begin{macro}{\calc_maxmin_div_or_mul:NNnn} -% \begin{macro}{\calc_maxmin_multiply:} -% \begin{macro}{\calc_maxmin_multiply:} -% The max and min functions. -% \begin{macrocode} -\cs_set_protected:Npn\calc_maxmin_operation:Nnn#1#2#3{ - \group_begin: - \calc_maxmin_generic:Nnn#1{#2}{#3} - \group_end: - \calc_post_scan:N -} -% \end{macrocode} -% |#1| is either |>| or |<| and was expanded into this initially. -% \begin{macrocode} -\cs_new_protected:Npn \calc_maxmin_generic:Nnn#1#2#3{ - \group_begin: - \if_case:w\l_calc_current_type_int - \calc_int_set:Nn\l_calc_C_int{#2}% - \calc_int_set:Nn\l_calc_B_int{#3}% - \pref_global:D\g_calc_A_register - \if_num:w\l_calc_C_int#1\l_calc_B_int - \l_calc_C_int\else:\l_calc_B_int\fi: - \or: - \calc_dim_set:Nn\l_calc_C_dim{#2}% - \calc_dim_set:Nn\l_calc_B_dim{#3}% - \pref_global:D\g_calc_A_register - \if_dim:w\l_calc_C_dim#1\l_calc_B_dim - \l_calc_C_dim\else:\l_calc_B_dim\fi: - \or: - \calc_skip_set:Nn\l_calc_C_skip{#2}% - \calc_skip_set:Nn\l_calc_B_skip{#3}% - \pref_global:D\g_calc_A_register - \if_dim:w\l_calc_C_skip#1\l_calc_B_skip - \l_calc_C_skip\else:\l_calc_B_skip\fi: - \else: - \calc_muskip_set:Nn\l_calc_C_muskip{#2}% - \calc_muskip_set:Nn\l_calc_B_muskip{#3}% - \pref_global:D\g_calc_A_register - \if_dim:w\l_calc_C_muskip#1\l_calc_B_muskip - \l_calc_C_muskip\else:\l_calc_B_muskip\fi: - \fi: - \group_end: -} -\cs_new:Npn\calc_maxmin_div_or_mul:NNnn#1#2#3#4{ - \group_end: - \group_begin: - \int_zero:N\l_calc_current_type_int - \group_execute_after:N#1 - \calc_maxmin_generic:Nnn#2{#3}{#4} - \group_end: - \group_begin: - \calc_post_scan:N -} -\cs_new_nopar:Npn\calc_maxmin_multiply:{ - \calc_maxmin_div_or_mul:NNnn\calc_multiply_B_by_A:} -\cs_new_nopar:Npn\calc_maxmin_divide: { - \calc_maxmin_div_or_mul:NNnn\calc_divide_B_by_A:} -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\calc_error:N} -% The error message. -% \begin{macrocode} -\cs_new_nopar:Npn\calc_error:N#1{ - \PackageError{calc} - {`\token_to_str:N#1'~ invalid~ at~ this~ point} - {I~ expected~ to~ see~ one~ of:~ +~ -~ *~ /~ )} -} -% \end{macrocode} -% \end{macro} -% -% \subsection{Higher level commands} -% -% The various operations allowed. -% -% \begin{macro}{\calc_maxof:nn} -% \begin{macro}{\calc_minof:nn} -% \begin{macro}{\maxof} -% \begin{macro}{\minof} -% Max and min operations -% \begin{macrocode} -\cs_new:Npn \calc_maxof:nn#1#2{ - \calc_maxmin_operation:Nnn > \exp_not:n{{#1}{#2}} -} -\cs_new:Npn \calc_minof:nn#1#2{ - \calc_maxmin_operation:Nnn < \exp_not:n{{#1}{#2}} -} -\cs_set_eq:NN \maxof \calc_maxof:nn -\cs_set_eq:NN \minof \calc_minof:nn -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\calc_widthof:n} -% \begin{macro}[aux]{\calc_widthof_aux:n} -% \begin{macro}[aux]{\calc_widthof_auxi:n} -% \begin{macro}{\calc_heightof:n} -% \begin{macro}[aux]{\calc_heightof_aux:n} -% \begin{macro}[aux]{\calc_heightof_auxi:n} -% \begin{macro}{\calc_depthof:n} -% \begin{macro}[aux]{\calc_depthof_aux:n} -% \begin{macro}[aux]{\calc_depthof_auxi:n} -% \begin{macro}{\calc_totalheightof:n} -% \begin{macro}[aux]{\calc_totalheightof_aux:n} -% \begin{macro}[aux]{\calc_totalheightof_auxi:n} -% Text dimension commands. -% \begin{macrocode} -\cs_new:Npn \calc_widthof:n#1{ - \calc_textsize:Nn \exp_not:N\calc_widthof_aux:n\exp_not:n{{#1}} -} -\cs_new:Npn \calc_heightof:n#1{ - \calc_textsize:Nn \exp_not:N\calc_heightof_aux:n\exp_not:n{{#1}} -} -\cs_new:Npn \calc_depthof:n#1{ - \calc_textsize:Nn \exp_not:N\calc_depthof_aux:n\exp_not:n{{#1}} -} -\cs_new:Npn \calc_totalheightof:n#1{ - \calc_textsize:Nn \exp_not:N\calc_totalheightof_aux:n \exp_not:n{{#1}} -} -\cs_new:Npn \calc_widthof_aux:n #1{ - \exp_not:N\calc_widthof_aux:n\exp_not:n{{#1}} -} -\cs_new_eq:NN \calc_widthof_auxi:n \calc_widthof_aux:n -\cs_new:Npn \calc_depthof_aux:n #1{ - \exp_not:N\calc_depthof_aux:n\exp_not:n{{#1}} -} -\cs_new_eq:NN \calc_depthof_auxi:n \calc_depthof_aux:n -\cs_new:Npn \calc_heightof_aux:n #1{ - \exp_not:N\calc_heightof_aux:n\exp_not:n{{#1}} -} -\cs_new_eq:NN \calc_heightof_auxi:n \calc_heightof_aux:n -\cs_new:Npn \calc_totalheightof_aux:n #1{ - \exp_not:N\calc_totalheightof_aux:n\exp_not:n{{#1}} -} -\cs_new_eq:NN \calc_totalheightof_auxi:n \calc_totalheightof_aux:n -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\calc_ratio:nn} -% \begin{macro}{\calc_real:n} -% Ratio and real. -% \begin{macrocode} -\cs_new:Npn \calc_ratio:nn#1#2{ - \calc_ratio_multiply:nn\exp_not:n{{#1}{#2}}} -\cs_new_nopar:Npn \calc_real:n {\calc_real_evaluate:nn} -% \end{macrocode} -% We can implement real and ratio without actually using these -% names. We'll see. -% \begin{macrocode} -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\widthof} -% \begin{macro}{\heightof} -% \begin{macro}{\depthof} -% \begin{macro}{\totalheightof} -% \begin{macro}{\ratio} -% \begin{macro}{\real} -% User commands. -% \begin{macrocode} -\cs_set_eq:NN \depthof\calc_depthof:n -\cs_set_eq:NN \widthof\calc_widthof:n -\cs_set_eq:NN \heightof\calc_heightof:n -\cs_set_eq:NN \totalheightof\calc_totalheightof:n -%%\cs_set_eq:NN \ratio\calc_ratio:nn -%%\cs_set_eq:NN \real\calc_real:n -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\setlength} -% \begin{macro}{\gsetlength} -% \begin{macro}{\addtolength} -% \begin{macro}{\gaddtolength} -% \begin{macrocode} -\cs_set_protected_nopar:Npn \setlength{\calc_skip_set:Nn} -\cs_set_protected_nopar:Npn \gsetlength{\calc_skip_gset:Nn} -\cs_set_protected_nopar:Npn \addtolength{\calc_skip_add:Nn} -\cs_set_protected_nopar:Npn \gaddtolength{\calc_skip_gadd:Nn} -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\calc_setcounter:nn} -% \begin{macro}{\calc_addtocounter:nn} -% \begin{macro}{\calc_stepcounter:n} -% \begin{macro}{\setcounter} -% \begin{macro}{\addtocounter} -% \begin{macro}{\stepcounter} -% \begin{macro}{\calc_chk_document_counter:nn} -% Document commands for \LaTeXe\ counters. Also add support for -% \textsf{amstext}. Note that when \textsf{l3breqn} is used, -% |\mathchoice| will no longer need this switch as the argument is -% only executed once. -% \begin{macrocode} -%</initex|package> -%<*package> -\newif\iffirstchoice@ \firstchoice@true -%</package> -%<*initex|package> -\cs_set_protected_nopar:Npn \calc_setcounter:nn#1#2{ - \calc_chk_document_counter:nn{#1}{ - \exp_args:Nc\calc_int_gset:Nn {c@#1}{#2} - } -} -\cs_set_protected_nopar:Npn \calc_addtocounter:nn#1#2{ -%</initex|package> -%<*package> - \iffirstchoice@ -%</package> -%<*initex|package> - \calc_chk_document_counter:nn{#1}{ - \exp_args:Nc\calc_int_gadd:Nn {c@#1}{#2} - } -%</initex|package> -%<*package> - \fi: -%</package> -%<*initex|package> -} -\cs_set_protected_nopar:Npn \calc_stepcounter:n#1{ -%</initex|package> -%<*package> - \iffirstchoice@ -%</package> -%<*initex|package> - \calc_chk_document_counter:nn{#1}{ - \int_gincr:c {c@#1} - \group_begin: - \cs_set_eq:NN \@elt\@stpelt \use:c{cl@#1} - \group_end: - } -%</initex|package> -%<*package> - \fi: -%</package> -%<*initex|package> -} -\cs_new_nopar:Npn \calc_chk_document_counter:nn#1{ - \cs_if_free:cTF{c@#1}{\@nocounterr {#1}} -} -\cs_set_eq:NN \setcounter \calc_setcounter:nn -\cs_set_eq:NN \addtocounter \calc_addtocounter:nn -\cs_set_eq:NN \stepcounter \calc_stepcounter:n -%</initex|package> -%<*package> -\AtBeginDocument{ - \cs_set_eq:NN \setcounter \calc_setcounter:nn - \cs_set_eq:NN \addtocounter \calc_addtocounter:nn - \cs_set_eq:NN \stepcounter \calc_stepcounter:n -} -% \end{macrocode} -% Prevent the usual \textsf{calc} from loading. -% \begin{macrocode} -\cs_set_nopar:cpn{ver@calc.sty}{2005/08/06} -%</package> -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% -% -% \end{implementation} -% \PrintIndex -% -% \endinput |