%%
%% This is file `conteq.sty',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% conteq.dtx  (with options: `package')
%% conteq.dtx  (with options: `layouts')
%% ----------------------------------------------------------------
%% conteq --- continued equalities
%% E-mail: mail@joachim-breitner.de
%% Released under the LaTeX Project Public License v1.3c or later
%% See http://www.latex-project.org/lppl.txt
%% ----------------------------------------------------------------
%% 
\NeedsTeXFormat{LaTeX2e}
\RequirePackage{expl3}[2012/07/02]
\ProvidesExplPackage
  {conteq}              % Package name
  {2015/07/17}          % Release date
  {0.1.1}                 % Release version
  {Various layouts for continued equalities} % Description

\RequirePackage{amsmath}
\RequirePackage{environ}
\msg_new:nnn
    { conteq }
    { empty }
    { Empty~conteq~environment~\msg_line_context: }

\msg_new:nnn
    { conteq }
    { ignoreddata }
    { Ignored~text~\msg_line_context: }

\msg_new:nnn
    { conteq }
    { undefined layout }
    { Undefined~layout~``#1''~\msg_line_context: }

\tl_new:N \l__conteq_default_layout_tl
\tl_new:N \l__conteq_layout_tl
\tl_new:N \l__conteq_body_tl
\tl_new:N \l__conteq_lines_seq
\tl_new:N \l__conteq_cells_seq
\tl_new:N \l__conteq_head_tl
\tl_new:N \l__conteq_lastline_tl
\tl_new:N \l__conteq_rhs_tl
\tl_new:N \l__conteq_expl_tl
\tl_new:N \l__conteq_result_tl

\cs_new_protected:Nn \__conteq_set_default_layout:n
  {
    \tl_set:Nn \l__conteq_default_layout_tl {#1}
  }
\cs_new_eq:NN \ConteqSetDefaultLayout \__conteq_set_default_layout:n
\tl_const:Nn \c__conteq_prefix_tl { __conteq_layouts }

\cs_new_protected:Nn \__conteq_define_layout:nnnnnnn
  {
    \cs_new_protected:cn { \c__conteq_prefix_tl _ #1 _begin: } { #2 }
    \cs_new_protected:cn { \c__conteq_prefix_tl _ #1_lhs:n } { #3 }
    \cs_new_protected:cn { \c__conteq_prefix_tl _ #1_rhs_only:n } { #4 }
    \cs_new_protected:cn { \c__conteq_prefix_tl _ #1_rhs_expl:nn } { #5 }
    \cs_new_protected:cn { \c__conteq_prefix_tl _ #1_nl: } { #6 }
    \cs_new_protected:cn { \c__conteq_prefix_tl _ #1_end: } { #7 }
  }
\cs_new_eq:NN \ConteqDefineLayout \__conteq_define_layout:nnnnnnn
\cs_new:Npn \__conteq_args_once:Nn #1#2
  {
   \exp_not:o { #1 {#2} }
  }
\cs_generate_variant:Nn \__conteq_args_once:Nn { NV }

\cs_new:Npn \__conteq_args_once:Nnn #1#2#3
  {
   \exp_not:o { #1 { #2 }{ #3 } }
  }
\cs_generate_variant:Nn \__conteq_args_once:Nnn { NVV }
\cs_new_protected:Npn \__conteq_print_line:Nnn #1#2#3
  {
    \seq_set_split:Nnn \l__conteq_cells_seq { & } { #2 }
    \seq_pop_left:NN \l__conteq_cells_seq \l__conteq_rhs_tl
    \tl_clear:N \l__conteq_expl_tl
    \seq_if_empty:NF \l__conteq_cells_seq
      {
\seq_pop_left:NN \l__conteq_cells_seq \l__conteq_expl_tl
      }
    \tl_if_blank:VTF \l__conteq_expl_tl
      {
\tl_put_right:Nx #1
  {
    \__conteq_args_once:NV \__conteq_rhs_only:n \l__conteq_rhs_tl
  }
      }
      {
\tl_set:Nx \l_tmpa_tl { \exp_not:N \text { \exp_not:N \ConteqExplStyle { \exp_not:V \l__conteq_expl_tl } } }
\tl_put_right:Nx #1
  {
    \__conteq_args_once:NVV \__conteq_rhs_expl:nn \l__conteq_rhs_tl \l_tmpa_tl
          }
      }
      \seq_if_empty:NF \l__conteq_cells_seq
{
  \msg_warning:nn{conteq}{ignoreddata}
}
    \tl_put_right:Nn #1 {#3}
  }
\cs_generate_variant:Nn \__conteq_print_line:Nnn { Nno, NVn }

\NewEnviron{ conteq }[1][ \l__conteq_default_layout_tl ]{
  \tl_set:NV \l__conteq_body_tl \BODY

  \tl_if_blank:oT \l__conteq_body_tl
    {
      \msg_warning:nn{conteq}{empty}
    }

  \tl_set:Nn \l__conteq_layout_tl { #1 }
  \cs_if_exist:cTF { \c__conteq_prefix_tl _ \l__conteq_layout_tl _ begin: }
    {
      \clist_map_inline:nn{ begin:, lhs:n,rhs_only:n, rhs_expl:nn, nl:, end: }
        {
          \cs_set_eq:cc { __conteq_ ##1 }{ \c__conteq_prefix_tl _ \l__conteq_layout_tl _ ##1 }
        }
    }{
      \msg_critical:nnx{conteq}{undefined layout}{\l__conteq_layout_tl}
    }

  \seq_set_split:NnV \l__conteq_lines_seq { \\ } \l__conteq_body_tl

  \tl_clear:N \l__conteq_result_tl


  \int_case:nnF { \seq_count:N \l__conteq_lines_seq }
    {
      {1}
        {
          \tl_put_right:Nx \l__conteq_result_tl { \exp_not:o \__conteq_begin: }
          \tl_put_right:NV \l__conteq_result_tl \l__conteq_body_tl
          \tl_put_right:Nx \l__conteq_result_tl { \exp_not:o \__conteq_end: }
        }
    }
    {

      \seq_pop_left:NN \l__conteq_lines_seq \l__conteq_head_tl
      \seq_pop_right:NN \l__conteq_lines_seq \l__conteq_lastline_tl

      \tl_put_right:Nx \l__conteq_result_tl { \exp_not:o \__conteq_begin: }
      \tl_put_right:Nx \l__conteq_result_tl
        {
          \__conteq_args_once:NV \__conteq_lhs:n \l__conteq_head_tl
        }
      \seq_map_inline:Nn \l__conteq_lines_seq
        {
          \__conteq_print_line:Nno \l__conteq_result_tl { ##1 } { \__conteq_nl: }
        }
      \__conteq_print_line:NVn \l__conteq_result_tl \l__conteq_lastline_tl {}
      \tl_put_right:Nx \l__conteq_result_tl { \exp_not:o \__conteq_end: }
    }
    % Use this for debugging
    %\tl_show:N \l__conteq_result_tl
    \tl_use:N \l__conteq_result_tl
  }


\ConteqDefineLayout
    {plain}
    {\begin{align*}}
    { #1 }
    { & #1 }
    { & #1 && #2 }
    { \\ }
    {\end{align*}}
\ConteqSetDefaultLayout{plain}

\ConteqDefineLayout
    {explline}
    {\begin{align*}}
    { #1 }
    { & #1 }
    { & #1 \\ & \mathrel{\phantom{=}} #2 }
    { \\ }
    {\end{align*}}

\ConteqDefineLayout
    {headline}
    {\begin{align*}}
    { &\mathrel{\phantom{=}} #1 \\ }
    { & #1 }
    { & #1 && #2 }
    { \\ }
    {\end{align*}}

\ConteqDefineLayout
    {onecolumn}
    {\begin{align*}}
    { &\mathrel{\phantom{=}} #1 \\ }
    { & #1 }
    { & #1 \\ & \mathrel{\phantom{=}} #2 }
    { \\ }
    {\end{align*}}

\ConteqDefineLayout
    {oneline}
    {\[}
    { #1 }
    { #1 }
    { #1 }
    {}
    {\]}

\newcommand{\ConteqExplStyle}[1]{\{~#1~\}}
%% 
%% Copyright (C) 2013,2015 by Joachim Breitner <mail@joachim-breitner.de>
%% 
%% This work 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 work is "maintained" (as per LPPL maintenance status) by
%% Joachim Breitner.
%% 
%% This work consists of the file  conteq.dtx
%% and the derived files           conteq.ins,
%%                                 conteq.pdf and
%%                                 conteq.sty.
%% 
%%
%% End of file `conteq.sty'.
