\RequirePackage{xcolor}
\RequirePackage{listings}

\lstdefinelanguage{pseudocode}
{morekeywords={procedure,function,end,loop,return,to,local,Value,fail,if,then,do,for,else,elif,foreach,in,true,false,
 inputs,returns,persistent,repeat,until,while},
  morecomment=[s]{(*}{*)},
  morecomment=[s]{/*}{*/},   % preferred over (* ... *)
  morecomment=[s][\sl]{<}{>}
}

\lstdefinelanguage[sTeX]{TeX}[LaTeX]{TeX}%
  {moretexcs={[2]definiendum,definame,symref,symname,comp,
      importmodule,usemodule
      symdef,symdecl,notation,sref},
   morekeywords={smodule,sdefinition,sassertion,sparagraph,
     inputref,
     sproblem,hint,exnote,solution,gnote,
     sproof,spfstep,spfcases,spfcase,justification,premise}}

\definecolor{backcolor}{gray}{.96}

\lstset{columns=fullflexible,basicstyle=\ttfamily}
\lstset{frame=none,numbers=none,lineskip=-.7ex}%,aboveskip=-1em,belowskip=-2em}
\lstset{keywordstyle=[2]\color{red},keywordstyle=[3]\color{blue}}
\lstset{keywordstyle=[4]\color{green},keywordstyle=[5]\color{magenta}}
\lstset{emphstyle=[2]\color{red},emphstyle=[3]\color{blue}}
\lstset{emphstyle=[4]\color{green},emphstyle=[5]\color{magenta}}
\lstset{commentstyle=\color{brown}}
\lstset{backgroundcolor=\color{backcolor}}
\newcommand{\lstkeycolor}[2]{\ifcase#1\textbf{#1}\or\red{#2}\or\blue{#2}\or\green{#2}\or\magenta{#2}\fi}
\define@key{stexlisting}{id}{\def\sref@id{#1}}
\define@key{stexlisting}{id}{\def\stexlst@id{#1}}

\definecolor{semanticmacrocolor}{HTML}{008800}

\lstdefinelanguage{sTeX}{
  sensitive=true,
  numbers=left,
  numbersep=3pt,
  xleftmargin=3pt,
  alsoother={$()$},
  alsoletter={\\},
  escapechar=|,
  %moredelim = [s][\itshape]{$}{$},
  %moredelim = [s][\itshape\bfseries]{\\[}{\\]},
  classoffset=0,keywordstyle=\bfseries,morekeywords={
      \\begin,\\end,\\ExplSyntaxOn,\\ExplSyntaxOff,\\documentclass,
      \\usepackage,\\def,\\[,\\],\\else,\\fi,
      \\newcommand, \\renewcommand, \\let,\$
  },	
  classoffset=1,keywordstyle=\itshape\color{semanticmacrocolor},morekeywords={
    % semantic macros
  },	
  classoffset=2,keywordstyle=\color{blue},morekeywords={
    \\symdecl,\\symdef,\\notation,\\vardef,\\varseq,
    \\textsymdecl, \\renamedecl, \\assign, \\setnotation,
    \\STEXexport
  },
  classoffset=3,keywordstyle=\color{orange},morekeywords={
    \\importmodule,\\usemodule,\\libinput,\\inputref,\\mhinput,
    \\libusepackage,\\addmhbibresource,\\ifinputref,\\copymod,
    \\ifstexhtml, \\IfInputref,\\requiremodule,\\realize,\\usestructure
  },
  classoffset=4,keywordstyle=\color{purple},morekeywords={
    \\definiendum,\\definame,\\Definame,\\symref,\\symname,\\comp,\\this,
    \\compemph,\\definiens,\\svar,\\infprec,\\neginfprec,\\ellipses,
    \\Symname,\\arg,\\yield,\\assumption,\\spfstep,\\eqstep,\\conclude,
    \\symref,\\sn,\\sr,\\sns,\\Sn,\\Sns,\\defnotation,\\symuse,\\maincomp,
    \\argsep,\\argmap,\\argarraymap,\\conclusion
  },
  classoffset=5,keywordstyle=\color{magenta},morekeywords={
    smodule,sdefinition,sassertion,sparagraph,sexample,
    sproof,subproof,spfcases,spfcase,spfstep,spfcomment,spfblock,
    sproblem,subproblem,solution,hint,exnote,mcb,scb,
    \\spfidea,\\spfsketch,\\spfcasesketch,\\sproofend,
    \\spfjust,\\premise,\\justarg,\\inlinedef,\\inlineex,\\inlineass,
    \\scc,\\mcc,\\objective,
    \\varbind,
    copymodule,interpretmodule,mathstructure,sexample,extstructure,
    extstructure*,realization
  },
  classoffset=6,keywordstyle=\color{cyan},morekeywords={
    sfragment,blindfragment,\\skipfragment,
    \\currentsectionlevel,\\Currentsectionlevel,\\setsectionlevel,
    \\prematurestop,\\afterprematurestop,
    \\setSGvar,\\useSGvar,\\ifSGvar,\\sref,\\sreflabel,\\extref,\\srefsetin,
    \\srefsym,\\srefsymuri
  },
  classoffset=7,keywordstyle=\color{brown},morekeywords={
    frame,note,\\ifnotes,\\setslidelogo,\\setsource,\\setlicensing
    slides,notes,sectocframes,frameimages,fiboxed,
    nparagraph, nparagraph, ndefinition, nexample, nsproof, nassertion,
    \\frameimage,\\mhframeimage,\\textwarning,
    \\activateexcursion,\\printexcursion,\\excursionref,\\excursiongroup
  },
  classoffset=8,keywordstyle=\color{red},morekeywords={
    frame,note
  },
  classoffset=9,keywordstyle=\color{gray},morekeywords={
    % variables
  }
}

\ExplSyntaxOn

\lstnewenvironment{stexcode}[1][]{
  \_lststex_parse_args:n{#1}
  \exp_args:No \lstset\l_lststex_return_tl
}{}

\newcommand\stexcodeinline[1][]{
  \_lststex_parse_args:n{#1}
  \exp_args:Nno \use:nn{\lstinline[} \l_lststex_return_tl ]
}

\keys_define:nn{ lststex }{
  symbols  .code:n = {
    \clist_map_inline:nn{#1}{
      \clist_put_right:Nn \l_lststex_symbols_clist {##1}
      \clist_put_right:Nn \l_lststex_symbols_clist {\\##1}
    }
  },
  variables  .code:n = {
    \clist_map_inline:nn{#1}{
      \clist_put_right:Nn \l_lststex_variables_clist {##1}
      \clist_put_right:Nn \l_lststex_variables_clist {\\##1}
    }
  },
  unknown   .code:n = {
    \str_if_empty:NTF \l_keys_key_str {
      \tl_if_empty:nTF{#1}{
        \exp_args:NNo \clist_put_right:Nn \l_lststex_pass_on_args_clist \l_keys_key_tl
      }{
        \exp_args:NNx \clist_put_right:Nn \l_lststex_pass_on_args_clist {
          \l_keys_key_tl = \exp_not:n{{#1}}
        }
      }
    }{
      \tl_if_empty:nTF{#1}{
        \exp_args:NNo \clist_put_right:Nn \l_lststex_pass_on_args_clist \l_keys_key_str
      }{
        \exp_args:NNx \clist_put_right:Nn \l_lststex_pass_on_args_clist {
          \l_keys_key_str = \exp_not:n{{#1}}
        }
      }
    }
  }
}

\cs_new_protected:Nn \_lststex_parse_args:n {
  \clist_clear:N \l_lststex_pass_on_args_clist
  \clist_put_right:Nn \l_lststex_pass_on_args_clist {language=sTeX}
  \clist_clear:N \l_lststex_symbols_clist
  \clist_clear:N \l_lststex_variables_clist
  \keys_set:nn { lststex }{ #1 }
  \tl_set:Nx \l_lststex_return_tl {
    \exp_args:No \exp_not:n \l_lststex_pass_on_args_clist
    \clist_if_empty:NF \l_lststex_symbols_clist {
      ,classoffset=1,morekeywords={
        \exp_args:No \exp_not:n \l_lststex_symbols_clist
      }
    }
    \clist_if_empty:NF \l_lststex_variables_clist {
      ,classoffset=9,morekeywords={
        \exp_args:No \exp_not:n \l_lststex_variables_clist
      }
    }
  }
}

\ExplSyntaxOff

% LocalWords:  lstdefinelanguage morekeywords morecomment moretexcs defin sref
% LocalWords:  twindef atwindef definalt twindefalt atwindefalt termref lstset
% LocalWords:  basicstyle scriptsize fullflexible lineskip aboveskip belowskip
% LocalWords:  keywordstyle keywordstyle newcommand lstkeycolor ifcase textbf
% LocalWords:  stexlisting stexlst sproof spfstep symdef spfcases spfcase tt
% LocalWords:  texcsstyle emphstyle emphstyle ttfamily