% \iffalse meta-comment
%
% Copyright (C) 2018-2021 by F. Pantigny
% -----------------------------------
%
% This file may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% of this license or (at your option) any later version.
% The latest version of this license is in:
%
% http://www.latex-project.org/lppl.txt
%
% and version 1.3 or later is part of all distributions of LaTeX
% version 2005/12/01 or later.
%
% \fi
% \iffalse
\def\myfileversion{1.2}
\def\myfiledate{2021/08/23}
%
%
%<*batchfile>
\begingroup
\input l3docstrip.tex
\keepsilent
\usedir{tex/latex/cascade}
\preamble

Copyright (C) 2018-2021 by F. Pantigny
-----------------------------------

This file may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either version 1.3
of this license or (at your option) any later version.
The latest version of this license is in:

http://www.latex-project.org/lppl.txt

and version 1.3 or later is part of all distributions of LaTeX
version 2005/12/01 or later.

\endpreamble
\askforoverwritefalse
\endgroup
%</batchfile>
%
%<@@=cascade>
%<*driver>
\documentclass[dvipsnames]{l3doc}% option dvipsnames is for xcolor (loaded by tikz)
\usepackage{xltxtra}
\usepackage{geometry}
\geometry{left=2.8cm,right=2.8cm,top=2.5cm,bottom=2.5cm,papersize={21cm,29.7cm}}
\setlength{\fboxsep}{0pt}
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{cascade}
\hfuzz=5cm
\def\interitem{\vskip 7mm plus 2 mm minus 3mm}          
\def\emphase{\bgroup\color{RoyalPurple}\let\next=}
\fvset{commandchars=\~\#\@,formatcom={\color{gray}}}
\parindent 0pt
\skip\footins = 2\bigskipamount


\EnableCrossrefs
\makeatletter
\ExplSyntaxOn
\DoNotIndex{\begin,\end}
\DoNotIndex{\c@iRow,\c@jCol,\theiRow,\thejCol}
\DoNotIndex{\pgfpicture,\endpgfpicture,\tikzpicture,\endtikzpicture}
\DoNotIndex{\pgfpoint,\pgfnode,\pgfnodealias,\pgfcoordinate}
\DoNotIndex{\pgf@x,\pgf@y}
\DoNotIndex{\int_add:Nn,\int_case:nnTF,\int_compare:nNnTF,\int_compare:nTF,
  \int_compare_p:nNn,\int_decr:N,\int_eval:n,\int_add:Nn,\int_gdecr:N,\int_gincr:N
  \int_gset:Nn,\int_gset_eq:NN,\int_gzero:N,\int_gzero_new:N,\int_if_odd:nTF,
  \int_max:nn,\int_new:N,\int_set:Nn,\int_set_eq:NN,\int_step_inline:nnn,
  \int_step_variable:nNn,\int_step_variable:nnNn,\int_sub:Nn,\int_use:N,\int_zero:N,
  \int_zero_new:N,\g_tmpa_int,\l_tmpa_int,\l_tmpb_int
}
\DoNotIndex{\dim_abs:n,\dim_add:Nn,\dim_compare:nNnTF,\dim_compare_p:nNn,
\dim_const:Nn,\dim_eval:n,\dim_gadd:Nn,\dim_gset:Nn,\dim_gset_eq:NN,
\dim_gset:Nn,\dim_gset_eq:NN,\dim_gsub:Nn,\dim_gzero_new:N,\dim_max:nn,
\dim_min:nn,\dim_new:N,\dim_ration:nn,\dim_set:Nn,\dim_set_eq:NN,\dim_sub:Nn,
\dim_use:N,\dim_zero:N,\dim_zero_new:N,\g_tmpa_dim,\l_tmpa_dim,\l_tmpb_dim,
\c_zero_dim}
\DoNotIndex{\cs_new_protected:Npn,\cs_new:Npn,\cs_set_eq:NN,
\cs_set_protected:Npn}
\DoNotIndex{\bool_if:NTF,\bool_new:N,\bool_set_false:N,\bool_set_true:N,\l_tmpa_bool}
\DoNotIndex{\group_begin:,\group_end:,\c_math_toggle_token}
\DoNotIndex{\tl_set:Nn,\l_tmpa_tl}
\ExplSyntaxOff
\makeatother


\begin{document}
\DocInput{cascade.dtx}
\end{document}
%</driver>
% \fi
% \title{The package \pkg{cascade}\thanks{This document corresponds to the
% version~\myfileversion\space of \pkg{cascade}, at the date of~\myfiledate.}} 
% \author{F. Pantigny \\ \texttt{fpantigny@wanadoo.fr}}
%
% \maketitle
%
% \begin{abstract}
% The LaTeX package \pkg{cascade} provides a command |\Cascade| to do
% constructions to present mathematical demonstrations with successive braces
% for the deductions. The package \pkg{cascade} provides also a command
% |\Edacsac| which creates similar structures but with
% braces going backwards.
% \end{abstract}
% 
%
%
% \vspace{1cm}
% \section{The command \textbackslash Cascade}
%
% The package \pkg{cascade} provides a command |\Cascade| which allows
% constructions like the following where the size of the right brace is computed
% on only a part of the LaTeX elements composed on the left.
% \begin{center}
% \Cascade{$\det(A) = \begin{vmatrix}3&4\\ -1&7\end{vmatrix}\neq 0$}
%         {and, therefore, $A$ is inversible}
%         {}
%         {yet $AX=Y$} 
% hence, $X = A^{-1}Y$
% \end{center}
%         
% \medskip
% \begin{Verbatim}
% ~emphase#\Cascade@{$\det(A) = \begin{vmatrix}3&4\\ -1&7\end{vmatrix}\neq 0$}
%         {and, therefore, $A$ is inversible}
%         {}
%         {yet $AX=Y$} 
% hence, $X = A^{-1}Y$
% \end{Verbatim}
% 
%
% \interitem
% The command |\Cascade| takes its four arguments as follow :
% \begin{center}
% \Cascade{\fbox{\hbox to 2cm{\vrule height 18 pt depth 5 pt width 0pt\hfil \texttt{\#1}\hfil}}}%
% {\fbox{\hbox to 3cm{\vrule height 10 pt depth 12 pt width 0pt\hfil \texttt{\#2}\hfil}}}%
% {\fbox{\hbox to 2.5cm{\vrule height 15 pt depth 14 pt width 0pt\hfil \texttt{\#3}\hfil}}}%
% {\fbox{\hbox to 1.7cm{\vrule height 12 pt depth 5 pt width 0pt\hfil \texttt{\#4}\hfil}}}
% \end{center}
% 
% \interitem
% The commands |\Cascade| can be nested as in the following example :
% \begin{center}
% \Cascade{\ShortCascade{$(BH) \perp (AC)$}{$(OC) \perp (AC)$}}
%         {hence\enskip $(BH) \parallel (OC)$}
%         {\ShortCascade{$(CH) \perp (AB)$}{$(OB) \perp (AB)$}}
%         {hence\enskip $(CH) \parallel (OB)$}
% hence $(OBHC)$ is a parallelogram
% \end{center}
% 
% \interitem
% For the lisibility of such constructions, a simplified version of |\Cascade|
% is available, named |\ShortCascade|.  
%
% The code |\ShortCascade{X}{Y}| is merely a shortcut for the code
% |\Cascade{}{X}{}{Y}|.
%
% \medskip
% The preceding example can be coded with two commands |\ShortCascade| and an
% encompassing command |\Cascade|: 
% \begin{Verbatim}
% ~emphase#\Cascade@{~emphase#\ShortCascade@{$(BH) \perp (AC)$}
%                       {$(OC) \perp (AC)$}}
%         {hence\enskip $(BH) \parallel (OC)$}
%         {~emphase#\ShortCascade@{$(CH) \perp (AB)$}
%                       {$(OB) \perp (AB)$}}
%         {hence\enskip $(CH) \parallel (OB)$}
% hence $(OBHC)$ is a parallelogram
% \end{Verbatim}
% 
%
% \bigskip
% \section{The option t}
%
% With the option |t| in the encompassing command |\Cascade|, a whole strucutre
% of nested commands |\Cascade| is aligned on the top line.
%
% When the key |t| is used, if we wish to add some text after the structure, we
% have to put that text between angle brackets in order to have that text
% aligned with the last brace.
%
% \begin{Verbatim}
% \begin{enumerate}
% \item \Cascade~emphase#[t]@{\ShortCascade{$(BH) \perp (AC)$}{$(OC) \perp (AC)$}}
%         {hence\enskip $(BH) \parallel (OC)$}
%         {\Cascade{}{$(CH) \perp (AB)$}{}{$(OB) \perp (AB)$}}
%         {hence\enskip $(CH) \parallel (OB)$}
%         ~emphase#<hence $(OBHC)$ is a parallelogram>@
% \end{enumerate}
% \end{Verbatim}
% 
% 
% \begin{enumerate}
% \item \Cascade[t]{\ShortCascade{$(BH) \perp (AC)$}{$(OC) \perp (AC)$}}
%         {hence\enskip $(BH) \parallel (OC)$}
%         {\Cascade{}{$(CH) \perp (AB)$}{}{$(OB) \perp (AB)$}}
%         {hence\enskip $(CH) \parallel (OB)$}
%         <hence $(OBHC)$ is a parallelogram>
% \end{enumerate}
%
%
%
% \bigskip
% \section{Other options}
%
% \begin{itemize}
% \item The option |space-between| is a TeX dimension described on the following
% figure. Its initial value is $0.5$~em. It applies to the current command
% |\Cascade| but also to the possible nested commands.
%
% \item The option |interline| can be used to \emph{increase} the ``interline''
% showed in the following picture. The initial value of |interline| is $0$~pt
% and applies only to the current command |\Cascade|.
%
% \item The option |interline-all| changes the default value of |interline| used
% by the current command |\Cascade| and all the possible nested commands
% |\Cascade|.
% \end{itemize}
% 
% \vspace{1cm}
%
% \begin{center}
% \Cascade{\fbox{\hbox to 2cm{\vrule height 18 pt depth 5 pt width 0pt\hfil \texttt{\#1}\hfil
%                             \tikz[remember picture] \coordinate (one) at (0,0) ;}}}%
% {\fbox{\vtop{\hbox to 3cm{\tikz[remember picture] \coordinate (two) at (0,0) ;
%                           \vrule height 10 pt depth 12 pt width 0pt\hfil \texttt{\#2}\hfil}
%              \hbox{\tikz[remember picture] \coordinate (three) at (0,0) ;}}}}%
% {\fbox{\vbox{\hbox{\tikz[remember picture] \coordinate (four) at (0,0) ;}%
%              \hbox to 2.5cm{\vrule height 15 pt depth 14 pt width 0pt\hfil \texttt{\#3}\hfil}}}}%
% {\fbox{\hbox to 1.7cm{\vrule height 12 pt depth 5 pt width 0pt\hfil \texttt{\#4}\hfil}}}
% \begin{tikzpicture}[remember picture,overlay,blue]
% \draw (one) to ++(0,1cm) coordinate (A) to ++(0,2mm) ;
% \draw (two) to ++(0,1cm) coordinate (B) to ++(0,2mm) ;
% \draw (A) -- (B) ;
% \draw[<-] (A) -- ++(-1mm,0) ;
% \draw[<-] (B) -- ++(1mm,0) ;
% \path (B) node [right=2mm] {\texttt{space-between}} ;
% \draw (three) to ++(-3cm,0) coordinate (C) to ++(-2mm,0) ;
% \draw (four) -| coordinate (D) (C) ; 
% \draw (D) to ++(-2mm,0) ;
% \draw[<-] (C) -- ++(0,1mm) ;
% \draw[<-] (D) -- ++(0,-1mm) ; 
% \path ($(C)!0.5!(D)$) node [left=2mm] {the ``interline''} ;
% \end{tikzpicture}
% \end{center}
% 
% \begin{Verbatim}
% \Cascade[~emphase#interline=4mm@]{\ShortCascade{A}{B}}{E}{\ShortCascade{C}{D}}{F} G
% \end{Verbatim}
% 
% \begin{center}
% \Cascade[interline=4mm]{\ShortCascade{A}{B}}{E}{\ShortCascade{C}{D}}{F} G
% \end{center}
%
% \bigskip
% \begin{Verbatim}
% \Cascade[~emphase#interline-all=4mm@]{\ShortCascade{A}{B}}{E}{\ShortCascade{C}{D}}{F} G
% \end{Verbatim}
% 
% \begin{center}
% \Cascade[interline-all=4mm]{\ShortCascade{A}{B}}{E}{\ShortCascade{C}{D}}{F} G
% \end{center}
%
% \interitem
% The options can also be given at the document level with the command
% |\CascadeOptions|. In this case, the scope of the declarations is the current
% TeX group (these declarations are ``semi-global'').
% 
% \bigskip
% \section{The command \textbackslash Edacsac}
%
% The command |\Edacsac| (\textsl{cascade} written in reverse) is similar to the
% command |\Cascade| but with braces going backwards. The key |t| is not available in that command.
% 
% \begin{Verbatim}
% Singularity 
% ~emphase#\Edacsac@
%   {elementary}
%     {
%       ~emphase#\Edacsac@
%         {non-degenerate elementary}
%           {~emphase#\ShortEdacsac@{hyperbolic}{non-hyperbolic}}
%         {degenerate elementary}
%           {}
%       }
%   {non-elementary}
%     {~emphase#\ShortEdacsac@{Nilpotent}{Higher order}}
% \end{Verbatim}
%
%
% Singularity 
% \Edacsac
%   {elementary}
%   {
%     \Edacsac
%       {non-degenerate elementary}
%       {\ShortEdacsac{hyperbolic}{non-hyperbolic}}
%       {degenerate elementary}
%       {}
%     }
%   {non-elementary}
%   {\ShortEdacsac{nilpotent}{higher order}}
%
% 
% 
% \bigskip
% \section{Technical remark}
% 
% The package \pkg{cascade} is designed to provide by default results similar to
% the those given by the environments of \pkg{amsmath} --- and \pkg{mathtools}
% --- especially |{aligned}|.
% 
% \bigskip
% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
% \[\left.\begin{aligned}
% & A = \sqrt{a^2+b^2} \\
% & B = \frac{ax+b}{cx+d}
% \end{aligned}\right\}\]
% \end{BVerbatim}
% $\left.\begin{aligned}
% & A = \sqrt{a^2+b^2} \\
% & B = \frac{ax+b}{cx+d}
% \end{aligned}\right\}$
% 
% \bigskip
% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
% \ShortCascade{$\displaystyle A = \sqrt{a^2+b^2}$}
%              {$B = \dfrac{ax+b}{cx+d}$}
% \end{BVerbatim}
% \ShortCascade{$\displaystyle A = \sqrt{a^2+b^2}$}{$B = \dfrac{ax+b}{cx+d}$}
% 
% \interitem
% The package \pkg{cascade} constructs the braces with the classical pair
% |\left|-|\right| of TeX. However, the extensible delimiters, in TeX, cannot
% take all sizes. We give, in the following example, the braces obtained when
% surrounding vertical rules from $6$~mm to $17$~mm (the code uses the L3
% programming layer).
%
% \begin{Verbatim}
% \int_step_inline:nnnn 6 1 {17} { $\left.\hbox{\vrule height ~#1 mm}\right\}$\quad }
% \end{Verbatim}
%
% \medskip
% \begin{center}
% \ExplSyntaxOn
% \int_step_inline:nnnn 6 1 {17} { $\left.\hbox{\vrule height #1 mm}\right\}$\quad}
% \ExplSyntaxOff
% \end{center}
% 
%
% \newgeometry{left=4cm}
%
% \section{Implementation}
%
%    \begin{macrocode}
\RequirePackage{l3keys2e}
\ProvidesExplPackage
  {cascade}
  {\myfiledate}
  {\myfileversion}
  {Easy presentation of demonstrations in cascades}
%    \end{macrocode}
% 
% 
% \interitem
% \iffalse
%%
%% The following macro is the same as the macro of amsmath
% \fi
% \DescribeMacro{\spread@equation}
% We will use the command |\spread@equation| of \pkg{amsmath} to increase the
% interline in the commands |\Cascade|. When used, this command becomes no-op
% (in the current TeX group). 
% 
% Nevertheless, we want the extension \pkg{cascade} available without
% \pkg{amsmath}. That's why we give a definition of |\spread@equation| (this
% definition will be loaded only if \pkg{amsmath} --- or \pkg{mathtools} --- has
% not been loaded yet).
%    \begin{macrocode}
\cs_if_free:NT \spread@equation
  { 
    \cs_set_protected:Npn \spread@equation
      { 
        \openup \jot   
        \cs_set_protected:Npn \spread@equation { } 
      }
  }
%    \end{macrocode}
% Don't put |\cs_set_eq:NN \spread@equation \prog_do_nothing:| in the last line
% because this would raise errors with nested environments.
%
%
% \iffalse
%%
%% The following registers will be used for the options.
% \fi
% \interitem
% The dimension |\l_@@_interline_dim| will be the value of the vertical space
% added between the two boxes connected by the brace.
%    \begin{macrocode}
\dim_new:N \l_@@_interline_dim
%    \end{macrocode}
% 
% \medskip 
% The dimension |\l_@@_interline_all_dim| is the default value of
% |\l_@@_interline_dim|. This default value can be modified with the option
% |interline-all|. Therefore, when modified in the options of a command
% |\Cascade|, this value will affect all the possible nested commands.
%    \begin{macrocode}
\dim_new:N \l_@@_interline_all_dim
%    \end{macrocode}
% 
% \medskip
% The dimension |\l_@@_space_between_dim| is the horizontal space inserted
% between the two elements of the same row of the construction.
%    \begin{macrocode}
\dim_new:N \l_@@_space_between_dim
\dim_set:Nn \l_@@_space_between_dim { 0.5 em }
%    \end{macrocode}
%
% \medskip
%    \begin{macrocode}
\bool_new:N \l_@@_t_bool
\bool_new:N \l_@@_main_command_bool
\bool_new:N \l_@@_nested_command_bool
\bool_new:N \l_@@_first_argument_bool 
%    \end{macrocode}
% 
% \interitem
% \iffalse
%%
%% This set of options will be used by \Cascade and \ShortCascade
% \fi
% The set of keys |cascade/command| will be used by the command |\Cascade|.
%    \begin{macrocode}
\keys_define:nn { cascade / command }
  {
%    \end{macrocode}
% The key |t| means that the command |\Cascade| will be aligned upwards.
%    \begin{macrocode}
    t .code:n = 
      \bool_if:NTF \l_@@_t_bool 
        { \msg_error:nn { cascade } { t~option~already~set } }
        { \bool_set_true:N \l_@@_t_bool } ,
    t .value_forbidden:n = true ,
%    \end{macrocode}
% The option |interline| is the vertical space added between the two items
% connected by a~brace. 
%    \begin{macrocode}
    interline .dim_set:N = \l_@@_interline_dim,
    interline .value_required:n = true ,
%    \end{macrocode}
% 
% The option |interline-all| will change the value of |interline| for all the
% commands |\Cascade|, even the nested commands. 
%    \begin{macrocode}
    interline-all .code:n = 
     { 
       \dim_set:Nn \l_@@_interline_all_dim { #1 }
       \dim_set:Nn \l_@@_interline_dim { #1 } 
     } ,
    interline-all .value_required:n = true ,
%    \end{macrocode}
% 
% \medskip
% The option |space-between| is the horizontal space inserted between the two
% elements of the same row of the construction.
%    \begin{macrocode}
    space-between .dim_set:N = \l_@@_space_between_dim ,
    space-between .value_required:n = true
  }
%    \end{macrocode}
% 
% \iffalse
%%
%% This set of options will be used by \CascadeOptions
% \fi
% \medskip
% The set of keys |cascade/global| will be used for the command
% |\CascadeOptions| (which fixes the options at a ``global'' level).
% 
%    \begin{macrocode}
\keys_define:nn { cascade / global }
  {
    interline-all .dim_set:N = \l_@@_interline_all_dim ,
    interline-all .value_required:n = true ,
    space-between .dim_set:N = \l_@@_space_between_dim ,
    space-between .value_required:n = true
  }
%    \end{macrocode}
%
% \medskip
%    \begin{macrocode}
\cs_new_protected:Npn \@@_initialisation:
  {
    \box_clear_new:N \l_@@_box_one
    \box_clear_new:N \l_@@_box_two
    \box_clear_new:N \l_@@_box_three
    \box_clear_new:N \l_@@_box_four
    \dim_zero_new:N \l_@@_top_dim
    \dim_zero_new:N \l_@@_bottom_dim
  }
%    \end{macrocode}
% 
% \medskip
% \DescribeMacro{\CascadeOptions}
% The command |\CascadeOptions| is the command to set the options of the
% \pkg{cascade} at the document level (these options are set in a local way in
% the sense of the TeX groups).
%    \begin{macrocode}
\NewDocumentCommand \CascadeOptions { m }
  { \keys_set:nn { cascade / global } { #1 } }
%    \end{macrocode}
% 
% \iffalse
%%
%% The command \Cascade is defined with \NewDocumentCommand of xparse
% \fi
% \interitem
% \DescribeMacro{\Cascade}
% The command |\Cascade| is the main command of this package.
% 
%    \begin{macrocode}
\NewDocumentCommand \Cascade { O { } m m m m D < > { } }
  { 
    \if_mode_math:
      \msg_error:nn { cascade } { math~mode }
    \fi:
    \mode_leave_vertical:
%    \end{macrocode}
% The dimension |\g_@@_yoffset_dim| will be used by the option~|t|.
%    \begin{macrocode}
    \bool_if:NF \l_@@_nested_command_bool
      { 
        \dim_gzero_new:N \g_@@_yoffset_dim 
        \bool_set_true:N \l_@@_first_argument_bool
      }
    \group_begin:

    \spread@equation
    \dim_set_eq:NN \l_@@_interline_dim \l_@@_interline_all_dim
    \keys_set:nn { cascade / command } { #1 }
    \@@_initialisation:
    \hbox_set:Nn \l_@@_box_one 
      { 
        \bool_set_true:N \l_@@_first_argument_bool 
        \bool_set_true:N \l_@@_nested_command_bool 
        #2 
      } 
    \hbox_set:Nn \l_@@_box_two { #3 }  
    \hbox_set:Nn \l_@@_box_three 
      { 
        \bool_set_false:N \l_@@_first_argument_bool 
        \bool_set_true:N \l_@@_nested_command_bool 
        #4 
      }
    \hbox_set:Nn \l_@@_box_four { #5 }
%    \end{macrocode}
%
% \medskip
% The dimension |\l_@@_top_dim| is the space that we will have to add before the
% main construction to make up for the ``|\smash[t]|'' of the box |#1|.
%    \begin{macrocode}
    \dim_set:Nn \l_@@_top_dim 
      { 
        \dim_max:nn 
          \c_zero_dim
          { \box_ht:N \l_@@_box_one - \box_ht:N \l_@@_box_two }
      }
%    \end{macrocode}
% The dimension |\l_@@_bottom_dim| is the space that we will have to add after
% the main construction to make up for the ``|\smash[b]|'' of the box |#3|.
%    \begin{macrocode}
    \dim_set:Nn \l_@@_bottom_dim 
      { 
        \dim_max:nn 
          \c_zero_dim
          { \box_dp:N \l_@@_box_three - \box_dp:N \l_@@_box_four } 
      }
%    \end{macrocode}
%
% \medskip
% We do the ``|\smash[t]|'' of box |#1| and the ``|\smash[b]|'' of box |#3|.
%    \begin{macrocode}
    \box_set_ht:Nn \l_@@_box_one \c_zero_dim
    \box_set_dp:Nn \l_@@_box_three \c_zero_dim
%    \end{macrocode}
% 
% \medskip
% We can now construct the box.
%    \begin{macrocode}
    \vbox_set:Nn \l_tmpa_box
      { 
        \skip_vertical:N \l_@@_top_dim
        \vbox_top:n 
          {
            \@@_the_vcenter:nn { #2 } { #4 } 
%    \end{macrocode}
% We update |\g_@@_yoffset_dim|.
%    \begin{macrocode}
            \bool_if:NT \l_@@_first_argument_bool
              {
%    \end{macrocode}
% Here, you should use |\box_ht_plus_dp:N| when TeXLive 2021 will be available
% on Overleaf. 
%    \begin{macrocode}
                \dim_set:Nn \l_tmpa_dim
                  { \box_ht:N \l_tmpb_box + \box_dp:N \l_tmpb_box }
                \l_tmpa_dim = 0.5\l_tmpa_dim
                \dim_add:Nn \l_tmpa_dim { \the \fontdimen 22 \textfont2 }
                \dim_sub:Nn \l_tmpa_dim 
                  { \dim_max:nn { \box_ht:N \l_@@_box_two } { \box_ht:N \strutbox } }
                \dim_gadd:Nn \g_@@_yoffset_dim \l_tmpa_dim
              }
%    \end{macrocode}
%    \begin{macrocode}
            \hbox
              {
                \c_math_toggle_token
                \left .
                \box_use_drop:N \l_tmpb_box 
                \right \}
                \c_math_toggle_token 
                \bool_if:NT \l_@@_t_bool
                  {  
                     \bool_if:NF \l_@@_nested_command_bool
                       {
                         \tl_if_empty:nF { #6 }
                           { 
                             \skip_horizontal:n \l_@@_space_between_dim
                             #6  
                           }
                       }
                  }
              }
            \skip_vertical:N \l_@@_bottom_dim
          }
      }
    \bool_if:NTF \l_@@_nested_command_bool
      { \box_use_drop:N \l_tmpa_box }
      {
%    \end{macrocode}
% We are in the main command |\Cascade| and, if the option~|t| is in force, we
% have now to take into account that key.
%    \begin{macrocode}
        \bool_if:NTF \l_@@_t_bool
          { \box_move_down:nn \g_@@_yoffset_dim { \box_use:N \l_tmpa_box } } 
          { \box_use_drop:N \l_tmpa_box }
      }
    \group_end:
  }
%    \end{macrocode}
% 
% \bigskip
% The following macro is only for the lisibility of the code.
%    \begin{macrocode}
\cs_new_protected:Npn \@@_the_vcenter:nn #1 #2
  {
    \hbox_set:Nn \l_tmpb_box
      {
        \c_math_toggle_token
        \vcenter
          { 
            \halign 
              { 
                \hfil ## \cr
                \hbox
                  {
                    \tl_if_empty:nF { #1 }
                      {
                        \box_use_drop:N \l_@@_box_one 
                        \skip_horizontal:n \l_@@_space_between_dim
                      }
                    \box_use:N \l_@@_box_two 
                    \strut
                  } 
                \cr
                \noalign { \skip_vertical:n \l_@@_interline_dim }
                \hbox
                  {
                    \tl_if_empty:nF { #2 } 
                      { 
                        \box_use_drop:N \l_@@_box_three
                        \skip_horizontal:n \l_@@_space_between_dim
                      }
                    \box_use_drop:N \l_@@_box_four 
                    \strut
                  } 
                \cr
              }  
          }
        \c_math_toggle_token
      }
  }
%    \end{macrocode}
%
% \bigskip
% The command |\Edacsac|. The code is simpler because we don't need the
% |\halign| and we don't have the key |t|.
%
%    \begin{macrocode}
\NewDocumentCommand \Edacsac { O { } m m m m }
  {
    \if_mode_math:
      \msg_error:nn { cascade } { math~mode }
    \fi:
    \mode_leave_vertical:
    \group_begin:
    \spread@equation
    \dim_set_eq:NN \l_@@_interline_dim \l_@@_interline_all_dim
    \keys_set:nn { cascade / command } { #1 }
    \@@_initialisation:
    \hbox_set:Nn \l_@@_box_one { #2 }
    \hbox_set:Nn \l_@@_box_two { #3 }
    \hbox_set:Nn \l_@@_box_three { #4 }
    \hbox_set:Nn \l_@@_box_four { #5 }
    \dim_set:Nn \l_@@_top_dim
      {
        \dim_max:nn
          \c_zero_dim
          { \box_ht:N \l_@@_box_two - \box_ht:N \l_@@_box_one }
      }
    \dim_set:Nn \l_@@_bottom_dim
      {
        \dim_max:nn
          \c_zero_dim
          { \box_dp:N \l_@@_box_four - \box_dp:N \l_@@_box_three }
      }
    \box_set_ht:Nn \l_@@_box_two \c_zero_dim
    \box_set_dp:Nn \l_@@_box_four \c_zero_dim
    \vbox
       {
         \skip_vertical:N \l_@@_top_dim
         \vtop
           {
             \hbox
               {
                 \c_math_toggle_token
                 \left \{
                 \vcenter
                   {
                     \hbox
                       {
                         \tl_if_empty:nF { #2 }
                           {
                             \box_use_drop:N \l_@@_box_one
                             \skip_horizontal:n \l_@@_space_between_dim 
                           }
                         \box_use_drop:N \l_@@_box_two 
                         \strut
                       }
                     \skip_vertical:N \l_@@_interline_dim 
                     \hbox
                       {
                         \tl_if_empty:nF { #4 }
                           {
                             \box_use_drop:N \l_@@_box_three
                             \skip_horizontal:n \l_@@_space_between_dim
                           }
                         \box_use_drop:N \l_@@_box_four
                         \strut
                       }
                   }
                 \right .
                 \c_math_toggle_token
               }
             \skip_vertical:N \l_@@_bottom_dim
           }
       }
    \group_end:
}
%    \end{macrocode}
%
% 
% \bigskip
%    \begin{macrocode}
\msg_new:nnn 
  { cascade }
  { math~mode }
  {
    The~commands~of~the~extension~'cascade'~
    should~be~used~in~text~mode~only.~However,~you~can~
    go~on~for~this~time.
  }
%    \end{macrocode}
%
%    \begin{macrocode}
\msg_new:nnn
  { cascade }
  { t~option~already~set }
  { 
    You~can't~use~the~key~'t'~here~because~it~has~been~set~
    in~an~encompassing~command.~If~you~go~on,~this~key~will~be~
    ignored.
  }
%    \end{macrocode}
% 
% \bigskip
% \DescribeMacro{\ShortCascade}
% The command |\ShortCascade| is a simplified version of |\Cascade| with only
% two arguments. 
%    \begin{macrocode}
\NewDocumentCommand \ShortCascade { O { } m m }
  { \Cascade [ #1 ] { } { #2 } { } { #3 } }
%    \end{macrocode}
%
% \bigskip
% \DescribeMacro{\ShortEdacsac}
% Idem for |\ShortEdacsac|
%    \begin{macrocode}
\NewDocumentCommand \ShortEdacsac { O { } m m }
  { \Edacsac [ #1 ] { #2 } { } { #3 } { } }
%    \end{macrocode}
%
%
% \vspace{1cm}
% \section{History}
%
% \subsection*{Changes between versions 1.0 and 1.1}
% 
% New option |t|.
% 
% \subsection*{Changes between versions 1.0 and 1.1}
%
% New commands |\Edacsac| and |\ShortEdacsac|.
% 
%
% \PrintIndex
% \tableofcontents
%
% \end{document}
% 
% Local Variables:
% TeX-fold-mode: t
% TeX-fold-preserve-comments: nil
% flyspell-mode: nil
% fill-column: 80
% End:






