% ----------------------------------------------------------------------------
% the EXSHEETS-LISTINGS package
% 
%   Using listings with exsheets
% 
% ----------------------------------------------------------------------------
% Clemens Niederberger
% Web:    https://bitbucket.org/cgnieder/exsheets/
% E-Mail: contact@mychemistry.eu
% ----------------------------------------------------------------------------
% Copyright 2011-2019 Clemens Niederberger
% 
% This work 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.
% 
% This work has the LPPL maintenance status `maintained'.
% 
% The Current Maintainer of this work is Clemens Niederberger.
% ----------------------------------------------------------------------------
% If you have any ideas, questions, suggestions or bugs to report, please
% feel free to contact me.
% ----------------------------------------------------------------------------
\RequirePackage{exsheets,listings}
% we need this loaded before expl3 syntax is activated:
\lst@RequireAspects{writefile}
\ExplSyntaxOn
\ProvidesExplPackage{exsheets-listings}
  {\c_exsheets_date_tl}
  {\c_exsheets_version_tl}
  {listings~ in~ exsheets}

% ----------------------------------------------------------------------------
% variables:
\int_new:N \g__exsheets_listings_question_int
\int_new:N \g__exsheets_listings_solution_int

\tl_new:N  \l__exsheets_listings_question_pre_tl
\tl_new:N  \l__exsheets_listings_question_post_tl
\tl_new:N  \l__exsheets_listings_question_options_tl
\tl_new:N  \l__exsheets_listings_question_code_tl
\tl_new:N  \l__exsheets_listings_solution_pre_tl
\tl_new:N  \l__exsheets_listings_solution_post_tl
\tl_new:N  \l__exsheets_listings_solution_options_tl
\tl_new:N  \l__exsheets_listings_solution_code_tl
\tl_new:N  \l__exsheets_listings_question_points_tl

% ----------------------------------------------------------------------------
% listings style for questions and solutions:
\keys_define:nn {exsheets}
  {
    question / listings .tl_set:N = \l__exsheets_listings_question_code_tl ,
    solution / listings .tl_set:N = \l__exsheets_listings_solution_code_tl
  }

% ----------------------------------------------------------------------------
% expansion help:
\cs_new:Npn \__exsheets_question_expandopt:Nnnnn #1#2#3#4#5
  { #1{#2}[#3]{#4}#5 }
\cs_generate_variant:Nn \__exsheets_question_expandopt:Nnnnn { NnVox }

\cs_new:Npn \__exsheets_question_expand_opt_and_body:Nnnn #1#2#3#4
  { #1{#2}[#3]#4 }
\cs_generate_variant:Nn \__exsheets_question_expand_opt_and_body:Nnnn { NnVx }

% ----------------------------------------------------------------------------
% lstquestion environment:
\keys_define:nn { exsheets / listings / question }
  {
    pre      .tl_set:N = \l__exsheets_listings_question_pre_tl ,
    post     .tl_set:N = \l__exsheets_listings_question_post_tl ,
    options  .tl_set:N = \l__exsheets_listings_question_options_tl ,
    points   .tl_set:N = \l__exsheets_listings_question_points_tl ,
    listings .tl_set:N = \l__exsheets_listings_question_code_tl ,
  }

\keys_define:nn { exsheets / listings / solution }
  {
    pre      .tl_set:N = \l__exsheets_listings_solution_pre_tl ,
    post     .tl_set:N = \l__exsheets_listings_solution_post_tl ,
    options  .tl_set:N = \l__exsheets_listings_solution_options_tl ,
    listings .tl_set:N = \l__exsheets_listings_solution_code_tl ,
  }

\cs_new:Npn \exsheets_listings_new_lstenvironment:nnnnnnn #1#2#3#4#5#6#7
  {
    \lstnewenvironment{#2}[1][]
      {
        \keys_set:nn {exsheets/listings/question} {#1,#4,##1}
        \int_gincr:N \g__exsheets_listings_question_int
        \lst@BeginWriteFile
          { \c_sys_jobname_str - ex \int_use:N \g__exsheets_listings_question_int . lst }
      }
      {
        \lst@EndWriteFile
        \__exsheets_question_expandopt:NnVox
          \begin {#3}
          \l__exsheets_listings_question_options_tl
          { \l__exsheets_listings_question_points_tl }
          {
            \exp_not:V \l__exsheets_listings_question_pre_tl
            \exp_not:N \lstinputlisting
              [ \exp_not:V \l__exsheets_listings_question_code_tl ]
              { \c_sys_jobname_str - ex \int_use:N \g__exsheets_listings_question_int . lst }
            \exp_not:V \l__exsheets_listings_question_post_tl
          }
        \end {#3}
      }
    \lstnewenvironment{#5}[1][]
      {
        \keys_set:nn { exsheets / listings / solution } { #1,#7,##1 }
        \int_gincr:N \g__exsheets_listings_solution_int
        \lst@BeginWriteFile
          { \c_sys_jobname_str - sol \int_use:N \g__exsheets_listings_solution_int . lst }
      }
      {
        \lst@EndWriteFile
        \__exsheets_question_expand_opt_and_body:NnVx
          \begin {#6}
          \l__exsheets_listings_solution_options_tl
          {
            \exp_not:V \l__exsheets_listings_solution_pre_tl
            \exp_not:N \lstinputlisting
              [ \exp_not:V \l__exsheets_listings_solution_code_tl ]
              { \c_sys_jobname_str - sol \int_use:N \g__exsheets_listings_solution_int . lst }
            \exp_not:V \l__exsheets_listings_solution_post_tl
          }
        \end {#6}
      }
  }

\NewDocumentCommand \NewLstQuSolPair { O{}mmO{}mmO{} }
  { \exsheets_listings_new_lstenvironment:nnnnnnn {#1}{#2}{#3}{#4}{#5}{#6}{#7} }

\NewLstQuSolPair{lstquestion}{question}{lstsolution}{solution}

\file_input_stop:

HISTORY
2013/09/18 - first draft, see http://tex.stackexchange.com/a/133969/5049
2013/10/11 - first official version bundled with ExSheets
2017/02/08 - change deprecated \c_job_name_tl into the new \c_sys_jobname_str