% !TeX TS-program = lualatex
\documentclass[10pt,french]{article}
\usepackage[no-math]{fontspec}
\usepackage[libertine]{newtxmath}
\usepackage{libertineRoman}
\DeclareSymbolFont{operators}{\encodingdefault}{\familydefault}{m}{n}
\usepackage[a4paper,margin=2cm,head=12pt,headsep=7mm,footskip=7mm]{geometry}
\usepackage[bottom]{footmisc}
\usepackage{amsmath,fancybox,enumitem,systeme,xcolor,fancyhdr,babel}
\setmonofont[Scale=0.8]{Luxi Mono}
\frenchsetup{og=«,fg=»,AutoSpaceFootnotes=false,AutoSpacePunctuation=true,StandardLists=true}
\usepackage[protrusion=true,expansion,final,babel=true]{microtype}
\fancypagestyle{plain}{%
	\fancyhead[L]{\small L'extension \bfseries systeme}
	\fancyhead[C]{}
	\fancyhead[R]{\scriptsize\slshape\leftmark}
	\fancyfoot[l]{}
	\fancyfoot[c]{}
	\fancyfoot[r]{\thepage}}
\renewcommand\headrulewidth{0.4pt}

\makeatletter
\long\def\defactive#1#2{\catcode`#1=13 \begingroup\lccode`\~`#1 \lowercase{\endgroup\long\def~{#2}}}
\newcommand\disable@lig[1]{\defactive#1{\leavevmode\kern\z@\string#1}}
\def\codefont{\ttfamily\small}
\def\code{\expandafter\code@i\string}
\newif\ifspecialcode
\def\specialcode{\specialcodetrue}
\def\code@i#1{%
	\begingroup
	\par\smallbreak\nobreak\parindent0pt
	\parskip=0pt
	\leftskip.1\linewidth
	\rightskip0pt
	\defactive\^^I{\leavevmode\space\space\space\space}%
	\ifspecialcode\else
		\defactive\<{\begingroup$\langle$\itshape}%
		\defactive\>{$\rangle$\endgroup}%
	\fi
	\let\do\@makeother \dospecials
	\codefont
	\defactive\^^M{\par\noindent}%
	\defactive\ {\space}%
	\def\code@ii##1#1{##1\par\endgroup\specialcodefalse}%
	\code@ii
}

\newcommand\exemple{%
	\medbreak\nobreak\noindent
	\begingroup
	\parindent\z@
	\parskip\z@
	\@makeother\;\@makeother\!\@makeother\?\@makeother\:% neutralise frenchb
	\exemple@}

\newcommand\exemple@[2][50]{%
	\begingroup
		\let\do\@makeother\dospecials
		\defactive\ {\space}%
		\defactive\^^M{\par\leavevmode}%
		\defactive\^^I{\space\space\space\space}%
		\defactive\,{\leavevmode\kern\z@\string,}%
		\defactive\-{\leavevmode\kern\z@\string-}%
		\exemple@@{#1}{#2}%
}

\newcommand\exemple@@[3]{%
	\def\@tempa##1#3{\exemple@@@{#1}{#2}{##1}}%
	\@tempa
}

\newcommand\exemple@@@[3]{%
	\xdef\the@code{#3}%
	\endgroup
	\boxput*(0,1)
		{\fboxsep\z@
		\hbox{\colorbox{white}{\leavevmode\kern0.25em{\small\bfseries#2}\kern0.25em}}%
		}%
		{\fboxsep5pt
		\fbox{%
			$\vcenter{\hsize\dimexpr0.#1\linewidth-\fboxsep-\fboxrule\relax
				\kern5pt\parskip0pt \ttfamily\small\the@code}%
			\vcenter{\kern5pt\hsize\dimexpr\linewidth-0.#1\linewidth-\fboxsep-\fboxrule\relax
				\small\newlinechar`\^^M\everyeof{\noexpand}\scantokens{#3}}$%
			}%
		}%
	\medbreak
	\endgroup
}

\newcommand\falseverb[1]{{\ttfamily\detokenize{#1}}}

\long\def\centerverb#1{%
	\def\centerverb@i##1#1{##1\hfill\null\par\egroup}
	\bgroup
		\ttfamily\@noligs
		\parskip2pt\par\hfill
		\let\do\@makeother\dospecials
		\@vobeyspaces
		\centerverb@i}

\begingroup
\catcode`\<13 \catcode`\>13
\gdef\verb{\relax\ifmmode\hbox\else\leavevmode\null\fi
	\bgroup
	\verb@eol@error \let\do\@makeother \dospecials
	\verbatim@font\@noligs
	\catcode`\<13 \catcode`\>13 \def<{\begingroup$\langle$\itshape}\def>{\/$\rangle$\endgroup}%
	\@ifstar\@sverb\@verb}
\endgroup

\def\longfrdate@i#1/#2/#3\@nil{\number#3\relax\ifnum#3=1 \ier\fi\space\ifcase #2 \or janvier\or février\or mars\or avril\or mai\or juin\or juillet\or aout\or septembre\or octobre\or novembre\or décembre\fi\space#1}
\def\longfrdate{\expandafter\longfrdate@i\SYSdate\@nil}
\makeatother
\newcommand*\chevrons[1]{\textlangle\textit{#1}\textrangle}
\def\STkey#1{\textcolor{teal}{\texttt{\detokenize{#1}}}}
\newcommand*\STval[2][]{{\color{teal}\ttfamily#1#2}\if\relax\detokenize{#2}\relax\quad(vide)\fi}
\newcommand*\STkv[2]{\STkey{#1}{\color{teal}${}={}$}\STval{#2}}
\newcommand*\NEW[1][2em]{\leavevmode\llap{\footnotesize\itshape\textcolor{red}{nouveau v\SYSver}\kern#1 }}

\usepackage[plainpages=false,pdfpagelabels,bookmarks=true,bookmarksopen=true,colorlinks=true,hyperfootnotes=false,filecolor=black,linkcolor=blue,urlcolor=magenta,pdfauthor={Christian TELLECHEA},pdftitle={systeme},pdfsubject={Saisie intuitive de systèmes d'équations},pdfkeywords={systeme},pdfcreator={LaTeX}]{hyperref}
\begin{document}
\setitemize{leftmargin=3em,topsep=\dimexpr-\parskip+1.5pt\relax,parsep=0pt,itemsep=1.5pt,label=---}
\begin{titlepage}
	\null\par\vspace{0.5cm}
	\begin{center}
		\begin{minipage}{0.75\linewidth}
			\begin{center}
				\Huge L'extension pour \TeX{} et \LaTeX{}\normalsize\par
				\fontsize{50pt}{50pt}\selectfont\bfseries\SYSname\par
				\par\vspace{5pt}\normalsize
				v\SYSver\par\vspace{5pt}
				\longfrdate\par\vspace{10pt}
				\normalsize Manuel de l'utilisateur
			\end{center}
		\end{minipage}
	\end{center}
	\vspace{0.5cm}
	\begin{center}
		Christian {\sc Tellechea}\par\small
		\href{mailto:unbonpetit@netc.fr}{\texttt{\textbf{unbonpetit@netc.fr}}}
	\end{center}
	\vspace{1cm}
	\begin{center}
		\begin{minipage}{0.8\linewidth}
			\noindent\hrulefill\par
			\hfill\textbf{\textit{Résumé}}\hfill{}\medskip\par\small
				Cette petite extension met en forme des systèmes d'équations ou d'inéquations où les termes et les signes sont alignés verticalement, tout en permettant une saisie quasi naturelle.\par
			\hrulefill
		\end{minipage}
	\end{center}
	\vspace{1cm}
	\tableofcontents
\end{titlepage}
\AddToHook{env/itemize/before}{\vskip1pt \relax}
\AddToHook{env/itemize/after}{\smallbreak}
\pagestyle{plain}
\parskip5pt plus 2 pt minus 1pt
\parindent0pt

Pour l'utiliser l'extension « \textsf{systeme} » , il faut exécuter :
\begin{itemize}
	\item {\color{blue}\verb-input systeme.tex-} lorsqu'on utilise (pdf)(Xe)(lua)\TeX;
	\item {\color{blue}\verb-\usepackage{systeme}-} dans le préambule lorsqu'on utilise (pdf)(Xe)(lua)\LaTeX.
\end{itemize}
Les extensions \href{https://www.ctan.org/pkg/xstring}{\texttt{\textbf{xstring}}} et \href{https://www.ctan.org/pkg/simplekv}{\texttt{\textbf{simplekv}}} sont requises et chargées si cela n'a pas été le cas.

\section{Versions 0.4x}
Nouveau dans les versions 0.4x :
\begin{itemize}
	\item les inconnues peuvent désormais se trouver dans le membre de droite où elles y sont triées et alignées;
	\item possibilité d'insérer une espace mathématique entre une inconnue et le coefficient qui la précède;
	\item il est possible de stocker dans une macro tout le code produit par la commande \verb|\systeme|;
	\item tous les réglages se font par clés/valeurs et ce qui implique la suppression de toutes les macros ou arguments optionnels permettant les réglages dans les versions précédentes;
	\item \NEW possibilité de spécifier des indices non numériques dans une consigne de tri manuelle;
	\item \NEW nouvelle consigne manuelle de tri «\texttt{\detokenize{a_{*}}}» pour indiquer que l'inconnue \texttt a, quel que soit son indice, est à considérer comme inconnue;
	\item \NEW nouvelle clé \STkey{align const sign} pour contrôler si les signes des termes constants doivent être alignés entre-eux ou bien placés au plus proche du terme constant.
\end{itemize}

\textbf{Important}. La version 0.4 va créer une rupture de compatibilité avec les versions précédentes, notamment :
\begin{itemize}
	\item si la macro \verb-\systeme- est utilisée avec un ou plusieurs arguments optionnels comme cela était possible avec les versions antérieures;
	\item \spaceskip5pt plus 3pt minus 3pt\relax si les macros suivantes, désormais supprimées, sont utilisées : \verb-\sysdelim-, \verb-\syseqsep-, \verb-\sysalign-, \verb-\syssignspace-, \verb-\syseqspace-, \verb-\syslineskipcoeff-, \verb-\sysequivsign-, \verb-\sysaddeqsign-, \verb-\sysremoveeqsign-, \verb-\sysextracolsign-, \verb-\syscodeextracol-, \verb-\sysautonum-, \verb-\syssubstitute- et \verb-\sysnosubstitute-.
\end{itemize}

\section{La commande \texttt{\textbackslash systeme}}
La commande principale est \verb-\systeme- dont l'argument obligatoire contient les équations séparées par une virgule :

\exemple{La commande \ttfamily\string\systeme}|un système : \systeme{
	2a-3b+4c=2,
	a+8b+5c=8,
	-a+2b+c=-5
}|

La commande \verb-\systeme- fonctionnera indifféremment en mode math ou non. Les équations doivent être \emph{développées}, c'est-à-dire que chaque terme est séparé de son voisin par un «\verb-+-» ou un «\verb+-+». De plus, les inconnues doivent être des lettres minuscules non accentuées, c'est-à-dire tout caractère de «\verb-a-» à «\verb-z-». Les espaces sont ignorés dans l'argument de la macro \verb|\systeme|.

L'alignement construit sera précédé d'une accolade et aura les spécificités suivantes :
\begin{itemize}
	\item les séparateurs de membres (signes d'égalité ou d'inégalité) sont alignés;
	\item les signes «\verb-+-» ou «\verb+-+» entre chaque terme des membres sont alignés;
	\item les terme du membre de gauche se trouvent dans une colonne au fer à droite et ceux du membre de droite dans une colonne au fer à gauche.
\end{itemize}

Les inconnues peuvent avoir un indice, sous réserve que celui-ci soit un nombre \emph{entier positif ou nul}\footnote{La clé \STkey{sort} permet, depuis la version 0.41 de spécifier des indices non entiers.} :
\exemple{Inconnues indicées}|\systeme{
	4x_1-x_2=3,
	-x_1+5x_2=-1
}|

Si une inconnue est manquante dans une équation, la colonne de l'alignement reste vide :
\exemple{Inconnues manquantes}|\systeme{
	a-2b=3,
	b-3c=4,
	-a+4c=-1
}|

Les inconnues et les termes constants peuvent être présents aussi bien dans le membre de droite que celui de gauche. Les termes constants sont toujours affichés en dernier.
\exemple{Inconnues dans les deux membres}|\systeme{
	-a+c-3=-2b+3c-1,
	2b-3c=a+2b-2,
	a-b+c+1=2a-c
}|

Quel que soit l'ordre dans lequel sont entrées les inconnues lors de la saisie, elles seront triées par ordre alphabétique à l'affichage, en tenant compte de leur éventuel indice. Un signe «\verb-+-» ne sera pas affiché lorsqu'il précède le premier terme d'une équation :
\exemple{Tri des inconnues}|\systeme{
	2y+x-3z=4,
	z-y+2x=-1,
	-2x+3z-4y=0
}|

Les macros \verb|\+| et \verb|\-| sont redéfinies pendant l'exécution de la macro \verb|\systeme| pour échapper «\verb-+-» et «\verb+-+», au cas où les coefficients doivent contenir ces signes, afin qu'ils ne soient compris comme la fin d'un terme :
\exemple{Coefficient contenant une addition ou soustraction}/\systeme{%
	(2\+\sqrt2)x-(1\-\sqrt2)y=1,
	x+(1\+\sqrt2)y=-1
}/

\section{La commande \texttt{\textbackslash setsysteme}}
La macro \verb|\setsysteme| reçoit dans son argument obligatoire une liste de « clés/valeurs »
\code|\setsysteme{<clé1>=<valeur1> , <clé2>=<valeur2>, etc}|

Les réglages concernés seront modifiés pour tout le reste du document. Pour revenir aux réglages par défaut, il faut exécuter la macro \verb|\resetsysteme|.

Pour modifier les réglages pour un seul système, les \verb|<clés>|=\verb|<valeurs>| doivent se trouver dans l'argument optionnel de la macro \verb|\systeme|:
\code|\systeme[<clé1>=<valeur1> , <clé2>=<valeur2>, etc]{code du système}|

Remarque : lorsqu'une \verb|<valeur>| contient une virgule, un crochet fermant ou un signe égal, cette \verb|<valeur>| \emph{doit} se trouver entre accolades afin que ces caractères spéciaux n'interfèrent pas avec la syntaxe d'autres commandes et ne provoque une erreur de compilation.

\section{Les clés et valeurs}
Toutes les clés et pour chacune, la valeur par défaut ainsi qu'une brève description de leur action se trouvent ci-après.

\subsection{Séparateur entre équations, la clé \STkey{eq sep}}
Cette clé permet de choisir le séparateur entre les équations. Sa valeur par défaut est 
\code|eq sep = { , }|

Pour écrire des coefficients décimaux, il convient de redéfinir ce séparateur :
\exemple{Séparateur entre équations}|\systeme[eq sep = \\ ]{
	1,5x-0,45y=0,7\\
	x-0,8y=1,4
}|

\subsection{Choix des délimiteurs, la clé \STkey{delim}}
Cette clé définit les séparateurs gauche et droit du système. Ces délimiteurs sont mis en argument des primitives \verb|\left| et \verb|\right|. La valeur par défaut est
\code|delim = { \{ , . } |
ce qui place une accolade à gauche du système et rien à droite.

\exemple{Choix des délimiteurs}/\systeme[delim={[,]}]{2a+3b=5,3a-b=8}\qquad
\systeme[delim={.,|}]{2a+3b=5,3a-b=8}\qquad
\systeme[delim={(,\rfloor}]{2a+3b=5,3a-b=8}/

\subsection{Alignement des termes dans les colonnes, la clé \STkey{align}}
Chaque terme est aligné au fer à droite dans le membre de gauche et au fer à gauche dans celui de droite. C'est ce que spécifie par défaut \STkey{align}. Pour chaque membre, on a le choix entre \verb|r|, \verb|c| ou \verb|l|. La valeur par défaut est 
\code|align = { r , l }|

\exemple{Alignement des termes}|\systeme{3x-y=5a-b,x+4y=a+3b}
    \quad(par défaut, droite/gauche)

\systeme[align={l,l}]{3x-y=5a-b,x+4y=a+3b}
    \quad(alignement gauche/gauche)

\systeme[align={r,r}]{3x-y=5a-b,x+4y=a+3b}
    \quad(alignement droite/droite)

\systeme[align={l,r}]{3x-y=5a-b,x+4y=a+3b}
    \quad(alignement gauche/droite)

\systeme[align={c,c}]{3x-y=5a-b,x+4y=a+3b}
    \quad(alignement centré/centré)|

\subsection{Alignement des signes des termes constants, la clé \STkey{align const sign}}
Par souci d'esthétique ou par goût personnel, on peut désirer que les signes des termes constants (lorsque la composition de fait au fer à droite) ne soient pas alignés entre-eux. Cette clé a pour valeur par défaut
\code|align const sign = true|
ce qui aligne toujours les signes des termes constants.

Il faut la mettre à \verb|false| pour l'effet contraire

\exemple{Alignement des signes des termes constants}|\systeme{
	2a-b+\sqrt{2}-1=0,
	a-2b+1=0
}

\systeme[align const sign=false]{
	2a-b+\sqrt{2}-1=0,
	a-2b+1=0
}|

\subsection{Liste des séparateurs de membres, la clé \STkey{member sep list}}
Cette clé définit tous les ensembles de tokens qui seront compris par \textsf{systeme} comme séparateur de membres.
La valeur par défaut est
\specialcode\code|member sep list = { <= , >= , = , < , > , \leq , \geq , \leqslant , \geqslant }|

Il appartient à l'utilisateur, s'il en a le besoin, d'ajouter à cette liste d'autres possibilités (voir ci-dessous)

\subsection{Ajout/suppression d'un séparateur de membres, les clés \STkey{add member sep} et \STkey{remove member sep}}
La clé \STkey{add member sep} permet d'ajouter un signe séparateur de membres et \STkey{remove member sep} d'en supprimer un existant. Leurs valeurs par défaut sont
\code|add member sep={}
remove member sep = {}|

\exemple{Ajout de signe d'égalité}|\setsysteme{add member sep = \approx}
\systeme{
	x+y\approx-6,
	-2x+3y\approx1
}|

\subsection{Substitution de séparateur de membres, la clé \STkey{member sep subst}}
On spécifie avec cette clé une substitutions à faire entre les tokens « bruts » compris comme séparateur de membres (voir clé \STkey{member sep list}) et tokens servant à afficher le signe. Cette clé ajoute une substitution à chaque invocation selon la syntaxe
\code|member sep subst = { <tokens bruts> , <tokens pour affichage> }|

Cette clé est exécutée 2 fois par défaut
\specialcode\code|member sep subst = { <= , \leq },
member sep subst = { >= , \geq }|

\subsection{Espacements : les clés \STkey{sign space}, \STkey{member sep space}, \STkey{line skip coeff} et \STkey{coeff space}}
La clé \STkey{sign space} spécifie l'espace supplémentaire qui sera ajoutée de part et d'autre de chaque signe «\verb|+|» ou «\verb|-|» compris comme séparateur de termes.

La clé \STkey{member sep space} joue le même rôle pour les signes séparant les membres.

L'espacement vertical entre chaque équation est multiplié par le coefficient \STkey{line skip coeff}.

Les valeurs par défaut sont
\code|sign space       = 0pt,
member sep space = 0pt,
line skip coeff  = 1.25|

\exemple[55]{Espacement vertical}|\systeme{x+y=200,x-y=10}\qquad
\systeme[line skip coeff=1]{x+y=200,x-y=10}\qquad
\systeme[line skip coeff=1.75]{x+y=200,x-y=10}|

Lorsqu'une inconnue est précédée d'un coefficient explicite (c'est-à-dire que cette inconnue ne suit pas un signe \verb|+| ou \verb|-|), la clé \STkey{coeff space} permet de définir une espace mathématique (donc impérativement exprimée en \texttt{mu}) \emph{positive} qui sera inséré entre le coefficient et l'inconnue. Si la valeur spécifiée est vide, aucune espace n'est insérée. Sa valeur pas défaut est
\code|coeff space = {}|

\exemple{Espace après le coefficient}|\systeme{
	2x-3y=4a-1,
	-5x+y=3a+4
}

\systeme[coeff space = 2mu ]{
	2x-3y=4a-1,
	-5x+y=3a+4
}|

\subsection{Tri des inconnues, la clé \STkey{sort}}
\subsubsection{Inconnues non indicées}
Par défaut, les inconnues sont triées par ordre alphabétique, aussi bien dans le membre de droite que dans celui de gauche. On peut spécifier un tri avec la syntaxe
\code|sort = {<consigne pour le membre de gauche> = <consigne pour le membre de droite>}|

Lorsqu'une \verb|<consigne>| vaut «\verb|*|», le tri automatique alphabétique par défaut est en vigueur. En effet, la valeur par défaut de la clé est 
\code|sort = {*=*}|

Au lieu de \verb|*|, on peut spécifier une liste d'inconnues séparées par des virgules (les espaces sont ignorés dans les consignes de tri) :
\exemple{Tri des inconnues}|Tri alphabétique : \systeme{
	x+2y-3z+t=0,
	2x-y-z+3t=4,
	2y+3z+4t=-1,
	3x-2z-2t=3
}

Tri forcé : \systeme[sort={x, y, z, t = * }]{
	x+2y-3z+t=0,
	2x-y-z+3t=4,
	2y+3z+4t=-1,
	3x-2z-2t=3
}|

Toute lettre ne se trouvant pas dans la consigne de tri n'est pas considérée comme inconnue. C'est ici le cas avec $m$ dans le membre de gauche :
\exemple{Inconnues ignorées}|\systeme[sort={x, y = m, n}]{
	mx-y=1+m^2+n,
	x-m^2y=-3+2m-n^2
}|

On peut ainsi utiliser des inconnues en lettre majuscules ou grecques, qui ne sont pas autorisées par défaut :
\exemple{Inconnues majuscules ou grecques}|\systeme[sort={A, \alpha, \beta = *}]{
	A-\alpha+3\beta=4,
	2A+\alpha-\beta=0,
	-A+3\alpha-2\beta=5
}|

Cas particuliers :
\begin{itemize}
\item si une consigne de tri est vide comme dans \verb|sort{x, y={}}|, aucune lettre se sera considérée comme étant une inconnue dans le terme considéré et donc, tout membre sera considéré comme le terme constant ;
\item si le signe \verb|=| n'est pas contenu dans la clé \STkey{sort}, les 2 consignes de tri sont considérées comme égales au contenu de la clé. Ainsi, \verb|sort={x, y}| est compris comme \verb|sort={x, y=x, y}|.
\end{itemize}

\subsubsection{Inconnues indicées}
On peut indiquer une liste d'inconnues indicées dans la consigne de tri. Dans cet exemple, seules \verb|a_1| et \verb|a_3| sont considérées comme inconnues et on voit que \verb|a_2| est considéré comme terme constant
\exemple{Inconnues indicées}|\systeme[ sort = {a_1, a_3={}} ]{
	2a_1-3a_2+a_3+4=-1,
	a_1-a_2-3a_3=5
}|

Il est également possible d'indiquer dans la consigne de tri des indices non numériques :
\exemple{Indices non numériques}|\systeme[ sort = {a_n, a_{n+1}={}} ]{
	2a_n-3a_{n+1}-a_0+1=5,
	a_n-a_{n+1}+4=2
}|

On peut également mettre \verb|x_{*}| pour indiquer que \verb|x| seul ou muni d'un indice (numérique ou non) doit être considéré comme inconnue. L'astérisque \emph{doit} être entre accolades. Dans le système final, l'ordre d'apparition des inconnues est celui dans lequel elles apparaissent dans le code.
\exemple{Indices quelconques}|\systeme[ sort = {x_{*}={} } ]{%
	x_1-x_n+2x_0=3,
	x_0-3x_1+2x_n+1=0,
	x_n-x_0+2x_1-1=0
}|

\subsection{Colonne supplémentaire, clés \STkey{extra col sign}, \STkey{extra col pre} et \STkey{extra col post}}
Lorsqu'une équation comporte le signe «\verb-@-», tout ce qui se trouve à droite de ce caractère sera mis dans une colonne supplémentaire au fer à gauche qui se trouvera à droite du système, en dernière position.

Le signe «\verb-@-» peut être changé en un autre avec la clé \STkey{extra col sign} dont la valeur par défaut est
\code|extra col sign = @|

\exemple{Colonne supplémentaire}/\systeme{%
	x+y=125@L_1,
	x-y=12@L_2
}/

Cette colonne supplémentaire n'est \emph{pas} composée en mode mathématique, mais deux codes sont insérées au début et à la fin de cette colonne. Ils sont définis par les clés \STkey{extra col pre} et \STkey{extra col post} dont les valeurs par défaut sont
\code|extra col pre  = \kern1.5em$,
extra col post = $|

ce qui signifie qu'une espace horizontale d'1.5em est insérée et le «\verb-$-» entre en mode mathématique au début de la colonne. Enfin, pour le second argument, «\verb-$-» termine le mode math à la fin de la colonne.

On va redéfinir ces deux codes pour ne pas se mettre en mode math et insérer une espace de 2.5em :
\exemple{Personnalisation de la colonne supplémentaire}/\systeme[
        extra col pre  = \kern2.5em ,
        extra col post = {} ,
        extra col sign =  | ]{
	x+y=125|somme des deux nombres,
	x-y=12 |différence des deux nombres
}/

\subsection{Numérotation automatique, les clés \STkey{autonum code}, \STkey{autonum continue}}
La colonne supplémentaire peut être utilisée pour y mettre une numérotation automatique. La première façon de procéder est d'indiquer le schéma que doit prendre cette numérotation automatique à la première ligne, sachant que le caractère «\verb-*-» déclenche la mise en place de la numérotation automatique et sera remplacé par le numéro de la ligne dans le système. Les autres lignes, même si elles n'ont pas de colonne supplémentaire, porteront un numéro :
\exemple{Numérotation automatique}/\systeme{x+y-z=3@L_{*},
	2x+y+z=4,
	x-y+2z=0
}/

Si on souhaite spécifier explicitement des colonnes supplémentaires aux lignes qui n'en ont pas, la numérotation automatique vient \emph{avant} le contenu explicite des colonnes supplémentaires :
\exemple{Numérotation automatique}/\systeme{
	x+y-z=3@L_{*}\quad,
	2x+y+z=4,
	x-y+2z=0
}

\systeme{
	x+y-z=3@L'_{*},
	3x+2y=7@=L_1+L_2,
	3x+y=6@=2L_1+L_3}
	/

Il est ennuyeux que l'on ne puisse mettre «\verb-L'_{*}=L_1-» à la première ligne car la totalité de ce schéma et notamment la partie indésirable «\verb-L_1-» serait reproduite aux lignes suivantes. On peut donc spécifier le schéma de numérotation d'une deuxième façon, \emph{avant} d'écrire le système. On utilise la clé \STkey{autonum code} pour définir ce schéma. Sa valeur par défaut est
\code|autonum code = {}|

\exemple{Numérotation automatique}/\systeme[autonum code = L_{*} ]{
	x+y-z=3,
	2x+y+z=4,
	x-y+2z=0
}

\systeme[autonum code = L'_{*}\longleftarrow ]{
	x+y-z=3@L_1,
	3x+2y=7@L_1+L_2,
	3x+y=6@2L_1+L_3
}/

Le schéma spécifié avec la clé \STkey{autonum code} n'est valable \emph{que pour le prochain système} et sera effacé ensuite, sauf si on met à \verb|true| la valeur de la clé \STkey{autonum continue}, auquel cas le schéma de numérotation se poursuit pour tous les systèmes à venir. La valeur par défaut est
\code|autonum continue = false|

\exemple{Numérotation automatique persistante}/\setsysteme{
	autonum code     = L_{*},
	autonum continue = true}
\systeme{a+b=4,2a-b=5}
\quad
\systeme{x-3y=0,2x+y=1}/

On peut effacer (et donc annuler) le schéma de numérotation automatique en mettant à vide la valeur de la clé \STkey {autonum code} :
\code|autonum code = {}|

Il existe un compteur global\footnote{Il s'agit d'un compteur \TeX{} portant le doux nom de {\ttfamily\string\SYSeqnum}, accessible via les commandes \TeX{} habituelles, c'est-à-dire qu'on peut le faire précéder de \texttt{\string\number}, \texttt{\string\romannumeral} pour l'afficher.} d'équations accessible de la même façon que le compteur local mais avec «\verb-**-». Voici un exemple de numérotation persistante :
\exemple{Numérotation globale}/On met en évidence que \number\SYSeqnum{}
équations ont été écrites jusqu'ici~:

\setsysteme{autonum code     = \hbox{eq (**)},
            autonum continue = true}
\systeme{x-y+z=3,
	2x+y+z=1,
	x-z=8}

\systeme{u+w=9,
	v+2w=0,
	u-v=1}/

Il est enfin possible d'utiliser la colonne supplémentaire pour retenir le numéro d'une équation et le rappeler plus tard :
\exemple{Numérotation globale}/\setsysteme{
	extra col pre = \kern1em ,
	extra col post = {}
}
\systeme{
	x-y+z=3 @\gdef\foo{**}(\textbf{**}),
	2x+y+z=1@\gdef\bar{**}(\textbf{**}),
	x-z=8   @\gdef\baz{**}(\textbf{**})
}

L'équation \no\foo{} est la première du
système, \bar{} et \baz{} sont les deux
suivantes./

On peut à tout moment réinitialiser le compteur global d'équations à l'aide de la clé \STkey{main eq count}:
\code|main eq count = <valeur entière>|
L'assignation ainsi effectuée est globale.

\subsection{Augmentation en hauteur et profondeur, la cle \STkey{extra height}}
L'alignement constitué par le système peut avoir sa hauteur et sa profondeur augmentées de la valeur \emph{positive} de la clé \STkey{extra height} dont la valeur par défaut est
\code|extra height = 1.5pt|

Cet ajustement permet dans certains cas que la taille des délimiteurs soit mieux adaptée à celle du système.

\subsection{Non alignement des termes, la clé \STkey{align terms}}
Cette clé, qui vaut \verb|true| par défaut, permet, si elle est assignée à \verb|false| de ne pas aligner les termes dans un même membre. Dans ce cas, seul les signes séparateurs de membres sont alignés.
\exemple{Non alignement des termes}|\systeme{
	x-3y=4a-1,
	-5x+y=a+4
}

\systeme[align terms=false]{
	x-3y=4a-1,
	-5x+y=a+4
}|

\subsection{Substitution post traitement, la clé \STkey{post subst}}
Juste avant l'affichage du système, il est encore possible de substituer dans le code du système toute suite de token par une autre. On utilise pour cela la clé \STkey{post subst}:
\code|post subst = {<x1> <y1> <x2> <y2>...<xn> <yn>}|
ce qui a pour effet de remplacer toutes les occurrences de \verb|<x1>| par \verb|<y1>|, celles de \verb|<x2>| par \verb|<y2>|, etc. Un ou plusieurs espaces (ignorés) peuvent se trouver entre les motifs de substitution.

La valeur de cette clé est
\code|post subst = {}|


Dans cet exemple, on entre des coefficients décimaux où le point est le séparateur décimal. On va demander à ce que tous les «\verb-.-» soient remplacés par des «\verb-,-». On remplacera aussi l'inconnue $a_1$ par $x_n$, et $a_2$ par $x_{n+1}$ :
\exemple[60]{Substitution post traitement}/\systeme[post subst = {.}{,} {a_1}{x_n} {a_2}{x_{n+1}} ]{
	1.5a_1-0.5a_2=2,
	1.6a_1-2a_2=0.4
}/

\subsection{Sauvegarde du code produit dans une macro, la clé \STkey{store}}
Pour sauvegarder le code résultant de la macro \verb|systeme| dans une \verb|<macro>| en vue de l'utiliser à sa guise plus tard, on utilise la clé \STkey{store}. Son contenu doit être soit vide (aucune sauvegarde n'est effectuée), soit une macro \emph{seule} qui recevra le code. Toute autre valeur conduit à une erreur.

La valeur par défaut est
\code|store = {}|

Si la clé contient une \verb|<macro>|, la commande \verb|systeme| ne produit aucun affichage et sauvegarde la totalité du code qu'elle produit dans la \verb|<macro>|. L'assignation est globale. Après avoir été utilisée par la commande \verb|\systeme|, la clé \STkey{store} est réinitialisée à sa valeur par défaut.

Si l'on écrit
\code|\systeme[store=\mysys]{3x-2y+z=-4,
                       x+5z=2,
                       -x+y-2z=0}|
alors la macro \verb|\mysys| contient le code suivant
\begingroup
\code|\csname SYS_\ifmmode id\else enter_math\fi\endcsname{%
	\left\{%
	\vcenter{\lineskiplimit=0pt \lineskip=0pt \baselineskip1.25\normalbaselineskip
		\halign{
			\hfil$##$&%
			\hbox to12.22214pt{\hss$##$\hss}&%
			\hfil$##$&%
			\hbox to12.22214pt{\hss$##$\hss}&%
			\hfil$##$&%
			\hfil$##$\hfil&%
			$##$\hfil
		\cr
			\vrule depth0pt width0pt height9.0pt%
			3x&-&2y&+&z&{}={}&-4%
		\cr
			x&&&+&5z&{}={}&2%
		\cr
			-x&+&y&-&2z&{}={}&0%
			\vrule height0pt width0pt depth4.0pt%
		\cr
		}%
	}\right.%
}|%
\endgroup

\section{Exemples}
La macro \verb|\systeme| peut être un peu détournée de ses fins pour écrire sans contrainte des calculs en ligne, où le signe \verb|=| est répété au début de chaque ligne de calcul.

Certains réglages sont cependant nécessaires (délimiteurs désactivés, pas d'alignement des termes, alignement des colonnes, interdiction du tri automatique) :
\exemple{Calculs en ligne}|\systeme[%
		delim={.,.},
		align terms=false,
		align={r,l},
		sort={{}={}}
		]{%
	A=(2x-1)^2-(x-2)^2,
	=4x^2-4x+1-(x^2-4x+4),
	=4x^2-4x+1-x^2+4x-4,
	=3x^2-3,
	=3(x^2-1),
	=3(x-1)(x+1)
}|

La macro \verb|\aligncalc|, intégrée dans le package \textsf{systeme}, est programmée de la façon suivante 
\code/\def\aligncalc{%
	\systeme[
		delim={.,.},
		align terms=false,
		align={r,l},
		sort={{}={}},
		extra col pre=\kern1.5em,
		extra col post={}
	]}/
Ce qui permet d'alléger la syntaxe.
\exemple{Calculs en ligne}|\aligncalc{%
	D=x^2+4x-21,
	 =x^2+4x+4-4-21@faire apparaitre $x^2+4x+4$,
	 =(x+2)^2-25@qui se factorise en $(x+2)^2$,
	 =(x+2)^2-5^2@différence de 2 carrés,
	 =(x+2+5)(x+2-5)@factorisation,
	 =(x+7)(x-3)@résultat final
}|

Les équations sans signe $=$ et sans second membre sont également acceptées.
\exemple{Lignes sans second membre}|\systeme{
	-2a+b-c,
	a-5c,
	3a-2b+3c
}|

On peut ainsi, moyennant quelques réglages, mimer l'environnement \verb|cases| de \LaTeX.
\exemple[53]{Mimer 'cases'}!% https://tex.stackexchange.com/questions/366500
$ns=\systeme[
		align terms=false,
		sort={{}={}},
		align={l,l},
		extra col pre=\kern2em\hfill,
		extra col post={}
		]{
	s+s+\ldots+s          @($n$ fois) si $n>0$,
	0                     @si $n=0$,
	(-s)+(-s)+\ldots+(-s) @($|n|$ fois) si $n<0$%
}$!

Charge à l'utilisateur de programmer une macro qui lui est spécifique pour alléger la syntaxe.
\bigbreak
Voici des réponses valides à quelques questions posées sur le désormais moribond site StackExchange.
\exemple{}|% https://tex.stackexchange.com/questions/679847
\systeme[sort={x,y={}},align const sign=false]{
	x + y +2z = a,
	2x + 2y + {( 4+b )} z = b,
	-x -2z  = ab,
	y + bz = a + b
}|

\exemple{}|% https://tex.stackexchange.com/questions/685384
\systeme[sort={{}=x_{*}}]{
	x_1'(t) = x_1(t)-x_2(t)+2x_3(t),
	x_2'(t) = -2x_1(t)+5x_2(t)+2x_3(t),
	x_3'(t) = 8x_1(t)-5x_2(t)-2x_3(t)
}|

\exemple{}|% https://tex.stackexchange.com/questions/696681
\systeme[sort={x,y,z={}} ]{
	a_1 x+b_1 y+c_1 z=d_1,
	a_2 x+b_2 y+c_2 z=d_2,
	a_3 x+b_3 y+c_3 z=d_3
}|

\exemple{}|% https://tex.stackexchange.com/questions/728852
\systeme[sort = {\alpha,\beta,\gamma={}} ]{
	2 \sin \alpha - \cos \beta + 3\tan \gamma= 3,
	4 \sin \alpha + 2\cos \beta - 2\tan \gamma = 2,
	6 \sin \alpha - 3\cos \beta + \tan \gamma = 9
}|

\exemple{}|% https://tex.stackexchange.com/questions/692368
\systeme[ sort = {x_i , x_2 = {} } ]{
	x_{i}=x_0,
	x_{2}=x_1
}|

\begin{center}
	$\star$\par\nointerlineskip
	$\star$\kern0.66em$\star$
\end{center}

J'espère que ce package vous sera utile !\par\nobreak
Merci de me signaler par \href{mailto:unbonpetit@netc.fr}{email} tout bug ou toute proposition d'amélioration.
\end{document}