\morecolors
%%%%%%%%%%%%% Polices %%%%%%%%%%%%%
\fontfam[Source Pro]
\fontfam[Linux Libertine]
\typosize[11/13]
\margins/1 a4 (1.5,1.5,1.5,1.5)cm
\frlang
\hyperlinks\Purple\Purple
\def\ttfam{\Sourcepro\typoscale[875/800]\mono\medium\rm}
\def\texttt#1{{\ttfam#1}}
\newif\ifttangle
\ttangletrue
\begingroup
	\catcode`\<13
	\gdef<#1>{\hbox{$\langle$\it#1\/$\rangle$}}
\endgroup
\everyintt{\Blue\ttfam\ifttangle\catcode`\<13 \fi}
\mathsboff
\input{systeme.tex}
\long\def\def_active#1#2{%
	\catcode`#1=13
	\begingroup
		\lccode`\~`#1
		\lowercase{\endgroup\long\def~{#2}}%
}
%%%%%%%%%%%%% la macro \syscode %%%%%%%%%%%%%
\def\nolig_list{\do\`\do\<\do\>\do\,\do\'\do\-}
\def\do_noligs#1{%
  \catcode`#1\active
  \begingroup
     \lccode`\~`#1\relax
     \lowercase{\endgroup\def~{\leavevmode\kern0pt \char`#1}}}
\def\no_ligs{\let\do\do_noligs \nolig_list}
\def\syscode{\expandafter\syscode_i\string}
\newif\ifspecialcode
\specialcodefalse
\def\specialcode{\specialcodetrue}
\def\syscode_i#1{%
	\begingroup
	\par\smallbreak\nobreak\parindent0pt
	\parskip=0pt
	\leftskip2.5em
	\rightskip0pt
	\nofrenchpunct
	\no_ligs
	\ifspecialcode\else
		\def_active\<{\begingroup$\langle$\it}%
		\def_active\>{$\rangle$\endgroup}%
	\fi
	\def\do##1{\catcode`##1=12\relax}\dospecials
	\ttfam
	\typoscale[875/1250]%
	\def_active\^^I{\space\space\space\space}%
	\def_active\^^M{\par\noindent}%
	\def_active\ {\space}%
	\catcode`#1=12
	\def\syscode_ii##1#1{##1\par\medbreak\endgroup\specialcodefalse}%
	\syscode_ii
}
%%%%%%%%%%%%% la macro \exemple %%%%%%%%%%%%%
\newbox\title_box
\def\DarkGrey{\setgreycolor{.4}}
\def\exemple{%
	\begingroup
	\parindent0pt
	\parskip0pt
	\bigbreak\nobreak\noindent
	\exemple_
}
\def\exemple_{%
	\futurelet\nxt_tok\exemple_a
}
\def\exemple_a{%
	\begingroup
		\nofrenchpunct
		\ifx[\nxt_tok
			\def\do_next{\exemple_b}%
		\else
			\def\do_next{\exemple_b[50]}%
		\fi
		\do_next
}
\def\exemple_b[#1]#2{%
		\def\do##1{\catcode`##1=12\relax}\dospecials
		\def_active\ {\space}%
		\def_active\^^M{\par\noexpand\Black\leavevmode\noexpand\rm}%
		\def_active\^^I{\space\space\space\space}%
		\def_active\%{\noexpand\it\noexpand\Grey\char37 }%
		\def\do##1{%
			\catcode`##1\active
			\begingroup
				\lccode`\~`##1\relax
				\lowercase{\endgroup\def~{\leavevmode\kern0pt \char\number`##1\relax}}%
		}%
		\nolig_list
		\exemple_c{#1}{#2}%
}

\def\exemple_c#1#2#3{%
	\def\__tempa##1#3{\exemple_d{#1}{#2}{##1}}%
	\__tempa
}

\def\exemple_d#1#2#3{%
	\xdef\the_code{#3}%
	\endgroup
	\def\rule_sep{5pt}%
	\def\rule_width{0.6pt}%
	\vbox{%
		\ifcat\relax\detokenize{#2}\relax
			\vrule width\hsize height\rule_width depth0pt
		\else
			\everyintt{\White\ttfam}%
			\setbox\title_box\hbox{%
				\inoval
					[%
					\roundness=2pt
					\fcolor=\DarkGrey
					\lcolor=\Black
					\lwidth=\rule_width
					\shadow=N
					\overlapmargins=N
					\hhkern=\rule_sep
					\vvkern=-\roundness
					]{\White\lower2.5pt\hbox{\strut\sans\rm\bf\typoscale[800/]#2}}%
			}%
			\edef\ruletitle_wd{\the\dimexpr(\hsize-\wd\title_box)/2\relax }%
			\vrule width\ruletitle_wd height\rule_width depth0pt
			\ht\title_box=0pt
			\dp\title_box=0pt
			\box\title_box
			\vrule width\ruletitle_wd height\rule_width depth0pt
		\fi
		\par\nointerlineskip
		\vrule width\rule_width\hbox{%
			\kern\rule_sep
			$\vcenter{
				\hsize\dimexpr0.#1\hsize-\rule_sep-\rule_width\relax
				\kern\dimexpr\rule_sep*2\relax
				\parindent0pt
				\parskip0pt
				\ttfam
				\typoscale[825/950]%
				\the_code\par
				\vskip\rule_sep
				}%
			\vcenter{
				\hsize\dimexpr\hsize-0.#1\hsize-\rule_sep-\rule_width\relax
				\kern\dimexpr\rule_sep*2\relax
				\typoscale[875/950]%
				\newlinechar`\^^M
				\everyeof{\noexpand}%
				\scantokens{#3}\par
				\vskip\rule_sep
				}$%
		}\kern\rule_sep\vrule width\rule_width
		\hrule height\rule_width
	}%
	\bigbreak
	\endgroup
}
\mathsbon
%%%%%%%%%%%%% macro de mise en forme %%%%%%%%%%%%%
\def\longfrdatei#1/#2/#3\nil{%
	\number#3\relax
	\ifnum#3=1 \raise1.ex \hbox{\typoscale[650/]er}\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\longfrdatei\SYSdate\nil}
\_sdef{_item:---}{--- }
\def\NEW#1{{\Red\typoscale[750/750]nouveau v#1\kern1em }\ignorespaces}
\def\STkey#1{{\ttfam\CyanD\detokenize{#1}}}
\catcode`\:=13 \def:{\unskip~\char`\: }
\catcode`\;=13 \def;{\unskip\thinspace\char`\; }
\catcode`\?=13 \def?{\unskip\thinspace\char`\? }
\catcode`\!=13 \def!{\unskip\thinspace\char`\! }
\catcode`\«=13 \def«{\char`\«\thinspace\ignorespaces}
\catcode`\»=13 \def»{\unskip\thinspace\char`\» }
\def\nofrenchpunct{%
	\catcode`\:=12
	\catcode`\;=12
	\catcode`\?=12
	\catcode`\!=12
	\catcode`\«=12
	\catcode`\»=12
}
%########## page de titre ##########
\novspaces
\parindent0pt
\footline{}
\begingroup
	\leftskip=0pt plus 1 fill
	\rightskip=\leftskip
	\leavevmode\vskip1.5cm
	{\typosize[25/30]L'extension pour \TeX{} et \LaTeX\par}
	{\typosize[50/50]\bf\SYSname\vskip5pt}
	{\bf v\SYSver\vskip5pt}
	\longfrdate\vskip15pt
	{\bf Manuel de l'utilisateur}\par
	\vskip1cm
	{\bf Christian \caps \bf Tellechea}\smallbreak
	{\Sourcepro\typoscale[800/800]\mono\bolder\rm\ulink[mailto:unbonpetit@netc.fr]{unbonpetit@netc.fr}}
	\vskip1.5cm
	\leavevmode
		\vtop{
		\hrule
		\kern5pt
		\hbox{\vtop{\hsize=0.75\hsize
			\typosize[9/11]
			\centerline{\bf Résumé}\medbreak
			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.%
			}}%
		\kern5pt
		\hrule
		}%
	\medbreak
\endgroup
\vfil
\maketoc
\vfil
\par
\penalty -10000
%########## texte du manuel ##########
\parskip5pt plus 2 pt minus 1pt
\verbchar|
\footline{\hss\_rmfixed \folio}
\setsysteme{code before = {\mathcode`\,="012C}}
Pour l'utiliser l'extension « {\sans\rm systeme} », il faut exécuter :
\begitems\style{---}
	* |\input systeme.tex| ou |\input{systeme.tex}| lorsqu'on utilise (pdf)(Xe)(lua)\TeX;
	* |\usepackage{systeme}| dans le préambule lorsqu'on utilise (pdf)(Xe)(lua)\LaTeX.
\enditems

Les extensions \texttt{\ulink[https://www.ctan.org/pkg/xstring]{xstring}} et \texttt{\ulink[https://www.ctan.org/pkg/simplekv]{simplekv}} sont requises et chargées si cela n'a pas été le cas.

\sec Versions 0.5x

\NEW{0.5}Dans une consigne de tri (et seulement là), des inconnues peuvent comporter plusieurs tokens ; ainsi, les inconnues «|x^2|», «|x'|», «|x'^2|», ou encore «|a'_{*}|» sont valides dans une consigne de tri. On peut donc composer des systèmes non linéaires:
\exemple{Inconnues comportant plusieurs tokens}/\systeme[sort = {x^2 , x = x', x'^2 }]{
	2x-3x^2  = 1-x'^2+x',
	1+2x^2+x = m+x'^2-2x
}
\medbreak
\systeme[sort = {a'_{*}  = {} }]{
	a+a'+a'_1=2,
	2a'-3a'_1+2a'_2-k=1
}/

\sec La commande \code{\\systeme}

La commande principale est |\systeme| dont l'argument obligatoire contient les équations séparées les unes des autres par une virgule~:
\exemple{La commande \code{\\systeme}}/un système : \systeme{
	2a-3b+4c=2,
	a+8b+5c=8,
	-a+2b+c=-5
}/

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

L'alignement construit sera précédé d'une accolade et aura les spécificités suivantes :
\begitems\style{---}
	* les séparateurs de membres (signes d'égalité ou d'inégalité) sont alignés;
	* les signes «|+|» ou «|-|» entre chaque terme des membres sont alignés;
	* 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.
\enditems

Les inconnues peuvent avoir un indice, sous réserve que celui-ci soit un nombre {\em entier positif ou nul} (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 «|+|» 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 |\+| et |\-| sont redéfinies pendant l'exécution de la macro |\systeme| pour échapper «|+|» et «|-|», 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
}/

\sec La commande \code{\\setsysteme}

La macro |\setsysteme| reçoit dans son argument obligatoire une liste de « clés/valeurs »
\syscode/\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 |\resetsysteme|.

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

Remarque : lorsqu'une |<valeur>| contient une virgule, un crochet fermant ou un signe égal, cette |<valeur>| {\em 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.

\sec Tri des inconnues, la clé \STkey{sort}

\secc 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
\syscode|sort = {<consigne pour le membre de gauche> = <consigne pour le membre de droite>}|

Une |<consigne>| peut être :
\begitems\style{---}
	* «|*|», ce qui est la valeur par défaut ; dans ce cas, seules les inconnues entre |a| et |z| (en minuscules) sont prises en compte et sont triées dans l'ordre alphabétique ;
	* un ordre de tri forcé indiqué par une liste d'inconnues séparées par des virgules (les espaces sont ignorés dans les consignes de tri), sachant que «|0|» représente le terme constant et si «|0|» est omis, le terme constant est placé en dernière position ;
	* vide «|{}|» auquel cas, aucune inconnue ne sera reconnue et tout le membre sera considéré comme le terme constant.
\enditems

La valeur par défaut de la clé \STkey{sort} est 
\syscode|sort = {*=*}|
ce qui signifie que le tri par ordre alphabétique est actif dans les deux membres.

\exemple{Tri forcé 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-3n^2
}/

On peut ainsi utiliser des inconnues en lettres 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
}/

Il est également possible de spécifier des inconnues constituées de plusieurs tokens dans une consigne de tri :
\exemple{Inconnues comportant plusieurs tokens}/\systeme[sort = {x, x', x'' = {} } ]{
	2x'-x''+3x=0,
	x'+2x''-x=-1,
	-3x'+x''+x=2
}\bigbreak
\systeme[sort = {x, x^2, a = a, a^2} ]{%
	2x^2-x+a-1=a^2-a,
	x-a=-2a^2+1,
	-x^2+3x+1=2a+3
}/

On peut observer dans cet exemple les différentes places qu'occupe le terme constant dans le membre de gauche selon la place de «|0|» dans la consigne de tri :
\exemple{Consigne de tri du membre constant}/\systeme[sort = {x, y = {} }]{% par défaut
	2x+y-1=0,
	x-3y+2-a=1
}
\bigbreak
\systeme[sort = {x, 0, y = {} }]{%
	2x+y-1=0,
	x-3y+2-a=1
}
\bigbreak
\systeme[sort = {0, x, y = {} }]{%
	2x+y-1=0,
	x-3y+2-a=1
}/

\secc Inconnues indicées
On peut indiquer une liste d'inconnues indicées dans la consigne de tri. Dans cet exemple, seules |a_1| et |a_3| sont considérées comme inconnues et on voit que |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 demander la consigne de tri |x_{*}| pour indiquer que |x| seul ou muni d'un indice (numérique ou non) doit être considéré comme inconnue. L'astérisque {\em doit} être entre accolades. Dans le système final, l'ordre de tri des inconnues est celui dans lequel elles apparaissent dans le code.
\exemple{Indices quelconques}/\systeme[ sort = {x_{*}={} } ]{
	x+x_1-x_n-c=3,
	x_0-3x_1+2x_n+1=0,
	x_n-x_0+2x_1-1=0
}/

Pour indicer une inconnue comportant plusieurs tokens, il est nécessaire de mettre tous les tokens constituant l'inconnue avant le token «|_|». On doit donc écrire |x^2_1| et non pas |x_1^2| qui serait compris comme l'inconnue |x_1| suivi de |^2| et donc indûment placé dans la colonne des |x_1| :
\exemple{Indices en dernier !}/\systeme[ sort = {x_1,x^2_1  = {} } ]{
	x^2_1+x_1+1=0,
	x_1^2-2=0% x_1^2 placé dans la colonne des x_1 !
}/

\sec Les autres 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.

\secc 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 
\syscode/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
}/

\secc Retour charriot entre équations, la clé \STkey{cr eq sep}
Afin que la saisie soit la plus naturelle possible, la clé booléenne \STkey{cr eq sep} définie par défaut à
\syscode/cr eq sep = false/
permet, si elle est |true| de faire du retour charriot le séparateur entre équations, quelle que soit la valeur de la clé \STkey{eq sep}.

Dans ce cas :
\begitems\style{---}
	* si l'on veut placer la macro |\systeme| dans l'argument d'une macro, il est {\em impératif} de prendre des précautions avec les macros |\SYSmakecrother| et |\SYSrestorecr| qui délimitent un environnement spécial ou bien avec la macro |\SYSallowcr|;
	* la clé \STkey{ignore empty eq} (voir ci-dessous) est mise à |true| pour le système concerné.
\enditems

\exemple{Retour charriot entre équations}/\systeme[cr eq sep = true]{
	2a-c=-1
	a-2b+c=4
	-3a-b+2c=-1
}\par
\SYSmakecrother% <- commentaire nécessaire
\inoval{%
	\systeme[cr eq sep = true]{
		a-2b=-1
		-3a+b=-1
	}%
}%
\SYSrestorecr\par
\SYSallowcr\inoval{%
	\systeme[cr eq sep = true]{
		a-2b=-1
		-3a+b=-1
	}%
}/

Il est important de noter qu'entre  |\SYSmakecrother| et |\SYSrestorecr|, toutes les fins de lignes n'étant pas dans l'argument de la macro b|\systeme| doivent être commentées (même celles se trouvant après une macro). L'utilisation de la macro |\SYSallowcr| est plus simple de ce point de vue :
\syscode/\SYSallowcr\macro{\systeme[cr eq sep = true]{<code du système>}}
\SYSallowcr{\macro[<arg optionnels>]}{\systeme[cr eq sep = true]{<code du système>}}/

\secc Équations vides ignorées, la clé \STkey{ignore empty eq}
Cette clé vaut par défaut
\syscode/ignore empty eq = true/
Elle peut être réglée à |false| pour tenir compte des équations vides qui alors, produisent une ligne blanche.

\exemple{Équations vides}/\systeme{
	a+b+c=1,
	a-b+c=-2,
	 ,
	a-b-c=3
}\qquad
\systeme[ignore empty eq = false]{
	a+b+c=1,
	a-b+c=-2,
	 ,
	a-b-c=3
}/

\secc 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 |\left| et |\right|. La valeur par défaut est
\syscode/delim = { \{ , . } /
ce qui place une accolade à gauche du système et rien à droite.
\begingroup
\catcode`\|12 % neutralise le caractère de verbatim
\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}/%
\endgroup

\secc 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 |r|, |c| ou |l|. La valeur par défaut est 
\syscode|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é)!

\secc 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
\syscode|align const sign = true|
ce qui aligne toujours les signes des termes constants.

Il faut la mettre à |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
}!

\secc 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 {\sans\rm systeme} comme séparateur de membres.
La valeur par défaut est
\specialcode\syscode/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)

\secc 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
\syscode|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
}/

\secc 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
\syscode|member sep subst = { <tokens bruts> , <tokens pour affichage> }|

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

\secc 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 «|+|» ou «|-|» 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
\syscode|sign space       = 0pt,
member sep space = 0pt,
line skip coeff  = 1.25|

\exemple[55]{Espacements}/Espacement entre lignes:\par
\systeme{x+y=200,x-2y=10}\qquad
\systeme[line skip coeff=1]{x+y=200,x-2y=10}\qquad
\systeme[line skip coeff=1.75]{x+y=200,x-2y=10}\bigbreak

Espacement autour de «=» :\par
\systeme{x+y=200,x-2y=10}\qquad
\systeme[member sep space=2.5pt]{x+y=200,x-2y=10}\qquad
\systeme[member sep space=5pt]{x+y=200,x-2y=10}\bigbreak

Espacement autour de «$+$» et «$-$» :\par
\systeme{x+y=200,x-2y=10}\qquad
\systeme[sign space=2.5pt]{x+y=200,x-2y=10}\qquad
\systeme[sign space=5pt]{x+y=200,x-2y=10}/

Lorsqu'une inconnue est précédée d'un coefficient explicite (c'est-à-dire que cette inconnue ne suit pas un signe |+| ou |-|), la clé \STkey{coeff space} permet de définir une espace mathématique (donc impérativement exprimée en |mu|) {\em 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
\syscode|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
}|

\secc Colonne supplémentaire, clés \STkey{extra col sign}, \STkey{extra col pre} et \STkey{extra col post}
Lorsqu'une équation comporte le signe «|@|», 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 «|@|» peut être changé en un autre avec la clé \STkey{extra col sign} dont la valeur par défaut est
\syscode|extra col sign = @|

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

Cette colonne supplémentaire n'est {\em 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
\syscode|extra col pre  = \kern1.5em$,
extra col post = $|

ce qui signifie qu'une espace horizontale d'1.5em est insérée et le «|$|» entre en mode mathématique au début de la colonne. Enfin, pour le second argument, «|$|» 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 :
\begingroup
\catcode`\|12
\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
}/%
\endgroup

\secc 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 «|*|» 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 {\em 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 «|L'_{*}=L_1|» à la première ligne car la totalité de ce schéma et notamment la partie indésirable «|L_1|» serait reproduite aux lignes suivantes. On peut donc spécifier le schéma de numérotation d'une deuxième façon, {\em 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
\syscode|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 {\em que pour le prochain système} et sera effacé ensuite, sauf si on met à |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
\syscode|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} :
\syscode|autonum code = {}|

Il existe un compteur global\fnote{Il s'agit d'un compteur \TeX{} portant le doux nom de {\ttfam\string\SYSeqnum}, accessible via les commandes \TeX{} habituelles, c'est-à-dire qu'on peut le faire précéder de {\ttfam\string\number}, {\ttfam\string\romannumeral} pour l'afficher.} d'équations accessible de la même façon que le compteur local mais avec «|**|». 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{**}({\bf**}),
	2x+y+z=1@\gdef\bar{**}({\bf**}),
	x-z=8   @\gdef\baz{**}({\bf**})
}

L'équation numéro \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}:
\syscode|main eq count = <valeur entière>|
L'assignation ainsi effectuée est globale.

\secc 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 {\em positive} de la clé \STkey{extra height} dont la valeur par défaut est
\syscode|extra height = 1.5pt|

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

\secc Non alignement des termes, la clé \STkey{align terms}
Cette clé, qui vaut |true| par défaut, permet, si elle est assignée à |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
}/

\secc 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}:
\syscode|post subst = {<x1> <y1> <x2> <y2>...<xn> <yn>}|
ce qui a pour effet de remplacer toutes les occurrences de |<x1>| par |<y1>|, celles de |<x2>| par |<y2>|, etc. Un ou plusieurs espaces (ignorés) peuvent se trouver entre les motifs de substitution.

La valeur de cette clé est
\syscode|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 «|.|» soient remplacés par des «|,|». 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
}/

\secc Sauvegarde du code produit dans une macro, la clé \STkey{store}
Pour sauvegarder le code résultant de la macro |systeme| dans une |<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 {\em seule} qui recevra le code. Toute autre valeur conduit à une erreur.

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

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

Si l'on écrit
\syscode|\systeme[store=\mysys]{3x-2y+z=-4,
                       x+5z=2,
                       -x+y-2z=0}|
alors la macro |\mysys| contient le code suivant
\begingroup
\syscode|\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

\secc Code exécuté avant l'alignement, la clé \STkey{code before}
Juste avant que le |\halign| n'entre en action, la valeur de la clé \STkey{code before} est exécutée. Elle peut être utile pour exécuter un code arbitraire en vue, par exemple, de faire certains réglages mathématiques effectués par |\mathcode|, |\delcode| ou autre. Par défaut, la valeur\fnote{Dans ce manuel, composé avec Op\TeX, la valeur du {\ttfam\string\mathcode} de la virgule a été réglée à {\ttfam"012C} avec le code\par\code{\\setsysteme\{code before = \{\\mathcode`\\,="012C\}\}}».} de cette clé est
\syscode|code before = \mathcode`\, "013B|
ce qui donne à la virgule des espacements corrects lorsqu'elle est utilisée comme délimiteur décimal comme c'est l'usage en France.

\sec Exemples
La macro |\systeme| peut être un peu détournée de ses fins pour écrire sans contrainte des calculs en ligne, où le signe |=| 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={{}={}},
		cr eq sep = true
		]{
	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 |\aligncalc|, intégrée dans le package {\sans\rm systeme}, est programmée de la façon suivante 
\syscode/\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 |cases| de \LaTeX.
\begingroup
\catcode`\|12
\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$%
}$!
\endgroup

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
}!

\exemple{}!% https://tex.stackexchange.com/questions/475993/
\systeme[sort={ 0, s, t = {} }]{
	3+2t+s=x,
	s+2=y,
	1+t+2s=z
}!
\bigbreak
\begingroup
\typoscale[1500/]
\centerline{$\star$}\par
\centerline{$\star$\kern0.5em$\star$}
\endgroup
\medbreak
J'espère que ce package vous sera utile !\par\nobreak
Merci de me signaler par {\Sourcepro\typoscale[800/]\mono\bolder\rm\ulink[mailto:unbonpetit@netc.fr]{email}} tout bug ou toute proposition d'amélioration.
\bye