%%%==============================================================================
%% Copyright 2023-present by Alceu Frigeri
%%
%% This work may be distributed and/or modified under the conditions of
%%
%% * The [LaTeX Project Public License](http://www.latex-project.org/lppl.txt),
%%   version 1.3c (or later), and/or
%% * The [GNU Affero General Public License](https://www.gnu.org/licenses/agpl-3.0.html),
%%   version 3 (or later)
%%
%% This work has the LPPL maintenance status *maintained*.
%%
%% The Current Maintainer of this work is Alceu Frigeri
%%
%% This is version {1.22} {2025/12/26}
%%
%% The list of files that compose this work can be found in the README.md file at
%% https://ctan.org/pkg/codedescribe
%%
%%%==============================================================================
\NeedsTeXFormat{LaTeX2e}[2022/06/01]
   
%%%%%%%
%%%
%%% Just an attempt at having my package's info in a regular way
%%%   \pkginfograb_set:nn {<pkg-name>} { props} sets package info
%%%
%%%   \pkginfograbProvidesExplPackage {<pkg-name>} { props} sets package info
%%%     and calls \ProvidesExplPackage
%%%
%%%%%%%
\RequirePackage{pkginfograb}
\pkginfograbProvidesExplPackage {codelisting}
  {
     name        = {codelisting} ,
     prefix      = {codelist} ,
     date        = {2025/12/26} ,
     version     = {1.22} ,
     description = {LaTeX Code Listing}
  }
%%%%%%%
%%% End of cut-n-paste
%%%%%%%



\RequirePackage{xpeekahead,codecmm}
\RequirePackage{xcolor,listings,scontents}

%%%%
%%%% TODO: keep it???
%%%%
%\IfPackageLoadedTF {fancyvrb}
%  {
%    \lstset{fancyvrb = true}
%    \fvset{commentchar=\%}
%  }
%  {}


\bool_new:N \l__codelist_pckopt_xtradialects_bool
\tl_set:Nn \l__codelist_pckopt_dialect_tl {alsolanguage = [doctools]TeX ,}

\tl_set:Nn \l__codelist_pckopt_colorsbright_tl {default}

\keys_define:nn { codelisting }
  {    
    load~ xtra~ dialects .usage:n    = load ,
  	load~ xtra~ dialects .bool_set:N = \l__codelist_pckopt_xtradialects_bool ,
    load~ xtra~ dialects .value_forbidden:n  = true ,
    
    TeX~ dialects  .usage:n   =  general,
    TeX~ dialects  .code:n    =  
      { 
        \tl_clear:N \l__codelist_pckopt_dialect_tl
        \clist_map_inline:nn {#1}
          {
            \tl_put_right:Nn 
              \l__codelist_pckopt_dialect_tl 
              { 
                alsolanguage = [##1]TeX ,
              } 
          } 
      },
    TeX~ dialects  .value_required:n = true,
 
    colors .usage:n = load ,
    colors .choices:nn =
      { default , black , brighter , darker }
      { \tl_set_eq:NN \l__codelist_pckopt_colorsbright_tl \l_keys_choice_tl } ,
    colors .value_required:n = true ,   
    
    strict .usage:n = load ,
    strict .code:n  =
      {
        \msg_redirect_module:nnn {codelist} { warning } { error }  
      } 
  }
\ProcessKeyOptions [codelisting ]


\lstdefinelanguage[doctools]{TeX}[LaTeX]{TeX}
  {
   moretexcs       =     {setlength,
      usepackage,newcommand,renewcommand,providecommand,RequirePackage,
      SelectInputMappings,ifpdftex,ifpdfoutput,AtBeginEnvironment,ProvidesPackage,
      maketitle,text,includegraphics,chapter,section,subsection,subsubsection,paragraph,
      textmu,enquote,blockquote,ding,mathds,ifcsdef,Bra,Ket,Braket,subcaption,lettrine,
      mdfsetup,captionof,listoffigures,listoftables,tableofcontents,appendix,
      newcolumntype,rowfont,taburowcolors,rowcolor,rowcolors,bottomrule,
      toprule,midrule,hypersetup,gls,printglossary,glsadd,newglossaryentry,newacronym,
      mainmatter,frontmatter,geometry,KOMAoptions,setkomafont,addtokomafont,
      si,SI,sisetup,unit,unitfrac,micro,newblock,ExecuteBibliographyOptions,addbibresource,
      operatorname,frac,sfrac,dfrac,DeclareMathOperator,mathcal,underset,
      democodefile,package,cs,command,env,DemoError,PrintDemo,theadstart,tbody,tsubheadstart,
      tsubhead,tend,DefineCodeSection,SetCodeSection,BeginCodeSection,EndCodeSection,
      IfDefined,IfUndefined,IfElseDefined,IfElseUndefined,IfMultDefined,IfNotDraft,
      IfNotDraftElse,IfDraft,IfPackageLoaded,IfElsePackageLoaded,IfPackageNotLoaded,
      IfPackagesLoaded,IfPackagesNotLoaded,ExecuteAfterPackage,ExecuteBeforePackage,
      IfTikzLibraryLoaded,IfColumntypeDefined,IfColumntypesDefined,IfColorDefined,
      IfColorsDefined,IfMathVersionDefined,SetTemplateDefinition,UseDefinition,IfFileExists,
      iflanguage,setuptablefontsize,tablefontsize,setuptablestyle,tablestyle,
      setuptablecolor,tablecolor,disablealternatecolors,tablealtcolored,tbegin,
      tbody,tend,thead,theadstart,tsubheadstart,tsubhead,theadrow,tsubheadrow,
      resettablestyle,theadend,tsubheadend,tableitemize,PreserveBackslash,
      todo,missingfigure,lstloadlanguages,lstdefinestyle,lstset,
      indexsetup,newglossarystyle,glossarystyle,deftranslation,newglossary,
      usetikzlibrary,definecolor,colorlet,captionsetup,DeclareCaptionStyle,
      floatsetup,EnableCrossrefs,DisableCrossrefs,PageIndex,CodelineIndex,CodelineNumbered,
      cref,Cref,vref,eqnref,figref,tabref,secref,chapref}
  }


\bool_if:NTF \l__codelist_pckopt_xtradialects_bool
  { 
    \RequirePackage{codelstlang} %% pre-loading those definined in this
    \lstloadlanguages{
      [LaTeX]TeX,
      [doctools]TeX,
      [l3kernelsign]TeX,
      [l3expsign]TeX,
      [l3amssign]TeX,
      [l3pgfsign]TeX,
      [l3bibtexsign]TeX,
      [l3kernel]TeX,
      [l3exp]TeX,
      [l3ams]TeX,
      [l3pgf]TeX,
      [l3bibtex]TeX,
      [kernel]TeX,
      [xpacks]TeX,
      [ams]TeX,
      [pgf]TeX,
      [pgfplots]TeX,
      [bibtex]TeX,
      [babel]TeX,
      [hyperref]TeX
    }
  }
  { 
    \lstloadlanguages{[LaTeX]TeX,[doctools]TeX}
  }


\msg_new:nnnn {codelist} {invalid key}
  {
    (#1)~Key (#2) ~not~defined!
  }
  {
    You~tried~to~use~a~non~defined~key:#2.
    ~Error~Code~ ID:<#1>.
  }

\msg_new:nnnn {codelist} {deprecated}
  {
    (#1)~The~ command~#2~ is ~being~ deprecated~ use~ #3~ instead.
  }
  {
    You~tried~to~use~a~command,~#2,~ being~ deprecated.
    use~ #3~ instead.
    ~Error~Code~ ID:<#1>.
  }



\dim_new:N \l__codelist_demo_parindent_dim
\dim_new:N \l__codelist_org_parindent_dim

\dim_set:Nn\l__codelist_org_parindent_dim{\parindent}


%\__codecmm_color_set:nn{c__codelist_gray_color}{gray}
%\__codecmm_color_set:nnn{c__codelist_grayblack_color}{rgb}{0.8,0.8,0.8}
%\__codecmm_color_set:nnn{c__codelist_blackgray_color}{rgb}{0.8,0.8,0.8}
%
%\cs_new_protected:Npn \__codelist_set_colors:n #1
%  {
%    \__codecmm_color_set:ne {c__codelist_lightred_color}        { white!    \fp_eval:n{ 96.5 + 1 * #1 } !red     }
%    \__codecmm_color_set:ne {c__codelist_lightgreen_color}      { white!    \fp_eval:n{ 96.5 + 1 * #1 } !green   }
%    \__codecmm_color_set:ne {c__codelist_lightblue_color}       { white!    \fp_eval:n{ 96.5 + 1 * #1 } !blue    }
%    \__codecmm_color_set:ne {c__codelist_lightmagenta_color}    { white!    \fp_eval:n{ 96.5 + 1 * #1 } !magenta }
%    \__codecmm_color_set:ne {c__codelist_lightyellow_color}     { white!    \fp_eval:n{ 96.5 + 1 * #1 } !yellow  }
%    \__codecmm_color_set:ne {c__codelist_lightteal_color}       { white!    \fp_eval:n{ 96.5 + 1 * #1 } !teal    }
%    \__codecmm_color_set:ne {c__codelist_lightcyan_color}       { white!    \fp_eval:n{ 96.5 + 1 * #1 } !cyan    }
%    \__codecmm_color_set:ne {c__codelist_lightgray_color}       { white!    \fp_eval:n{ 96.5 + 1 * #1 } !black   }
%
%    \__codecmm_color_set:ne {c__codelist_darkred_color}         { red!      \fp_eval:n{ 30 * #1 } !black!100 }
%    \__codecmm_color_set:ne {c__codelist_darkgreen_color}       { green!    \fp_eval:n{ 30 * #1 } !black!100 }
%    \__codecmm_color_set:ne {c__codelist_darkblue_color}        { blue!     \fp_eval:n{ 30 * #1 } !black!100 }
%    \__codecmm_color_set:ne {c__codelist_darkmagenta_color}     { magenta!  \fp_eval:n{ 30 * #1 } !black!100 }
%    \__codecmm_color_set:ne {c__codelist_darkyellow_color}      { yellow!   \fp_eval:n{ 30 * #1 } !black!100 }
%    \__codecmm_color_set:ne {c__codelist_darkteal_color}        { teal!     \fp_eval:n{ 30 * #1 } !black!100 }
%    \__codecmm_color_set:ne {c__codelist_darkcyan_color}        { cyan!     \fp_eval:n{ 30 * #1 } !black!100 }
%    
%    \__codecmm_color_set:ne {c__codelist_redishblack_color}     { red!      \fp_eval:n{ 50 * #1 } !black!100 }
%    \__codecmm_color_set:ne {c__codelist_greenishblack_color}   { green!    \fp_eval:n{ 50 * #1 } !black!100 }
%    \__codecmm_color_set:ne {c__codelist_blueishblack_color}    { blue!     \fp_eval:n{ 50 * #1 } !black!100 }
%    \__codecmm_color_set:ne {c__codelist_magentaishblack_color} { magenta!  \fp_eval:n{ 50 * #1 } !black!100 }
%    \__codecmm_color_set:ne {c__codelist_yellowishblack_color}  { yellow!   \fp_eval:n{ 50 * #1 } !black!100 }
%    \__codecmm_color_set:ne {c__codelist_tealishblack_color}    { teal!     \fp_eval:n{ 50 * #1 } !black!100 }
%    \__codecmm_color_set:ne {c__codelist_cyanishblack_color}    { cyan!     \fp_eval:n{ 50 * #1 } !black!100 }
%    
%    \__codecmm_color_set:ne {c__codelist_redblack_color}        { red!      \fp_eval:n{ 75 * #1 } !black!100 }
%    \__codecmm_color_set:ne {c__codelist_greenblack_color}      { green!    \fp_eval:n{ 75 * #1 } !black!100 }
%    \__codecmm_color_set:ne {c__codelist_blueblack_color}       { blue!     \fp_eval:n{ 75 * #1 } !black!100 }
%    \__codecmm_color_set:ne {c__codelist_magentablack_color}    { magenta!  \fp_eval:n{ 75 * #1 } !black!100 }
%    \__codecmm_color_set:ne {c__codelist_yellowblack_color}     { yellow!   \fp_eval:n{ 75 * #1 } !black!100 }
%    \__codecmm_color_set:ne {c__codelist_tealblack_color}       { teal!     \fp_eval:n{ 75 * #1 } !black!100 }
%    \__codecmm_color_set:ne {c__codelist_cyanblack_color}       { cyan!     \fp_eval:n{ 75 * #1 } !black!100 }
%    
%    \__codecmm_color_set:ne {c__codelist_grayred_color}         { red!      \fp_eval:n{ 30 * #1 } !gray!100 }
%    \__codecmm_color_set:ne {c__codelist_graygreen_color}       { green!    \fp_eval:n{ 30 * #1 } !gray!100 }
%    \__codecmm_color_set:ne {c__codelist_grayblue_color}        { blue!     \fp_eval:n{ 30 * #1 } !gray!100 }
%    \__codecmm_color_set:ne {c__codelist_graymagenta_color}     { magenta!  \fp_eval:n{ 30 * #1 } !gray!100 }
%    \__codecmm_color_set:ne {c__codelist_grayyellow_color}      { yellow!   \fp_eval:n{ 30 * #1 } !gray!100 }
%    \__codecmm_color_set:ne {c__codelist_grayteal_color}        { teal!     \fp_eval:n{ 30 * #1 } !gray!100 }
%    \__codecmm_color_set:ne {c__codelist_graycyan_color}        { cyan!     \fp_eval:n{ 30 * #1 } !gray!100 }
%    
%    \__codecmm_color_set:ne {c__codelist_redishgray_color}      { red!      \fp_eval:n{ 50 * #1 } !gray!100 }
%    \__codecmm_color_set:ne {c__codelist_greenishgray_color}    { green!    \fp_eval:n{ 50 * #1 } !gray!100 }
%    \__codecmm_color_set:ne {c__codelist_blueishgray_color}     { blue!     \fp_eval:n{ 50 * #1 } !gray!100 }
%    \__codecmm_color_set:ne {c__codelist_magentaishgray_color}  { magenta!  \fp_eval:n{ 50 * #1 } !gray!100 }
%    \__codecmm_color_set:ne {c__codelist_yellowishgray_color}   { yellow!   \fp_eval:n{ 50 * #1 } !gray!100 }
%    \__codecmm_color_set:ne {c__codelist_tealishgray_color}     { teal!     \fp_eval:n{ 50 * #1 } !gray!100 }
%    \__codecmm_color_set:ne {c__codelist_cyanishgray_color}     { cyan!     \fp_eval:n{ 50 * #1 } !gray!100 }
%    
%    \__codecmm_color_set:ne {c__codelist_redgray_color}         { red!      \fp_eval:n{ 75 * #1 } !gray!100 }
%    \__codecmm_color_set:ne {c__codelist_greengray_color}       { green!    \fp_eval:n{ 75 * #1 } !gray!100 }
%    \__codecmm_color_set:ne {c__codelist_bluegray_color}        { blue!     \fp_eval:n{ 75 * #1 } !gray!100 }
%    \__codecmm_color_set:ne {c__codelist_magentagray_color}     { magenta!  \fp_eval:n{ 75 * #1 } !gray!100 }
%    \__codecmm_color_set:ne {c__codelist_yellowgray_color}      { yellow!   \fp_eval:n{ 75 * #1 } !gray!100 }
%    \__codecmm_color_set:ne {c__codelist_tealgray_color}        { teal!     \fp_eval:n{ 75 * #1 } !gray!100 }
%    \__codecmm_color_set:ne {c__codelist_cyangray_color}        { cyan!     \fp_eval:n{ 75 * #1 } !gray!100 }
%  }    
%%\tl_set:Nn \l__codelist_bckgnd_color_default_tl   { c__codelist_lightgray_color }%
%%\tl_set:Nn \l__codelist_string_color_default_tl   { c__codelist_darkteal_color }
%%\tl_set:Nn \l__codelist_comment_color_default_tl  { c__codelist_darkgreen_color }
%%
%%\tl_set:Nn \l__codelist_texcsA_color_default_tl   { c__codelist_darkblue_color }
%%\tl_set:Nn \l__codelist_texcsB_color_default_tl   { c__codelist_blueishblack_color }
%%\tl_set:Nn \l__codelist_texcsC_color_default_tl   { c__codelist_blueblack_color }
%%\tl_set:Nn \l__codelist_texcsD_color_default_tl   { c__codelist_blueishgray_color }
%%
%%\tl_set:Nn \l__codelist_keywdA_color_default_tl   { c__codelist_darkcyan_color }
%%\tl_set:Nn \l__codelist_keywdB_color_default_tl   { c__codelist_cyanishblack_color }
%%\tl_set:Nn \l__codelist_keywdC_color_default_tl   { c__codelist_cyanblack_color }
%%\tl_set:Nn \l__codelist_keywdD_color_default_tl   { c__codelist_cyanishgray_color }
%%
%%\tl_set:Nn \l__codelist_emphA_color_default_tl    { c__codelist_darkred_color }
%%\tl_set:Nn \l__codelist_emphB_color_default_tl    { c__codelist_redishblack_color }
%%\tl_set:Nn \l__codelist_emphC_color_default_tl    { c__codelist_redblack_color }
%%\tl_set:Nn \l__codelist_emphD_color_default_tl    { c__codelist_redishgray_color }
%%
%%\tl_set:Nn \l__codelist_rule_color_default_tl     { c__codelist_gray_color }
%%\tl_set:Nn \l__codelist_number_color_default_tl   { c__codelist_gray_color }


\cs_new_protected:Npn \__codelist_set_colors:n #1
  {
%    \__codecmm_color_set:ne {c__codelist_bckgnd_color}          { white!    \fp_eval:n{ 96.5 + 1 * #1 } ! \l__codelist_colorscheme_bckgnd_tl }
%    \__codecmm_color_set:ne {c__codelist_bckgnd_color}          { white!    \fp_eval:n{ 90 + 5 * #1 } ! \l__codelist_colorscheme_bckgnd_tl ! \fp_eval:n{ 20 + 15 * #1 } }
    \__codecmm_color_set:ne {c__codelist_bckgnd_color}          { \l__codelist_colorscheme_bckgnd_tl  ! \fp_eval:n{  4 - 1.4 * #1 } ! white ! 100  }
    
    
    \__codecmm_color_set:ne {c__codelist_string_color}          { \l__codelist_colorscheme_string_tl  ! \fp_eval:n{ 30 * #1 }      ! black ! 100 }
    \__codecmm_color_set:ne {c__codelist_comment_color}         { \l__codelist_colorscheme_comment_tl ! \fp_eval:n{ 30 * #1 }      ! black ! 100 }
    
    \__codecmm_color_set:ne {c__codelist_texcsA_color}          { \l__codelist_colorscheme_texcs_tl   ! \fp_eval:n{ 30 * #1 }      ! black ! 100 }
    \__codecmm_color_set:ne {c__codelist_texcsB_color}          { \l__codelist_colorscheme_texcs_tl   ! \fp_eval:n{ 42 * #1 }      ! black ! 95 }
    \__codecmm_color_set:ne {c__codelist_texcsC_color}          { \l__codelist_colorscheme_texcs_tl   ! \fp_eval:n{ 54 * #1 }      ! black ! 90 }
    \__codecmm_color_set:ne {c__codelist_texcsD_color}          { \l__codelist_colorscheme_texcs_tl   ! \fp_eval:n{ 66 * #1 }      ! black ! 85 }
    
    \__codecmm_color_set:ne {c__codelist_keywdA_color}          { \l__codelist_colorscheme_keywd_tl   ! \fp_eval:n{ 30 * #1 }      ! black ! 100 }
    \__codecmm_color_set:ne {c__codelist_keywdB_color}          { \l__codelist_colorscheme_keywd_tl   ! \fp_eval:n{ 42 * #1 }      ! black ! 95 }
    \__codecmm_color_set:ne {c__codelist_keywdC_color}          { \l__codelist_colorscheme_keywd_tl   ! \fp_eval:n{ 54 * #1 }      ! black ! 90 }
    \__codecmm_color_set:ne {c__codelist_keywdD_color}          { \l__codelist_colorscheme_keywd_tl   ! \fp_eval:n{ 66 * #1 }      ! black ! 85 }
    
    \__codecmm_color_set:ne {c__codelist_emphA_color}           { \l__codelist_colorscheme_emph_tl    ! \fp_eval:n{ 30 * #1 }      ! black ! 100 }
    \__codecmm_color_set:ne {c__codelist_emphB_color}           { \l__codelist_colorscheme_emph_tl    ! \fp_eval:n{ 42 * #1 }      ! black ! 95 }
    \__codecmm_color_set:ne {c__codelist_emphC_color}           { \l__codelist_colorscheme_emph_tl    ! \fp_eval:n{ 54 * #1 }      ! black ! 90 }
    \__codecmm_color_set:ne {c__codelist_emphD_color}           { \l__codelist_colorscheme_emph_tl    ! \fp_eval:n{ 66 * #1 }      ! black ! 85 }
    
%    \__codecmm_color_set:ne {c__codelist_rule_color}            { \l__codelist_colorscheme_rule_tl   ! \fp_eval:n{ 50 * #1 }      ! gray ! 100 }
%    \__codecmm_color_set:ne {c__codelist_number_color}          { \l__codelist_colorscheme_number_tl   ! \fp_eval:n{ 50 * #1 }      ! gray ! 100 }
    \__codecmm_color_set:ne {c__codelist_rule_color}            { \l__codelist_colorscheme_rule_tl    !    \fp_eval:n{ 40 + 20 * #1 } !  white}
    \__codecmm_color_set:ne {c__codelist_number_color}          { \l__codelist_colorscheme_number_tl  !    \fp_eval:n{ 40 + 20 * #1 } ! white }

  }

\cs_new_protected:Npn \__codelist_set_color_brightness:n #1
  {
    \str_case:enF {#1}
      {
        {default}
          { \__codelist_set_colors:n {1} }
        {black}
          { \__codelist_set_colors:n {0} }        
        {brighter}
          { \__codelist_set_colors:n {1.5} }
        {darker}
          { \__codelist_set_colors:n {0.7} }
      } %% fail-safe: default
      { \__codelist_set_colors:n {1} }
  }
\cs_generate_variant:Nn   \__codelist_set_color_brightness:n {V}


\keys_define:nn { codelist / color scheme } 
  {
    bckgnd   .usage:n              = general ,
    bckgnd   .tl_set:N             = \l__codelist_colorscheme_bckgnd_tl ,
    bckgnd   .default:n            = black ,

    string    .usage:n             = general ,
    string    .tl_set:N            = \l__codelist_colorscheme_string_tl ,
    string    .default:n           = teal ,
  
    comment   .usage:n             = general ,
    comment   .tl_set:N            = \l__codelist_colorscheme_comment_tl ,
    comment   .default:n           = green ,
    
    texcs     .usage:n             = general ,
    texcs     .tl_set:N            = \l__codelist_colorscheme_texcs_tl ,
    texcs     .default:n           = blue ,
    
    keywd     .usage:n             = general ,
    keywd     .tl_set:N            = \l__codelist_colorscheme_keywd_tl ,
    keywd     .default:n           = cyan ,
    
    emph      .usage:n             = general ,
    emph      .tl_set:N            = \l__codelist_colorscheme_emph_tl ,
    emph      .default:n           = red ,
      
    rule      .usage:n             = general ,
    rule      .tl_set:N            = \l__codelist_colorscheme_rule_tl ,
    rule      .default:n           = black ,

    number    .usage:n             = general ,
    number    .tl_set:N            = \l__codelist_colorscheme_number_tl ,
    number    .default:n           = black ,
    
    brightness  .usage:n           = general ,
    brightness  .tl_set:N          = \l__codelist_colorscheme_bright_tl ,
    brightness  .default:n         = 1 ,
    
    scheme    .usage:n             = general ,
    scheme    .choice: ,
    scheme    .default:n           = default ,
  }


\cs_new_protected:Npn \__codelist_set_colorscheme:n #1
  {
    \keys_set:nn { codelist / color scheme } {#1}
    \__codelist_set_colors:n \l__codelist_colorscheme_bright_tl    
  }


\cs_new_protected:Npn \__codelist_new_colorscheme:nn #1#2
  { 
    \keys_precompile:nnN { codelist / color scheme } {#2}
      \l__codelist_colorscheme_tmp_tl
    \keys_define:ne { codelist / color scheme }
      {
        scheme / #1
          .code:n = { \exp_not:V \l__codelist_colorscheme_tmp_tl }
      }
  }

\__codelist_new_colorscheme:nn
  {default}
  { bckgnd , string , comment , texcs , keywd , emph , rule , number , brightness }

\keys_set:nn { codelist / color scheme } 
  {scheme=default}

\__codelist_set_color_brightness:n \l__codelist_pckopt_colorsbright_tl


\NewDocumentCommand \setlistcolorscheme {m}
  { \__codelist_set_colorscheme:n {#1} }


\NewDocumentCommand \newlistcolorscheme {mm}
  { \__codelist_new_colorscheme:nn {#1}{#2} }


\keys_define:nn {codelist / options} 
  {  
    lststyle      .usage:n   =  general,
    lststyle      .code:n    =  { \tl_set:Nn \l__codelist_basestyle_tl {#1} },
    lststyle      .default:n =  {codestyle} ,
  
    settexcs      .usage:n   =  general,
    settexcs      .code:n    =  { \tl_set:Nn \l__codelist_texcsA_tl {#1} },
    settexcs      .default:n =   ,
    
    texcs         .usage:n   =   general,
    texcs         .code:n    =  { \tl_put_right:Nn \l__codelist_texcsA_tl { , #1} },
    texcs         .default:n =  ,
  
    texcsstyle    .usage:n   =   general,
    texcsstyle    .code:n    =  { \tl_set:Nn \l__codelist_texcsAstyle_tl {#1} },
    texcsstyle    .default:n =  \bfseries\__codecmm_color_select:n{ c__codelist_texcsA_color },
  
    settexcs2     .usage:n   =   general,
    settexcs2     .code:n    =  { \tl_set:Nn \l__codelist_texcsB_tl {#1} },
    settexcs2     .default:n =  ,
  
    texcs2        .usage:n   =   general,
    texcs2        .code:n    =  { \tl_put_right:Nn \l__codelist_texcsB_tl { , #1} },
    texcs2        .default:n =  ,
  
    texcs2style   .usage:n   =   general,
    texcs2style   .code:n    =  { \tl_set:Nn \l__codelist_texcsBstyle_tl {#1} },
    texcs2style   .default:n =  \bfseries\__codecmm_color_select:n{ c__codelist_texcsB_color } ,
  
    settexcs3     .usage:n   =   general,
    settexcs3     .code:n    =  { \tl_set:Nn \l__codelist_texcsC_tl {#1} },
    settexcs3     .default:n =  ,
  
    texcs3        .usage:n   =   general,
    texcs3        .code:n    =  { \tl_put_right:Nn \l__codelist_texcsC_tl { , #1} },
    texcs3        .default:n =  ,
  
    texcs3style   .usage:n   =   general,
    texcs3style   .code:n    =  { \tl_set:Nn \l__codelist_texcsCstyle_tl {#1} },
    texcs3style   .default:n =  \bfseries\__codecmm_color_select:n{ c__codelist_texcsC_color } ,
  
    settexcs4     .usage:n   =   general,
    settexcs4     .code:n    =  { \tl_set:Nn \l__codelist_texcsD_tl {#1} },
    settexcs4     .default:n =  ,
  
    texcs4        .usage:n   =   general,
    texcs4        .code:n    =  { \tl_put_right:Nn \l__codelist_texcsD_tl { , #1} },
    texcs4        .default:n =  ,
  
    texcs4style   .usage:n   =   general,
    texcs4style   .code:n    =  { \tl_set:Nn \l__codelist_texcsDstyle_tl {#1} },
    texcs4style   .default:n =  \bfseries\__codecmm_color_select:n{ c__codelist_texcsD_color } ,
  
    setkeywd      .usage:n   =   general,
    setkeywd      .code:n    =  { \tl_set:Nn \l__codelist_keywdA_tl {#1} },
    setkeywd      .default:n =  ,
  
    keywd         .usage:n   =   general,
    keywd         .code:n    =  { \tl_put_right:Nn \l__codelist_keywdA_tl { , #1} },
    keywd         .default:n =  ,
  
    keywdstyle    .usage:n   =   general,
    keywdstyle    .code:n    =  { \tl_set:Nn \l__codelist_keywdstyle_tl {#1} },
    keywdstyle    .default:n =  \bfseries\__codecmm_color_select:n{ c__codelist_keywdA_color } ,
  
    setkeywd2     .usage:n   =   general,
    setkeywd2     .code:n    =  { \tl_set:Nn \l__codelist_keywdB_tl {#1} },
    setkeywd2     .default:n =  ,
  
    keywd2        .usage:n   =   general,
    keywd2        .code:n    =  { \tl_put_right:Nn \l__codelist_keywdB_tl { , #1} },
    keywd2        .default:n =  ,
  
    keywd2style   .usage:n   =   general,
    keywd2style   .code:n    =  { \tl_set:Nn \l__codelist_keywdBstyle_tl {#1} },
    keywd2style   .default:n =  \bfseries\__codecmm_color_select:n{ c__codelist_keywdB_color } ,
  
    setkeywd3     .usage:n   =   general,
    setkeywd3     .code:n    =  { \tl_set:Nn \l__codelist_keywdC_tl {#1} },
    setkeywd3     .default:n =  ,
  
    keywd3        .usage:n   =   general,
    keywd3        .code:n    =  { \tl_put_right:Nn \l__codelist_keywdC_tl { , #1} },
    keywd3        .default:n =  ,
  
    keywd3style   .usage:n   =   general,
    keywd3style   .code:n    =  { \tl_set:Nn \l__codelist_keywdCstyle_tl {#1} },
    keywd3style   .default:n =  \bfseries\__codecmm_color_select:n{ c__codelist_keywdC_color } ,
  
    setkeywd4     .usage:n   =   general,
    setkeywd4     .code:n    =  { \tl_set:Nn \l__codelist_keywdD_tl {#1} },
    setkeywd4     .default:n =  ,
  
    keywd4        .usage:n   =   general,
    keywd4        .code:n    =  { \tl_put_right:Nn \l__codelist_keywdD_tl { , #1} },
    keywd4        .default:n =  ,
  
    keywd4style   .usage:n   =   general,
    keywd4style   .code:n    =  { \tl_set:Nn \l__codelist_keywdDstyle_tl {#1} },
    keywd4style   .default:n =  \bfseries\__codecmm_color_select:n{ c__codelist_keywdD_color } ,
  
    setemph       .usage:n   =   general,
    setemph       .code:n    =  { \tl_set:Nn \l__codelist_emphA_tl {#1} },
    setemph       .default:n =  ,
  
    emph          .usage:n   =   general,
    emph          .code:n    =  { \tl_put_right:Nn \l__codelist_emphA_tl { , #1} },
    emph          .default:n =  ,
  
    emphstyle     .usage:n   =   general,
    emphstyle     .code:n    =  { \tl_set:Nn \l__codelist_emphAstyle_tl {#1} },
    emphstyle     .default:n =  \bfseries\__codecmm_color_select:n{ c__codelist_emphA_color } ,
  
    setemph2      .usage:n   =   general,
    setemph2      .code:n    =  { \tl_set:Nn \l__codelist_emphB_tl {#1} },
    setemph2      .default:n =  ,
  
    emph2         .usage:n   =   general,
    emph2         .code:n    =  { \tl_put_right:Nn \l__codelist_emphB_tl { , #1} },
    emph2         .default:n =  ,
  
    emph2style    .usage:n   =   general,
    emph2style    .code:n    =  { \tl_set:Nn \l__codelist_emphBstyle_tl {#1} },
    emph2style    .default:n =  \bfseries\__codecmm_color_select:n{ c__codelist_emphB_color } ,
  
    setemph3      .usage:n   =   general,
    setemph3      .code:n    =  { \tl_set:Nn \l__codelist_emphC_tl {#1} },
    setemph3      .default:n =  ,
  
    emph3         .usage:n   =   general,
    emph3         .code:n    =  { \tl_put_right:Nn \l__codelist_emphC_tl { , #1} },
    emph3         .default:n =  ,
  
    emph3style    .usage:n   =   general,
    emph3style    .code:n    =  { \tl_set:Nn \l__codelist_emphCstyle_tl {#1} },
    emph3style    .default:n =  \bfseries\__codecmm_color_select:n{ c__codelist_emphC_color } ,
  
    setemph4      .usage:n   =   general,
    setemph4      .code:n    =  { \tl_set:Nn \l__codelist_emphD_tl {#1} },
    setemph4      .default:n =  ,
  
    emph4         .usage:n   =   general,
    emph4         .code:n    =  { \tl_put_right:Nn \l__codelist_emphD_tl { , #1} },
    emph4         .default:n =  ,
  
    emph4style    .usage:n   =   general,
    emph4style    .code:n    =  { \tl_set:Nn \l__codelist_emphDstyle_tl {#1} },
    emph4style    .default:n =  \bfseries\__codecmm_color_select:n{ c__codelist_emphD_color } ,
  
    stringstyle   .usage:n   =   general,
    stringstyle   .code:n    =  { \tl_set:Nn \l__codelist_stringstyle_tl {#1} },
    stringstyle   .default:n =  \__codecmm_color_select:n{ c__codelist_string_color } ,
  
    commentstyle  .usage:n   =   general,
    commentstyle  .code:n    =  { \tl_set:Nn \l__codelist_commentstyle_tl {#1} },
    commentstyle  .default:n =  \__codecmm_color_select:n{ c__codelist_comment_color } ,
  
    bckgndcolor   .usage:n   =   general,
    bckgndcolor   .code:n    =  { \tl_set:Nn \l__codelist_bckgndcolor_tl { \__codecmm_color_select:n {#1} } },
    bckgndcolor   .default:n =  c__codelist_bckgnd_color ,
  
    rulecolor     .usage:n   =   general,
    rulecolor     .code:n    =  { \tl_set:Nn \l__codelist_rulecolor_tl { \__codecmm_color_select:n {#1} } },
    rulecolor     .default:n =  c__codelist_rule_color ,
  
    firstnumber   .usage:n   =   general,
    firstnumber   .code:n    =  { \tl_set:Nn \l__codelist_firstnumber_tl {#1} },
    firstnumber   .default:n =  last,
  
    numbers       .usage:n   =   general,
    numbers       .code:n    =  { \tl_set:Nn \l__codelist_numbers_tl {#1} },
    numbers       .default:n =  left,
  
    numberstyle   .usage:n   =   general,
    numberstyle   .code:n    =  { \tl_set:Nn \l__codelist_numberstyle_tl {#1} },
    numberstyle   .default:n =  \tiny\__codecmm_color_select:n{ c__codelist_number_color },
  
    parindent     .usage:n   =   general,
    parindent     .code:n    =  { \dim_set:Nn\l__codelist_demo_parindent_dim{#1} },
    parindent     .default:n =  \l__codelist_org_parindent_dim,
  
  	codeprefix    .usage:n   =   general,
  	codeprefix    .code:n    =  { \tl_set:Nn \l__codelist_codeprefix_tl {#1} },
    codeprefix    .default:n =  \LaTeX{} Code:,
  
  	resultprefix  .usage:n   =   general,
  	resultprefix  .code:n    =  { \tl_set:Nn \l__codelist_resultprefix_tl {#1} },
    resultprefix  .default:n =  \LaTeX{} Result:,
  
    ruleht        .usage:n   =   general,
    ruleht        .code:n    =  { \tl_set:Nn \l__codelist_ruleheight_tl {#1} },
    ruleht        .default:n =  1,
    
    letter        .usage:n   =   general,
    letter        .code:n    =  { \tl_set:Nn \l__codelist_alsoletter_tl {#1} },
    letter        .default:n =  { _ , : , @ },
    
    other        .usage:n    =   general,
    other        .code:n     =  { \tl_set:Nn \l__codelist_alsoother_tl {#1} },
    other        .default:n  =  { },
    
    basicstyle    .usage:n   =   general,
    basicstyle    .code:n    =  { \tl_set:Nn \l__codelist_basicstyle_tl {#1} },
    basicstyle    .default:n =  \footnotesize\ttfamily ,
  }

%%%%%%
%%% This one can't be protected
%%%%%%
\cs_new:Npn \__codelist_set_options:n #1 
  { \keys_set:nn {codelist / options}{#1} }

\__codelist_set_options:n 
  {
    settexcs     , texcsstyle   , settexcs2    , texcs2style , 
    settexcs3    , texcs3style  , settexcs4    , texcs4style ,
	  setkeywd     , keywdstyle   , setkeywd2    , keywd2style , 
    setkeywd3    , keywd3style  , setkeywd4    , keywd4style ,
	  setemph      , emphstyle    , setemph2     , emph2style  , 
    setemph3     , emph3style   , setemph4     , emph4style  ,
	  stringstyle  , commentstyle , basicstyle   , lststyle    , 
	  numbers=none , numberstyle  , codeprefix   , resultprefix ,
    bckgndcolor  , rulecolor    , ruleht       , parindent    ,
    letter       , other        , firstnumber
  }

%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%
%%%
%%%  From doctools.dtx file
%%% lstlistings 'definitions'
%%%
%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%

%%% listings
%

\cs_new_protected:Npn \__codelist_set_style:nn #1#2
  {
    \lstdefinestyle{codestyle}{
      extendedchars     =      true  , % allows or prohibits extended characters
      keepspaces        =      true  ,   %
      linewidth         =      \linewidth  ,   % defines the base line width for listings.
      showlines         =      false  , % prints empty lines at the end of listings
                                  %%%  Space and placement
      floatplacement    =      tbp  ,      % is used as float place specifier
      boxpos            =      c  , % c  ,b  ,t
                                  %%% characters
                                  % in listings  , that means (national)
                                  % characters of codes 128-255.
      upquote           =      true  ,   % determines printing of quotes
      tabsize           =      2  ,   % chars of tab
      showtabs          =      false  ,   % do not show tabs
      showspaces        =      false  ,   % do not show spaces
      showstringspaces  =      false  ,   % do not show blank spaces in string
    
      numberbychapter   =      true  ,   %
      captionpos        =      b  ,   % t  ,b
      abovecaptionskip  =      \smallskipamount  , % the vertical space respectively above
      belowcaptionskip  =      \smallskipamount  , % or below each caption
                                  %%% Margins and line shape
      xleftmargin       =      0pt  ,   % extra margins
      xrightmargin      =      0pt  ,   %
      resetmargins      =      false  ,   % indention from list environments like enumerate
                                  % or itemize is reset  , i.e. not used.
      columns           =      flexible  ,   % 
          %%%
          %%%
          %%% 
      language          =     [LaTeX]TeX  ,
    
      #1                %% This should end in a comma
    
          %%%
          %%%
          %%% 
    	basicstyle        =      {\l__codelist_basicstyle_tl}  , %%\footnotesize\ttfamily  ,  
    
      numberstyle       =      {\l__codelist_numberstyle_tl}  ,   % style of numbers
      numbersep         =      5pt  ,            % distance to text
      numberblanklines  =      true  ,    %
      stepnumber        =      1  ,             % seperation between numbers
      numberfirstline   =      false  ,    % number first line always
        
      rulecolor         =      {\l__codelist_rulecolor_tl}  ,
    	backgroundcolor   =      {\l__codelist_bckgndcolor_tl}  ,
      stringstyle       =      {\l__codelist_stringstyle_tl}  ,
      commentstyle      =      {\l__codelist_commentstyle_tl}  ,
      
      %morecomment       =      [if][][2]{//} ,
      %morecomment       =      [if][\color{red}][2]{//} , %{#2} ,
      
      framerule         =      0pt  ,                        %0.4pt  ,
    	nolol             =      true  ,
    	frame             =      none  ,
    	aboveskip         =      0pt  ,%-2ex  ,
      belowskip         =      0pt  ,%-2ex  ,
      lineskip          =      0pt  , % specifies additional space between lines in listings.
      
    	rulesep           =      0pt  ,
      breakatwhitespace =      false  ,   % allows line breaks only at white space.
      breakautoindent   =      true  ,   % apply intendation	
      breaklines        =      true  ,
    	breakindent       =      3em  ,
%    	moretexcs         =      {\l__codelist_texcsA_tl}  ,
%      moretexcs         =  [2] {\l__codelist_texcsB_tl}  ,
%      moretexcs         =  [3] {\l__codelist_texcsC_tl}  ,
%      moretexcs         =  [4] {\l__codelist_texcsD_tl}  ,
      texcsstyle        = *    {\l__codelist_texcsAstyle_tl}  ,
    	texcsstyle        = *[2] {\l__codelist_texcsBstyle_tl}  ,
    	texcsstyle        = *[3] {\l__codelist_texcsCstyle_tl}  ,
    	texcsstyle        = *[4] {\l__codelist_texcsDstyle_tl}  ,
%    	morekeywords      =      {\l__codelist_keywdA_tl}  ,
%    	morekeywords      =  [2] {\l__codelist_keywdB_tl}  ,
%    	morekeywords      =  [3] {\l__codelist_keywdC_tl}  ,
%    	morekeywords      =  [4] {\l__codelist_keywdD_tl}  ,
      keywordstyle      =      {\l__codelist_keywdstyle_tl}  ,
    	keywordstyle      =  [2] {\l__codelist_keywdBstyle_tl}  ,
    	keywordstyle      =  [3] {\l__codelist_keywdCstyle_tl}  ,
    	keywordstyle      =  [4] {\l__codelist_keywdDstyle_tl}  ,
%    	emph              =      {\l__codelist_emphA_tl}  ,
%    	emph              =  [2] {\l__codelist_emphB_tl}  ,
%    	emph              =  [3] {\l__codelist_emphC_tl}  ,
%    	emph              =  [4] {\l__codelist_emphD_tl}  ,
      emphstyle         =      {\l__codelist_emphAstyle_tl}  ,
      emphstyle         =  [2] {\l__codelist_emphBstyle_tl}  ,
      emphstyle         =  [3] {\l__codelist_emphCstyle_tl}  ,
      emphstyle         =  [4] {\l__codelist_emphDstyle_tl}  ,
    }
  }
\cs_generate_variant:Nn \__codelist_set_style:nn {V,Ve}

\__codelist_set_style:Ve \l__codelist_pckopt_dialect_tl {\char_generate:nn{13}{12}}
%\__codelist_set_style:Vn \l__codelist_pckopt_dialect_tl {^^M}

\lstset{style=codestyle}

%%%
%%% extending scontents package options !!!!
%%% changing it's default key handling from \msg_error to 'store-env'.
%%%
\keys_define:nn { scontents / scontents}
  {
  	st          .meta:nn          = 
      { scontents } 
      { store-env = {#1} } ,
    st          .value_required:n = true ,
  	store-at    .meta:nn          = 
      { scontents } 
      { store-env = {#1} } ,
    store-at    .value_required:n = true,
    unknown     .undefine: ,
    unknown     .code:n           = 
      { 
        \keys_set:ne {scontents}
          { store-env = {\l_keys_key_str} } 
      }
 }

\newenvsc{codestore}


%%%%%%%%%
%%%
%%% yep, redefining <verbatimsc> environment from scontents
%%% to change the 'listings' defaults/highlights !
%%%
%%%%%%%%%

%%%%%%%%%%%%%%
%%%
%%% Remember to keep this consistent with 
%%% \lstnewenvironment{codesyntax*}[1][]
%%%
%%%%%%%%%%%%%%

\cs_undefine:c{verbatimsc}
\cs_undefine:c{verbatimsc@@}
\cs_undefine:c{verbatimsc@}
\cs_undefine:c{endverbatimsc}

\lstnewenvironment{verbatimsc}
  {
    \exp_args:Ne \lstset
      {
        style         =     \l__codelist_basestyle_tl,
        alsoletter    =     {\l__codelist_alsoletter_tl},
        alsoother     =     {\l__codelist_alsoother_tl},
        moretexcs     =     {\l__codelist_texcsA_tl},
        moretexcs     =[2]  {\l__codelist_texcsB_tl},
        moretexcs     =[3]  {\l__codelist_texcsC_tl},
        moretexcs     =[4]  {\l__codelist_texcsD_tl},
  		  morekeywords  =     {\l__codelist_keywdA_tl},
        morekeywords  =[2]  {\l__codelist_keywdB_tl},
        morekeywords  =[3]  {\l__codelist_keywdC_tl},
        morekeywords  =[4]  {\l__codelist_keywdD_tl},
  		  emph          =     {\l__codelist_emphA_tl}, 
        emph          =[2]  {\l__codelist_emphB_tl}, 
        emph          =[3]  {\l__codelist_emphC_tl},
        emph          =[4]  {\l__codelist_emphD_tl},
  	    numbers       =     \l__codelist_numbers_tl,
        firstnumber   =     \l__codelist_firstnumber_tl,
      }
  }
  {}


\NewDocumentCommand \setcodekeys {m}
  {
    \keys_set:nn {codelist / options}{#1}
  }

\NewDocumentCommand \newcodekey {mm}
  {
    \keys_define:nn {codelist / options}
      {
        #1 .meta:nn = {codelist / options} { #2 } ,
        #1 .value_forbidden:n = true ,
      }
  }  

\NewDocumentCommand \setnewcodekey {mm}
  {
    \msg_warning:nnnnn {codelist} {deprecated} {codekey01}
      {\setnewcodekey} {\newcodekey}
    \newcodekey{#1}{#2}
  }

\cs_new_protected:Npn \__codelist_ts_settings:nn #1#2
  {
    \bool_if:NTF #1
      { % paragraph wide OR one below the other
        \dim_set:Nn \l__codelist_width_dim {\l__codecmm_textcolwidth_dim}
        \dim_set:Nn \l__codelist_offset_dim {0pt}
        \cs_set:Npn \__codelist_rule_in: {\__codecmm_rule:n {\l__codelist_ruleheight_tl}}
        \cs_set:Npn \__codelist_rule_out: {}
      }
      { % half as wide OR side-by-side
        \dim_set:Nn \l__codelist_width_dim {0.5\l__codecmm_textcolwidth_dim}
        \dim_set:Nn \l__codelist_offset_dim {0.5\l__codelist_width_dim}
        \cs_set:Npn \__codelist_rule_in: {}
        \cs_set:Npn \__codelist_rule_out: {\__codecmm_rule:n {\l__codelist_ruleheight_tl}}
      }
  
      \__codelist_set_options:n {#2}
      \tl_if_blank:VTF \l__codelist_codeprefix_tl
        {
          \vcoffin_set:Nnn \__codelist_code_label_coffin {\l__codelist_width_dim}
            {}
        }
        {
          \vcoffin_set:Nnn \__codelist_code_label_coffin {\l__codelist_width_dim}
            {
              \raggedright
              \l__codelist_codeprefix_tl
            }
        }
        
%       \coffin_show_structure:N \__codelist_code_label_coffin

      \tl_if_blank:VTF \l__codelist_resultprefix_tl
        {
          \vcoffin_set:Nnn \__codelist_demo_label_coffin {\l__codelist_width_dim}
            {}
        }
        {
          \vcoffin_set:Nnn \__codelist_demo_label_coffin {\l__codelist_width_dim}
            {
              \raggedright
              \l__codelist_resultprefix_tl
            }
        }
  }

\cs_new_protected:Npn \__codelist_codecoffin:nnnn #1#2#3#4
  {
    \vcoffin_set:Nnn \__codelist_code_coffin {\l__codelist_width_dim}
      {
        \raggedright #4
        \tl_if_blank:nTF {#2}
          { #3 {#1} }
          { #3 [#2]{#1} }
      }
  }

\cs_new_protected:Npn \__codelist_democoffin:nn #1#2
  {
    \vcoffin_set:Nnn \__codelist_demo_coffin {\l__codelist_width_dim}
      { 
        \__codelist_rule_in:
        \group_begin:
%          \skip_vertical:n {\l__codecmm_largerskip_dim}
          \skip_vertical:n {\l__codecmm_tinyskip_dim}
          \setlength\parindent{\l__codelist_demo_parindent_dim}
          \tl_if_blank:nTF {#2}
            { \getstored {#1} }
            { \getstored [#2]{#1} }
          \skip_vertical:n {\l__codecmm_tinyskip_dim}
        \group_end:
        \__codelist_rule_in:
      }
  }

\cs_new_protected:Npn \__codelist_ts_code:nnnnn #1#2#3#4#5
  {
    \__codecmm_set_textcolwidth:
    \group_begin:
      \__codelist_ts_settings:nn {#1}{#2}
      \__codelist_codecoffin:nnnn {#3}{#4}{#5}{}
      
        \coffin_join:NnnNnnnn
          \__codelist_code_label_coffin {l}{b}
          \__codelist_code_coffin {l}{t}
          {0pt}{-1ex}
        \skip_vertical:n{-1ex}\noindent
        \coffin_typeset:Nnnnn \__codelist_code_label_coffin {l}{t}{\l__codelist_offset_dim}{0pt}
        \bool_if:NTF \l__codelist_tscode_peek_bool
          { \skip_vertical:n {\l__codecmm_large_skip} }
          { \skip_vertical:n {\l__codecmm_largeline_skip} }
    \group_end: 
  }


\bool_new:N \l__codelist_tscode_peek_bool
\tl_new:N \l__codelist_tscode_tl

\regex_const:Nn \c__codelist_peek_regex 
  {
    \c{typesetcode} | \c{tscode} | \c{typesetmergedcode} | \c{tsmergedcode} | 
    \c{typesetdemo} | \c{tsdemo} | \c{typesetresult} | \c{tsresult}
  }

\xpeekahead_set:NNTF
  \__codelist_cmd_peek_tscode:
  \c__codelist_peek_regex
  { 
   \bool_set_true:N  \l__codelist_tscode_peek_bool
    \l__codelist_tscode_tl
  }
  { 
    \bool_set_false:N \l__codelist_tscode_peek_bool
    \l__codelist_tscode_tl
  }    
  



\NewDocumentCommand{\tscode}{sO{}mO{}}
  {
    \tl_set:Nn \l__codelist_tscode_tl { \__codelist_ts_code:nnnnn {#1}{#2}{#3}{#4}{\typestored} }
    \xpeekahead_cmd_peek:N \__codelist_cmd_peek_tscode:
  }
\cs_new_eq:NN \typesetcode \tscode 


\NewDocumentCommand{\tsmergedcode}{sO{}m}
  {
    \tl_set:Nn \l__codelist_tscode_tl { \__codelist_ts_code:nnnnn {#1}{#2}{#3}{}{\mergesc[typestored,print-cmd]} }
    \xpeekahead_cmd_peek:N \__codelist_cmd_peek_tscode:
  }
\cs_new_eq:NN \typesetmergedcode \tsmergedcode

\coffin_new:N \__codelist_code_coffin
\coffin_new:N \__codelist_code_label_coffin
\coffin_new:N \__codelist_demo_coffin
\coffin_new:N \__codelist_demo_label_coffin
\coffin_new:N \__codelist_code_demo_coffin

\dim_new:N \l__codelist_width_dim
\dim_new:N \l__codelist_offset_dim

\dim_new:N \l__codelist_code_height_dim
\dim_new:N \l__codelist_demo_height_dim


\cs_new_protected:Npn \__codelist_ts_democode:nnnn #1#2#3#4
  {
    \__codecmm_set_textcolwidth:
    \group_begin:
      \par\setlength\parindent{0pt}
      \__codelist_ts_settings:nn {#1}{#2}
      
      \__codelist_codecoffin:nnnn {#3}{#4}{\typestored}{ \skip_vertical:n {0.1ex} }
      \__codelist_democoffin:nn {#3}{#4}

      \bool_if:NTF #1
        { % one below the other
          \coffin_join:NnnNnnnn
            \__codelist_code_label_coffin {l}{b}
            \__codelist_code_coffin {l}{t}
            {0pt}{-1ex}
          \skip_vertical:n {-1ex}
          \coffin_typeset:Nnnnn \__codelist_code_label_coffin {l}{t}{0pt}{0pt}
          \skip_vertical:n {1ex}
          \coffin_join:NnnNnnnn
            \__codelist_demo_label_coffin {l}{b}
            \__codelist_demo_coffin {l}{t}
            {0pt}{-1ex}
          \coffin_typeset:Nnnnn \__codelist_demo_label_coffin {l}{t}{0pt}{0pt}
          \bool_if:NTF \l__codelist_tscode_peek_bool
            { \skip_vertical:n {\l__codecmm_large_skip} }
            { \skip_vertical:n {\l__codecmm_largeline_skip} }
        }
        { % side-by-side          
          \dim_set:Ne \l__codelist_code_height_dim { \coffin_ht_plus_dp:N \__codelist_code_coffin}
          \dim_set:Ne \l__codelist_demo_height_dim { \coffin_ht_plus_dp:N \__codelist_demo_coffin}

          \coffin_join:NnnNnnnn
            \__codelist_code_label_coffin {r}{b}
            \__codelist_demo_label_coffin {l}{b}
            {0pt}{0pt}    
          \coffin_join:NnnNnnnn
            \__codelist_code_coffin {r}{vc}
            \__codelist_demo_coffin {l}{vc}
            {0pt}{0pt}  
              
        %%%
        %%% a new coffin, just to have the rules inside
        %%%     
          \dim_compare:nNnTF \l__codelist_code_height_dim < \l__codelist_demo_height_dim
            {
              \vcoffin_set:Nnn \__codelist_code_demo_coffin {2\l__codelist_width_dim}
                {
                  \coffin_typeset:Nnnnn \__codelist_code_label_coffin {l}{t}{0pt}{0pt}
                  \skip_vertical:n {0.5ex}
                  \__codelist_rule_out:
%                  \skip_vertical:n {0.8611pt}  % was 0.20ex
                  \skip_vertical:n {0.20ex}  % was 0.20ex
                  \coffin_typeset:Nnnnn \__codelist_code_coffin {l}{t}{0pt}{0pt}
%                  \skip_vertical:n {0.8611pt}  % was 0.20ex
                  \skip_vertical:n {0.20ex}  % was 0.20ex
                  \__codelist_rule_out:
                }
            }
            {
              \vcoffin_set:Nnn \__codelist_code_demo_coffin {2\l__codelist_width_dim}
                {
                  \coffin_typeset:Nnnnn \__codelist_code_label_coffin {l}{t}{0pt}{0pt}                  
                  \skip_vertical:n {0.5ex}
                  \__codelist_rule_out:
                  \skip_vertical:n {0.8611pt} % was 0.20ex
                  \coffin_typeset:Nnnnn \__codelist_code_coffin {l}{t}{0pt}{0pt}
                  \skip_vertical:n {1.0764pt} % was 0.25ex
                  \__codelist_rule_out:
                }
            }

          \coffin_typeset:Nnnnn \__codelist_code_demo_coffin {l}{t}{0pt}{0pt}
          
          \bool_if:NTF \l__codelist_tscode_peek_bool
            { \skip_vertical:n {\l__codecmm_large_skip} }
            { \skip_vertical:n {\l__codecmm_largeline_skip} }
        }
    \group_end:
  }
  
\NewDocumentCommand{\tsdemo}{sO{}mO{}}
  {
    \tl_set:Nn \l__codelist_tscode_tl { \__codelist_ts_democode:nnnn {#1}{#2}{#3}{#4} }
    \xpeekahead_cmd_peek:N \__codelist_cmd_peek_tscode: 
  }
\cs_new_eq:NN \typesetdemo \tsdemo 

\NewDocumentCommand{\tsexec}{mO{}}
  {
    \tl_if_blank:nTF {#2}
      { \getstored{#1} }
      { \getstored[#2]{#1} }
  }

\cs_new_protected:Npn \__codelist_ts_demo:nnnn #1#2#3#4
  {
    \__codecmm_set_textcolwidth:
    \group_begin:
      \par\setlength\parindent{0pt}
      \__codelist_ts_settings:nn {#1}{#2}
      
      \cs_set:Npn \__codelist_rule_in: {\__codecmm_rule:n {\l__codelist_ruleheight_tl}}
    
      \__codelist_democoffin:nn {#3}{#4}

      \coffin_join:NnnNnnnn
        \__codelist_demo_label_coffin {l}{b}
        \__codelist_demo_coffin {l}{t}
        {0pt}{-1ex}
      \coffin_typeset:Nnnnn \__codelist_demo_label_coffin {l}{t}{\l__codelist_offset_dim}{0pt}
        \bool_if:NTF \l__codelist_tscode_peek_bool
          { \skip_vertical:n {\l__codecmm_large_skip} }
          { \skip_vertical:n {\l__codecmm_largeline_skip} }
    \group_end:
  }

\NewDocumentCommand{\tsresult}{sO{}mO{}}
  {
    \tl_set:Nn \l__codelist_tscode_tl { \__codelist_ts_demo:nnnn {#1}{#2}{#3}{#4} }
    \xpeekahead_cmd_peek:N \__codelist_cmd_peek_tscode:
  }
\cs_new_eq:NN \typesetresult \tsresult 


%%%
%%% from https://en.wikibooks.org/wiki/LaTeX/Source_Code_Listings#Encoding_issue
\lstset{literate=
  {á}{{\'a}}1 {é}{{\'e}}1 {í}{{\'i}}1 {ó}{{\'o}}1 {ú}{{\'u}}1
  {Á}{{\'A}}1 {É}{{\'E}}1 {Í}{{\'I}}1 {Ó}{{\'O}}1 {Ú}{{\'U}}1
  {à}{{\`a}}1 {è}{{\`e}}1 {ì}{{\`i}}1 {ò}{{\`o}}1 {ù}{{\`u}}1
  {À}{{\`A}}1 {È}{{\'E}}1 {Ì}{{\`I}}1 {Ò}{{\`O}}1 {Ù}{{\`U}}1
  {ä}{{\"a}}1 {ë}{{\"e}}1 {ï}{{\"i}}1 {ö}{{\"o}}1 {ü}{{\"u}}1
  {Ä}{{\"A}}1 {Ë}{{\"E}}1 {Ï}{{\"I}}1 {Ö}{{\"O}}1 {Ü}{{\"U}}1
  {â}{{\^a}}1 {ê}{{\^e}}1 {î}{{\^i}}1 {ô}{{\^o}}1 {û}{{\^u}}1
  {Â}{{\^A}}1 {Ê}{{\^E}}1 {Î}{{\^I}}1 {Ô}{{\^O}}1 {Û}{{\^U}}1
	{ã}{{\~{a}}}1 {Ã}{{\~{A}}}1 
  {õ}{{\~{o}}}1	{Õ}{{\~{O}}}1
	{ñ}{{\~{n}}}1 {Ñ}{{\~{N}}}1
  {ý}{{\'{y}}}1 {Ý}{{\'{Y}}}1  {ÿ}{{\"{y}}}1 {Ÿ}{{\"{Y}}}1
  {œ}{{\oe}}1 {Œ}{{\OE}}1 {æ}{{\ae}}1 {Æ}{{\AE}}1 {ß}{{\ss}}1
  {ç}{{\c c}}1 {Ç}{{\c C}}1 {ø}{{\o}}1 {å}{{\r a}}1 {Å}{{\r A}}1
  {€}{{\EUR}}1 {£}{{\pounds}}1
}
  
\endinput
