% Time-stamp: <2019-08-28 08:02:26 administrateur>
% Création : 2019-08-05T10:18:51+0200
%%%%% ---------------------------------------------------------------------
%%%%% © Yvon Henel, 2019
%%%%% ---------------------------------------------------------------------
\NeedsTeXFormat{LaTeX2e}[1999/12/01]
\RequirePackage{l3keys2e,xparse}
\ProvidesExplPackage
{dun19codepres} {2019/08/05} {1} {pour article dun19expl3}

\RequirePackage{xspace}
\RequirePackage{hologo}
\RequirePackage[dvipsnames]{xcolor}

%%%%% ---------------------------------------------------------------------
%%%%% outils
%%%%% ---------------------------------------------------------------------

\def\makeunderlineletter{\catcode`\_=11\relax}

\makeatletter

\newcommand\TdSfrCP@CODE{\texttt}

\let\CODE=\TdSfrCP@CODE

\newcommand\TdSfrCP@ENCODE{\ttfamily}

\newcommand\TdSfrCP@PRESENTATIONMETA{\TdSfrCP@ENCODE\itshape}

\DeclareRobustCommand\0{\discretionary{}{}{}}

\DeclareRobustCommand\1{\0\TdSfrCP@CODE{\_}\0}

\DeclareRobustCommand\2{\TdSfrCP@CODE{:}\0}

\DeclareRobustCommand\3{\discretionary{.}{}{.}}

\DeclareRobustCommand\6{\0\TdSfrCP@CODE{@}\0}

\DeclareRobustCommand\7{\0\TdSfrCP@CODE{/}\0}

\DeclareRobustCommand\9{%
  \hspace{0pt plus 1pt}\discretionary{}{}{}\hspace{0pt plus 1pt}}

\DeclareRobustCommand\8{\0\TdSfrCP@CODE{-}\0}

\newcommand{\Meta}[1]{%
  \ensuremath{\langle}{\TdSfrCP@PRESENTATIONMETA #1\/}\ensuremath{\rangle}}

\let\M=\Meta

%%%%% ---------------------------------------------------------------------
%%%%% Présentation extensions, etc.
%%%%% ---------------------------------------------------------------------

\newcommand{\Pkg}[1]{\texttt{#1}}

\newcommand{\Mdl}[1]{\textsf{#1}}

\newcommand*{\Expliii}{Expl3\xspace}

\newcommand*{\TdS}{TdS\xspace}

%%%%% ---------------------------------------------------------------------
%%%%% Présentation macros et arguments
%%%%% ---------------------------------------------------------------------

\DeclareRobustCommand\Cs[1]{\TdSfrCP@CODE{\char`\\#1}}

\newcommand\Accolades[1]{\TdSfrCP@CODE{\{\0#1\}}}

\newcommand{\Crochets}[1]{\TdSfrCP@CODE{[\0#1]}}

\newcommand{\Parentheses}[1]{\TdSfrCP@CODE{(\0#1)}}

\newcommand{\Inegalites}[1]{\TdSfrCP@CODE{\string<\0#1\string>}}

\DeclareRobustCommand\MargAux[1]{\TdSfrCP@CODE{\{\0\M{#1}\}}}
\DeclareRobustCommand\OargAux[1]{\TdSfrCP@CODE{[\0\M{#1}]}}
\DeclareRobustCommand\ParargAux[1]{\TdSfrCP@CODE{(\0\M{#1})}}
\DeclareRobustCommand\INEGargAux[1]{\TdSfrCP@CODE{\string<\0\M{#1}\string>}}

\newcounter{codefragment}[section]

\makeatother

% -------------------------------------------------------------------------
% Déclaration et présentation des macros et de leurs arguments
% -------------------------------------------------------------------------

\str_new:N \__CMD_vedette_str

\NewDocumentCommand{\MacroPresentation}{ m }{
  \textcolor{MidnightBlue}{\Cs{#1}}
}

\NewDocumentCommand{\FausseMacroPresentation}{ m }{
  \textcolor{RedOrange}{\Cs{#1}}
}

\NewDocumentCommand{\Macro}{s o v}{
  \IfBooleanTF{#1}
  {\FausseMacroPresentation{#3}}
  {
    \str_set:Nn \__CMD_vedette_str {#3}
    \str_replace_all:Nnn \__CMD_vedette_str {:} {+}
    \gls{\str_use:N \__CMD_vedette_str}
  }
}


\NewDocumentCommand{\Code}{s t+ v}{
  \IfBooleanTF{#1}
  { \Crochets{#3} }
  { \IfBooleanTF{#2}
    { \Parentheses{#3} }
    { \Accolades{#3} }
  }
}

\NewDocumentCommand{\Marg}{ s }{
  \IfBooleanTF{#1}
  { \Accolades }
  { \MargAux }
}

\NewDocumentCommand{\Oarg}{ s }{
  \IfBooleanTF{#1}
  { \Crochets }
  { \OargAux }
}

\NewDocumentCommand{\Parg}{ s }{
  \IfBooleanTF{#1}
  { \Parentheses }
  { \ParargAux }
}

\NewDocumentCommand{\Iarg}{ s }{
  \IfBooleanTF{#1}
  { \Inegalites }
  { \INEGargAux }
}

\NewDocumentCommand{\SyntaxeMacro}{ s o }{
  \IfBooleanF{#1}{\par}
  \IfNoValueTF{#2}
  { \SyntaxeMacro_Package_Courant }
  { \SyntaxeMacro_Autre_Package {#2} }
}

\NewDocumentCommand{\SyntaxeMacro_Package_Courant}{ m m }
{
  \Macro{#1} \TraiterListeArguments{#2}
}

\NewDocumentCommand{\SyntaxeMacro_Autre_Package}{ m m m }
{
  \Macro[#1]{#2} \TraiterListeArguments{#3}
}

\NewDocumentCommand {\TraiterListeArguments} 
{ > { \SplitList{ , } } m } {
  \ProcessList {#1} { \Traiter_un_argument }
}

\NewDocumentCommand {\Traiter_un_argument} { >{ \SplitArgument{1}{/} } m }
{
  \Traiter_un_argument_aux #1
}

\NewDocumentCommand {\Traiter_un_argument_aux} { m m }{
  \use:c {#1arg}{#2}\9 
}

%%%%% ---------------------------------------------------------------------
%%%%% Termes techniques, etc.
%%%%% ---------------------------------------------------------------------

\NewDocumentCommand{\VRAI}{ }{ \textsc{vrai}\xspace }

\NewDocumentCommand{\FAUX}{ }{ \textsc{faux}\xspace }

\NewDocumentCommand{\TANTQUE}{ }{
  \index{tant~que}\index{boucle}\index{boucle!tant~que}
  \textsc{tant~que}\xspace
}

\NewDocumentCommand{\JUSQUA}{}{
  \index{jusqu'à}\index{boucle}\index{boucle!jusqu'à}
  \textsc{jusqu'à}\xspace
}

\NewDocumentCommand{\POUR}{}{
  \index{pour}\index{boucle}\index{boucle!pour}
  \textsc{pour}\xspace
}

\NewDocumentCommand{\SIALORSSINON}{}{
  \index{si}\index{saut}\index{si!si~alors~sinon}
  \textsc{si}\dots{}~\textsc{alors}\dots{}~\textsc{sinon}\xspace
}

\NewDocumentCommand{\SIALORS}{}{
  \index{si}\index{saut}\index{si!si~alors}
  \textsc{si}\dots{}~\textsc{alors}\xspace
}

\NewDocumentCommand{\SISINON}{}{
  \index{si}\index{saut}\index{si!si~sinon}
  \textsc{si}\dots{}~\textsc{sinon}\xspace
}

\NewDocumentCommand{\Ligne}{m}{
  ligne\nobreakspace\(#1\)
}

%%%%% ---------------------------------------------------------------------
%%%%% Traduction, francisation
%%%%% ---------------------------------------------------------------------

%%% -----------------------------------------------------------------------
%%% tirets ouvrant et fermant: 
%%% -----------------------------------------------------------------------

\cs_new:Nn \TDS_tiret: { \textemdash }

\cs_new:Nn \TDS_tiret_espace_int: { \  }

\NewDocumentCommand {\TO} { } { 
  \TDS_tiret: \TDS_tiret_espace_int: \ignorespaces }

\NewDocumentCommand {\TF} {t.} {
  \IfBooleanTF {#1} {
    \string.} {
    \unskip \TDS_tiret_espace_int: \TDS_tiret:\xspace}
}

%%% -----------------------------------------------------------------------
%%% abbréviations: c'est-à-dire, par exemple, 
%%% -----------------------------------------------------------------------

\cs_new:Nn \TDS_pex_abrev: { p.\nobreakspace ex.\xspace }

\cs_new:Nn \TDS_Pex_abrev: { P.\nobreakspace ex.\xspace }

\NewDocumentCommand {\PX} { s } {
  \IfBooleanTF{#1}{\TDS_Pex_abrev:}{\TdS_PX_auxi}
}

\NewDocumentCommand {\TdS_PX_auxi} { t. } {
  \IfBooleanTF{#1}{\TDS_pex_abrev:}{\TdS_PX_auxii}
}

\NewDocumentCommand {\TdS_PX_auxii} { t+ } {
  \IfBooleanTF{#1}{par~exemple\xspace}{\TDS_pex_abrev:}
}

\NewDocumentCommand {\CAD} { t+ } {
  \IfBooleanTF{#1}{c'est-\`a-dire}{c.-\`a-d.}\xspace
}

%%% -----------------------------------------------------------------------
%%% traduction
%%% -----------------------------------------------------------------------

\NewDocumentCommand { \English } { m }{
  \emph{\foreignlanguage{english}{#1}}
}

\NewDocumentCommand { \InEnglish } { m }{
  \emph{\foreignlanguage{english}{#1}}
}

\NewDocumentCommand { \TdSTrad } { m m }{
  \emph{#1}~\TO anglais~\InEnglish{#2}\TF
}

%%% -----------------------------------------------------------------------
%%% notes et remarques
%%% -----------------------------------------------------------------------

\NewDocumentCommand { \NdT } { m }{
  \footnote{NdTdS~:~#1}
}

\NewDocumentEnvironment { TdSrem } { }
{
  \par\sffamily\footnotesize
}
{
  \par\bigbreak
}

\NewDocumentCommand{\Fragment}{O{\TdS{} \textemdash{} \emph{définitions}} m m m}
{
  \refstepcounter{codefragment}
  \VerbatimInput[frame=lines,
  framesep=0.75\baselineskip, 
  numbers=left,
  firstline=#2,
  lastline=#3,
  label={[#1]fragment
    \arabic{codefragment}},
  ]{#4.tex}
}

% \NewDocumentCommand { \Macro } { s o v } {
%   \IfBooleanTF{#1}
%   {\textcolor{RedOrange}}
%   {\textcolor{MidnightBlue}}
%   {\CODE{#3}}
% }

% \NewDocumentCommand{\Macro}{s o v}{
%   \IfBooleanTF{#1}
%   {\FausseMacroPresentation{#3}}
%   {\gls{#3}}
% }