summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/customenvs
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/customenvs')
-rw-r--r--macros/latex/contrib/customenvs/README.md7
-rw-r--r--macros/latex/contrib/customenvs/doc/customenvs-doc-en.pdfbin0 -> 95687 bytes
-rw-r--r--macros/latex/contrib/customenvs/doc/customenvs-doc-en.tex341
-rw-r--r--macros/latex/contrib/customenvs/doc/customenvs-doc-fr.pdfbin0 -> 203410 bytes
-rw-r--r--macros/latex/contrib/customenvs/doc/customenvs-doc-fr.tex559
-rw-r--r--macros/latex/contrib/customenvs/tex/customenvs.sty442
6 files changed, 1349 insertions, 0 deletions
diff --git a/macros/latex/contrib/customenvs/README.md b/macros/latex/contrib/customenvs/README.md
new file mode 100644
index 0000000000..68ef414e62
--- /dev/null
+++ b/macros/latex/contrib/customenvs/README.md
@@ -0,0 +1,7 @@
+customenvs is a package with some classics custom environments.
+----------------------------------------------------------------------
+customenvs est un package avec environnements classiques personnalisés.
+----------------------------------------------------------------------
+Author : Cédric Pierquet
+email : cpierquet@outlook.fr
+Licence : Released under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txt \ No newline at end of file
diff --git a/macros/latex/contrib/customenvs/doc/customenvs-doc-en.pdf b/macros/latex/contrib/customenvs/doc/customenvs-doc-en.pdf
new file mode 100644
index 0000000000..49dd9c958e
--- /dev/null
+++ b/macros/latex/contrib/customenvs/doc/customenvs-doc-en.pdf
Binary files differ
diff --git a/macros/latex/contrib/customenvs/doc/customenvs-doc-en.tex b/macros/latex/contrib/customenvs/doc/customenvs-doc-en.tex
new file mode 100644
index 0000000000..e1bbbe1918
--- /dev/null
+++ b/macros/latex/contrib/customenvs/doc/customenvs-doc-en.tex
@@ -0,0 +1,341 @@
+% !TeX TXS-program:compile = txs:///arara
+% arara: lualatex: {shell: yes, synctex: no, interaction: batchmode}
+% arara: lualatex: {shell: yes, synctex: no, interaction: batchmode} if found('log', '(undefined references|Please rerun|Rerun to get)')
+
+\documentclass[english,11pt,a4paper]{article}
+%\usepackage[utf8x]{inputenc}
+%\usepackage[T1]{fontenc}
+%\usepackage{DejaVuSerif}
+%\usepackage[scale=1.1]{inconsolata}
+\usepackage{customenvs}
+\usepackage{xspace}
+\usepackage{tabularx}
+\usepackage{soul}
+\usepackage{codehigh}
+\usepackage{fontawesome5}
+\usepackage{lipsum}
+\usepackage{fancyvrb}
+\usepackage{fancyhdr}
+\fancyhf{}
+\renewcommand{\headrulewidth}{0pt}
+\lfoot{\sffamily\small [customenvs]}
+\cfoot{\sffamily\small - \thepage{} -}
+\rfoot{\hyperlink{matoc}{\small\faArrowAltCircleUp[regular]}}
+\usepackage{hologo}
+\providecommand\tikzlogo{Ti\textit{k}Z}
+\providecommand\TeXLive{\TeX{}Live\xspace}
+\providecommand\PSTricks{\textsf{PSTricks}\xspace}
+\let\pstricks\PSTricks
+\let\TikZ\tikzlogo
+
+\usepackage{hyperref}
+\urlstyle{same}
+\hypersetup{pdfborder=0 0 0}
+\usepackage[margin=1.5cm]{geometry}
+\setlength{\parindent}{0pt}
+
+\def\TPversion{0.1.0}
+\def\TPdate{22/10/2023}
+\usepackage{tcolorbox}
+\sethlcolor{lightgray!25}
+\NewDocumentCommand\MontreCode{ m }{%
+ \hl{\vphantom{\texttt{pf}}\texttt{#1}}%
+}
+
+\usepackage{babel}
+
+\begin{document}
+
+\pagestyle{fancy}
+
+\thispagestyle{empty}
+
+\begin{center}
+ \begin{minipage}{0.75\linewidth}
+ \begin{tcolorbox}[colframe=yellow,colback=yellow!15]
+ \begin{center}
+ \renewcommand\arraystretch{1.25}
+ \begin{tabular}{c}
+ {\Huge \texttt{customenvs [en]}}\\
+ \\
+ {\Large Some custom environments,} \\
+ {\Large with spacing enhancements.} \\
+ \end{tabular}
+ \renewcommand\arraystretch{1}
+
+ \medskip
+
+ {\small \texttt{Version \TPversion{} -- \TPdate}}
+ \end{center}
+ \end{tcolorbox}
+\end{minipage}
+\end{center}
+
+\vspace*{1mm}
+
+\begin{center}
+ \begin{tabular}{c}
+ \texttt{Cédric Pierquet}\\
+ {\ttfamily c pierquet -- at -- outlook . fr}\\
+ \texttt{\url{https://github.com/cpierquet/customenvs}}
+\end{tabular}
+\end{center}
+
+\vspace*{5mm}
+
+%\hrule
+%
+%\vspace*{2mm}
+%
+%{\centering Le nom du package vient de \textsf{ENVironnemenTS ALTernatifs}, avec le suffixe \textsf{FRançais}.\par}
+%
+%\vspace*{2mm}
+%
+%\hrule
+%
+%\vspace*{1cm}
+
+\hrule
+
+\phantomsection
+
+\hypertarget{matoc}{}
+
+\tableofcontents
+
+\vspace*{5mm}
+
+\hrule
+
+\vfill
+
+\section{History}
+
+\verb|v0.1.0|~:~~~~Initial version
+
+\vspace*{5mm}
+
+\pagebreak
+
+\section{The package customenvs}
+
+\subsection{Idea}
+
+The idea is to propose some classics environments with customizations :
+
+\begin{itemize}
+ \item write in \textit{multicols}, with spacings enhancements ;
+ \item present answers for a \textit{MCQ} ;
+ \item create a list with \textit{choosen items} (randomly or by numbers).
+\end{itemize}
+
+\smallskip
+
+The globa idea is ti propose \textit{user-friendly} environments, with explicit customizations, without using verbose syntax ; but there's other solutions, using for example \MontreCode{\textbackslash vspace} ou \MontreCode{\textbackslash setlength} or \MontreCode{spacingtricks} package.
+
+\subsection{Loading}
+
+The package loads within the preamble with \MontreCode{\textbackslash usepackage\{customenvs\}}.
+
+Loaded packages are
+
+\begin{itemize}
+ \item \MontreCode{xstring}, \MontreCode{simplekv}, \MontreCode{listofitems}, \MontreCode{randomlist} and \MontreCode{xintexpr} ;
+ \item \MontreCode{enumitem} ;
+ \item \MontreCode{multicol} ;
+ \item \MontreCode{tabularray}.
+\end{itemize}
+
+Due to limitations, \MontreCode{enumitem} or \MontreCode{multicol} or \MontreCode{tabularray} can be \textit{un}loaded by \MontreCode{customenvs} (user must load them manually) via options :
+
+\begin{itemize}
+ \item \MontreCode{$\mathtt{\langle}$noenum$\mathtt{\rangle}$} ;
+ \item \MontreCode{$\mathtt{\langle}$nomulticol$\mathtt{\rangle}$} ;
+ \item \MontreCode{$\mathtt{\langle}$notblr$\mathtt{\rangle}$}.
+\end{itemize}
+
+\begin{codehigh}[language=latex/latex3,style/main=teal!25,style/code=teal!25]
+%with all packages
+\usepackage{customenvs}
+
+%with option to no load some packages
+\usepackage[option(s)]{customenvs}
+\end{codehigh}
+
+\newpage
+
+\section{Answers for a MCQ}
+
+\subsection{Idea}
+
+The idea is to propose an environment to present answers for a MQC with \MontreCode{tabularray} (and not \MontreCode{multicols}).
+
+\smallskip
+
+It's possible to use 2, 3 or 4 answers (and with 4 answers it's possible to use 2 columns.)
+
+\begin{codehigh}[language=latex/latex3,style/main=teal!25,style/code=teal!25]
+\AnswersMCQ[options]{list of answers}<tblr options>
+\end{codehigh}
+
+The avalailable \MontreCode{options} are :
+
+\begin{itemize}
+ \item \MontreCode{Width} : \MontreCode{0.99\textbackslash linewidth} by default ;
+ \item \MontreCode{Lines} : \MontreCode{false} by default ;
+ \item \MontreCode{SpaceCR} for Columns/Rows spacing, within \MontreCode{col/row} or \MontreCode{global} : \MontreCode{6pt/2pt} by default ;
+ \item \MontreCode{NumCols}, 2 or 4 : \MontreCode{4} by default ;
+ \item \MontreCode{Labels} for the labels : \MontreCode{a.} by default ;
+ \begin{itemize}
+ \item with \MontreCode{a} to \textit{enumerate} \MontreCode{a b c d} ;
+ \item with \MontreCode{A} to \textit{enumerate} \MontreCode{A B C D} ;
+ \item with \MontreCode{1} to \textit{enumerate} \MontreCode{1 2 3 4} ;
+ \end{itemize}
+ \item \MontreCode{FontLabels} : \MontreCode{\textbackslash bfseries} by default ;
+ \item \MontreCode{SpaceLabels} : \MontreCode{\textbackslash kern5pt} by default ;
+ \item \MontreCode{Swap}, for ACBD instead of ABCD : \MontreCode{false} by default.
+\end{itemize}
+
+The list of answers must be given within \MontreCode{answA § answB § ...}.
+
+Specific options for \MontreCode{tblr} are given between last optionnal argument, between \MontreCode{<...>}.
+
+\subsection{Examples}
+
+\begin{demohigh}[language=latex/latex3,style/main=teal!25,style/code=teal!25]
+%default output
+\AnswersMCQ{Answer A § Answer B § Answer C § Answer D}
+\end{demohigh}
+
+\begin{demohigh}[language=latex/latex3,style/main=teal!25,style/code=teal!25]
+\AnswersMCQ[Lines]{Answer A § Answer B § Answer C § Answer D}
+\end{demohigh}
+
+\begin{demohigh}[language=latex/latex3,style/main=teal!25,style/code=teal!25]
+\AnswersMCQ[Lines,Labels=(1.),SpaceLabels={~~~}]{Answer A § Answer B § Answer C}
+\end{demohigh}
+
+\begin{demohigh}[language=latex/latex3,style/main=teal!25,style/code=teal!25]
+\AnswersMCQ[Labels={A.},FontLabels={\color{red}\bfseries}]%
+ {Answer A § Answer B § Answer C § Answer D}
+\end{demohigh}
+
+\begin{demohigh}[language=latex/latex3,style/main=teal!25,style/code=teal!25]
+\AnswersMCQ[Labels={1.},FontLabels={\color{red}\bfseries}]%
+ {Answer A § Answer B § Answer C § Answer D}
+\end{demohigh}
+
+\begin{demohigh}[language=latex/latex3,style/main=teal!25,style/code=teal!25]
+\AnswersMCQ[NumCols=2,Labels={A.},FontLabels={\color{red}\bfseries}]%
+ {Answer A § Answer B § Answer C § Answer D}
+\end{demohigh}
+
+\begin{demohigh}[language=latex/latex3,style/main=teal!25,style/code=teal!25]
+\AnswersMCQ[NumCols=2,Swap,Labels={A.},FontLabels={\color{red}\bfseries}]%
+ {Answer A § Answer B § Answer C § Answer D}
+\end{demohigh}
+
+\begin{demohigh}[language=latex/latex3,style/main=teal!25,style/code=teal!25]
+\AnswersMCQ[Lines,NumCols=2,SpaceCR=6pt/10pt]%
+ {Answer A § Answer B § Answer C § Answer D}
+\end{demohigh}
+
+\begin{demohigh}[language=latex/latex3,style/main=teal!25,style/code=teal!25]
+\AnswersMCQ[Width=10cm,NumCols=2,Lines]%
+ {$\displaystyle\frac1x$ § $1+\displaystyle\frac1x$ § $-2x^2+5$ § $-\infty$}
+ <rows={1.5cm}>
+\end{demohigh}
+
+\pagebreak
+
+\section{List avec with picked elements (random or not)}
+
+\subsection{Global use}
+
+The idea is to :
+
+\begin{itemize}
+ \item create a list of items, the base for choices ;
+ \item print the list with picked items.
+\end{itemize}
+
+\begin{codehigh}[language=latex/latex3,style/main=teal!25,style/code=teal!25]
+\CreateItemsList{list}{macro}{listname}
+\end{codehigh}
+
+\begin{codehigh}[language=latex/latex3,style/main=teal!25,style/code=teal!25]
+\ListItemsChoice[keys]{macro}{listname}(numbers)<enumitem options>
+\end{codehigh}
+
+The available \MontreCode{keys} are :
+
+\begin{itemize}
+ \item \MontreCode{Type} : \MontreCode{enum} or \MontreCode{item} ;
+ \item \MontreCode{Random} : \MontreCode{false} by default.
+\end{itemize}
+
+The second argument, mandatory and between \MontreCode{\{...\}} is the macro for the list.
+
+The third argument, mandatory and between \MontreCode{\{...\}} is the name of the list.
+
+The fourth argument, mandatory and between \MontreCode{(...)} give :
+
+\begin{itemize}
+ \item the number of random items to display, with \MontreCode{Random=true} ;
+ \item the numbers of picked itemps, within \MontreCode{num1,num2,...}.
+\end{itemize}
+
+
+The last argument, optional and between \MontreCode{<...>} gives specific options to \MontreCode{enumitem} environment.
+
+\medskip
+
+Controls are done :
+
+\begin{itemize}
+ \item to verify that the liste doesn't exist (for the creation) ;
+ \item to verify that that the list still exist (for the display).
+\end{itemize}
+
+\subsection{Examples}
+
+\begin{codehigh}[language=latex/latex3,style/main=teal!25,style/code=teal!25]
+%creation of list ListItems, with macro \mylistofitems
+\CreateItemsList%
+ {Answer A,Answer B,Answer C,Answer D,Answer E,Answer F,Answer G,Answer H}%
+ {\mylistofitems}{ListItems}
+\end{codehigh}
+
+\CreateItemsList%
+{Answer A,Answer B,Answer C,Answer D,Answer E,Answer F,Answer G,Answer H}%
+{\mylistofitems}{ListItems}
+
+\begin{demohigh}[language=latex/latex3,style/main=teal!25,style/code=teal!25]
+%items random
+\ListItemsChoice[Random]{\mylistofitems}{ListItems}(5)
+\end{demohigh}
+
+\begin{demohigh}[language=latex/latex3,style/main=teal!25,style/code=teal!25]
+%items picked
+\ListItemsChoice{\mylistofitems}{ListItems}(1,4,3,8,2)
+\end{demohigh}
+
+\begin{codehigh}[language=latex/latex3,style/main=teal!25,style/code=teal!25]
+%creation of list ListItemsB, with macro \mylistofitemsb
+\CreateItemsList%
+ {{$\int_0^1 x^2 dx$},{$\int_0^1 x^3 dx$},{$\int_0^1 x^4 dx$},...}%
+ {\mylistofitemsb}{ListItemsB}
+\end{codehigh}
+
+\CreateItemsList%
+{{$\int_0^1 x^2 dx$},{$\int_0^1 x^3 dx$},{$\int_0^1 x^4 dx$},{$\int_0^1 x^5 dx$},{$\int_0^1 x^6 dx$},{$\int_0^1 x^7 dx$},{$\int_0^1 x^8 dx$}}%
+{\mylistofitemsb}{ListItemsB}
+
+\begin{codehigh}[language=latex/latex3,style/main=teal!25,style/code=teal!25]
+%items picked
+\ListItemsChoice[Type=item]{\mylistofitemsb}{ListItemsB}(7,2,1,5,3)<label=$--$>
+\end{codehigh}
+
+\ListItemsChoice[Type=item]{\mylistofitemsb}{ListItemsB}(7,2,1,5,3)<label=$--$>
+
+\end{document} \ No newline at end of file
diff --git a/macros/latex/contrib/customenvs/doc/customenvs-doc-fr.pdf b/macros/latex/contrib/customenvs/doc/customenvs-doc-fr.pdf
new file mode 100644
index 0000000000..8729772ec0
--- /dev/null
+++ b/macros/latex/contrib/customenvs/doc/customenvs-doc-fr.pdf
Binary files differ
diff --git a/macros/latex/contrib/customenvs/doc/customenvs-doc-fr.tex b/macros/latex/contrib/customenvs/doc/customenvs-doc-fr.tex
new file mode 100644
index 0000000000..5e610ba0dc
--- /dev/null
+++ b/macros/latex/contrib/customenvs/doc/customenvs-doc-fr.tex
@@ -0,0 +1,559 @@
+% !TeX TXS-program:compile = txs:///arara
+% arara: pdflatex: {shell: yes, synctex: no, interaction: batchmode}
+% arara: pdflatex: {shell: yes, synctex: no, interaction: batchmode} if found('log', '(undefined references|Please rerun|Rerun to get)')
+
+\documentclass[french,11pt,a4paper]{article}
+\usepackage[utf8]{inputenc}
+\usepackage[T1]{fontenc}
+\RequirePackage[upright]{fourier}
+\RequirePackage{mathtools}
+\RequirePackage{amsmath,amssymb,amstext}
+\RequirePackage[scaled=0.875]{helvet}
+\renewcommand\ttdefault{lmtt}
+\RequirePackage[scaled=0.925]{cabin} % sf
+%\usepackage{DejaVuSerif}
+%\usepackage[scale=1.1]{inconsolata}
+\usepackage{customenvs}
+\usepackage{tabularx}
+\usepackage{soul}
+%\usepackage{codehigh}
+\usepackage{fontawesome5}
+\usepackage{lipsum}
+\usepackage{fancyvrb}
+\usepackage{fancyhdr}
+\fancyhf{}
+\renewcommand{\headrulewidth}{0pt}
+\lfoot{\sffamily\small [customenvs]}
+\cfoot{\sffamily\small - \thepage{} -}
+\rfoot{\hyperlink{matoc}{\small\faArrowAltCircleUp[regular]}}
+\usepackage{hologo}
+\providecommand\tikzlogo{Ti\textit{k}Z}
+\providecommand\TeXLive{\TeX{}Live\xspace}
+\providecommand\PSTricks{\textsf{PSTricks}\xspace}
+\let\pstricks\PSTricks
+\let\TikZ\tikzlogo
+
+\usepackage{hyperref}
+\urlstyle{same}
+\hypersetup{pdfborder=0 0 0}
+\usepackage[margin=1.5cm]{geometry}
+\setlength{\parindent}{0pt}
+
+\def\TPversion{0.1.0}
+\def\TPdate{22 octobre 2023}
+\usepackage[most]{tcolorbox}
+\tcbuselibrary{listingsutf8}
+\newtcblisting{DemoCode}[1]{%
+ enhanced,width=0.95\linewidth,center,%
+ bicolor,size=title,%
+ colback=cyan!5!white,%
+ colbacklower=cyan!1!white,%
+ colframe=cyan!75!black,%
+ listing options={%
+ breaklines=true,%
+ breakatwhitespace=true,%
+ style=tcblatex,basicstyle=\small\ttfamily,%
+ tabsize=4,%
+ commentstyle={\itshape\color{gray}},
+ keywordstyle={\color{blue}},%
+ classoffset=0,%
+ keywords={usepackage,displaystyle,frac,infty,begin,end,lipsum,centering,par,baselineskip,item,bullet,int,color},%
+ alsoletter={-},%
+ keywordstyle={\color{blue}},%
+ classoffset=1,%
+ alsoletter={-},%
+ morekeywords={center,justify},%
+ keywordstyle={\color{violet}},%
+ classoffset=2,%
+ alsoletter={-},%
+ morekeywords={\ReponsesQCM,MultiCols,\CreerListeItems,\ListeChoixItems},%
+ keywordstyle={\color{green!50!black}},%
+ classoffset=3,%
+ morekeywords={Largeur,Filets,EspacesCL,NbCols,Labels,PoliceLabels,EspaceLabels,Swap,Type,CoeffEspVert,EpTrait,Alea},%
+ keywordstyle={\color{orange}}
+ },%
+ #1
+}
+\sethlcolor{lightgray!25}
+\NewDocumentCommand\MontreCode{ m }{%
+ \hl{\vphantom{\texttt{pf}}\texttt{#1}}%
+}
+
+\usepackage{babel}
+
+\begin{document}
+
+\pagestyle{fancy}
+
+\thispagestyle{empty}
+
+\begin{center}
+ \begin{minipage}{0.75\linewidth}
+ \begin{tcolorbox}[colframe=yellow,colback=yellow!15]
+ \begin{center}
+ \renewcommand\arraystretch{1.25}
+ \begin{tabular}{c}
+ {\Huge \texttt{customenvs [fr]}}\\
+ \\
+ {\Large Quelques environnements classiques,} \\
+ {\Large légèrement modifiés, et basés} \\
+ {\Large sur des environnements existants.} \\
+ \end{tabular}
+ \renewcommand\arraystretch{1}
+
+ \medskip
+
+ {\small \texttt{Version \TPversion{} -- \TPdate}}
+ \end{center}
+ \end{tcolorbox}
+\end{minipage}
+\end{center}
+
+\vspace*{1mm}
+
+\begin{center}
+ \begin{tabular}{c}
+ \texttt{Cédric Pierquet}\\
+ {\ttfamily c pierquet -- at -- outlook . fr}\\
+ \texttt{\url{https://github.com/cpierquet/customenvs}}
+\end{tabular}
+\end{center}
+
+\vspace*{5mm}
+
+%\hrule
+%
+%\vspace*{2mm}
+%
+%{\centering Le nom du package vient de \textsf{ENVironnemenTS ALTernatifs}, avec le suffixe \textsf{FRançais}.\par}
+%
+%\vspace*{2mm}
+%
+%\hrule
+%
+%\vspace*{1cm}
+
+\hrule
+
+\phantomsection
+
+\hypertarget{matoc}{}
+
+\tableofcontents
+
+\vspace*{5mm}
+
+\hrule
+
+\vfill
+
+\section{Historique}
+
+\verb|v0.1.0|~:~~~~Version initiale
+
+\vspace*{5mm}
+
+\pagebreak
+
+\section{Le package customenvs}
+
+\subsection{Idée}
+
+L'idée est de proposer des commandes ou environnements classiques avec quelques éléments de personnalisation (via des \textsf{clés} francisées), comme :
+
+\begin{itemize}
+ %\item modifier localement l'\textit{alignement vertical} d'éléments sans jambage ;
+ \item \textit{centrer} avec gestion des espacements autour ;
+ \item écrire en \textit{multi-colonnes} avec gestion des espacements autour ;
+ \item mettre en forme des réponses à des \textit{QCM} ;
+ \item créer une liste avec \textit{choix des items} (de manière aléatoire ou par saisie directe).
+\end{itemize}
+
+\smallskip
+
+L'idée globale est de proposer des environnements clé en main, avec personnalisations \textit{explicites}, sans forcément avoir besoin de \textit{se pencher sur le code}, mais il est évident qu'il existe d'autres solutions pour l'utilisateur qui souhaite réellement contrôler son rendu.
+
+\smallskip
+
+Il est ici essentiellement question de gérer les espacements, donc on peut citer comme autres solutions possibles :
+
+\begin{itemize}
+ \item l'utilisation de \MontreCode{\textbackslash vspace} ou de \MontreCode{\textbackslash setlength} ;
+ \item le package \MontreCode{spacingtricks}.
+\end{itemize}
+
+\subsection{Chargement}
+
+Le package se charge dans le préambule, via \MontreCode{\textbackslash usepackage\{customenvs\}}.
+
+Les packages chargés sont :
+
+\begin{itemize}
+ \item \MontreCode{xstring}, \MontreCode{simplekv}, \MontreCode{listofitems}, \MontreCode{randomlist} et \MontreCode{xintexpr} ;
+ \item \MontreCode{enumitem} ;
+ \item \MontreCode{multicol} ;
+ \item \MontreCode{tabularray}.
+\end{itemize}
+
+À noter que, pour des raisons de compatibilité (ou d'incompatibilité), les packages \MontreCode{enumitem} ou \MontreCode{multicol} ou \MontreCode{tabularray} peuvent ne pas être chargés par \MontreCode{customenvs} (auxquels cas l'utilisateur devra les avoir chargés pour faire fonctionner certains environnements) via les options :
+
+\begin{itemize}
+ \item \MontreCode{$\mathtt{\langle}$nonenum$\mathtt{\rangle}$} ;
+ \item \MontreCode{$\mathtt{\langle}$nonmulticol$\mathtt{\rangle}$} ;
+ \item \MontreCode{$\mathtt{\langle}$nontblr$\mathtt{\rangle}$}.
+\end{itemize}
+
+\begin{DemoCode}{listing only}
+%chargement avec tous les packages
+\usepackage{customenvs}
+
+%chargement avec options(s) pour ne pas charger certains packages
+\usepackage[option(s)]{customenvs}
+\end{DemoCode}
+
+\newpage
+
+\section{Présentation de réponses à un QCM}
+
+\subsection{Principe}
+
+L'idée est de proposer une environnement prêt à l'emploi pour présenter, grâce à \MontreCode{tabularray} (et non pas à \MontreCode{multicols}) qui est donc à charger, les réponses à une question type QCM, données en colonnes.
+
+\smallskip
+
+Il est possible de spécifier 2, 3 ou 4 réponses, et dans le cas de 4 réponses il est possible de spécifier 1 ou 2 colonnes.
+
+\begin{DemoCode}{listing only}
+\ReponsesQCM[options]{liste reponses}<options tblr>
+\end{DemoCode}
+
+Les \MontreCode{options} disponibles sont :
+
+\begin{itemize}
+ \item \MontreCode{Largeur} pour spécifier la largeur du tableau, \MontreCode{0.99\textbackslash linewidth} par défaut ;
+ \item \MontreCode{Filets} pour afficher les filets, \MontreCode{false} par défaut ;
+ \item \MontreCode{EspacesCL} pour les espacements Colonnes/Lignes, sous la forme \MontreCode{col/lign} ou \MontreCode{globale}, et valant \MontreCode{6pt/2pt} par défaut ;
+ \item \MontreCode{NbCols} pour forcer le passage à 2 colonnes dans le cas de 4 réponses, \MontreCode{4} par défaut ;
+ \item \MontreCode{Labels} pour spécifier le formatage des labels, avec \MontreCode{a.} par défaut ;
+ \begin{itemize}
+ \item pouvant faire intervenir \MontreCode{a} pour \textit{numéroter} \MontreCode{a b c d} ;
+ \item pouvant faire intervenir \MontreCode{A} pour \textit{numéroter} \MontreCode{A B C D} ;
+ \item pouvant faire intervenir \MontreCode{1} pour \textit{numéroter} \MontreCode{1 2 3 4} ;
+ \end{itemize}
+ \item \MontreCode{PoliceLabels} pour la police des labels, \MontreCode{\textbackslash bfseries} par défaut ;
+ \item \MontreCode{EspaceLabels} pour gérer l'espacement entre le label et la réponse, et valant \MontreCode{\textbackslash kern5pt} par défaut ;
+ \item \MontreCode{Swap} pour afficher les (4) réponses en mode 2 colonnes sous la forme ACBD ou ABCD, et valant \MontreCode{false} par défaut.
+\end{itemize}
+
+La liste des réponses est à donner sous la forme \MontreCode{answA § answB § ...}
+
+Les options spécifiques, optionnelles et entre \MontreCode{<...>}, sont pour le dernier argument.
+
+\subsection{Exemples}
+
+\begin{DemoCode}{}
+%sortie par defaut
+\ReponsesQCM{Réponse A § Réponse B § Réponse C § Réponse D}
+\end{DemoCode}
+
+\begin{DemoCode}{}
+\ReponsesQCM[Filets]{Réponse A § Réponse B § Réponse C § Réponse D}
+\end{DemoCode}
+
+\begin{DemoCode}{}
+\ReponsesQCM[Filets,Labels=(1.),EspaceLabels={~~~}]{Réponse A § Réponse B § Réponse C}
+\end{DemoCode}
+
+\begin{DemoCode}{}
+\ReponsesQCM[Labels={A.},PoliceLabels={\color{red}\bfseries}]%
+ {Réponse A § Réponse B § Réponse C § Réponse D}
+\end{DemoCode}
+
+\begin{DemoCode}{}
+\ReponsesQCM[NbCols=4,Labels={A.},PoliceLabels={\color{red}\bfseries}]%
+ {Réponse A § Réponse B § Réponse C § Réponse D}
+\end{DemoCode}
+
+\begin{DemoCode}{}
+\ReponsesQCM[NbCols=2,Labels={A.},PoliceLabels={\color{red}\bfseries}]%
+ {Réponse A § Réponse B § Réponse C § Réponse D}
+\end{DemoCode}
+
+\begin{DemoCode}{}
+\ReponsesQCM[NbCols=2,Swap,Labels={A.},PoliceLabels={\color{red}\bfseries}]%
+ {Réponse A § Réponse B § Réponse C § Réponse D}
+\end{DemoCode}
+
+\begin{DemoCode}{}
+\ReponsesQCM[Filets,NbCols=2,EspacesCL=6pt/10pt]%
+ {Réponse A § Réponse B § Réponse C § Réponse D}
+\end{DemoCode}
+
+\begin{DemoCode}{}
+\ReponsesQCM[Largeur=10cm,NbCols=2,Filets]%
+ {$\displaystyle\frac1x$ § $1+\displaystyle\frac1x$ § $-2x^2+5$ § $-\infty$}
+ <rows={2cm}>
+\end{DemoCode}
+
+\pagebreak
+
+\section{Environnement Centrage}
+
+\subsection{Principe}
+
+L'idée est de proposer un environnement, basé sur \MontreCode{center}, avec une gestion plus fine des espacements avant et après.
+
+Le fait est qu'un environnement \MontreCode{center} génère des espacements (parfois) un peu trop grands autour (on peut également utiliser \MontreCode{\textbackslash centering} ou \MontreCode{\textbackslash centered} du package \MontreCode{spacingtricks}), et donc il s'agit ici de garder l'architecture \textit{environnement} et proposant des solutions pour modifier les espacements.
+
+\begin{DemoCode}{listing only}
+\begin{Centrage}[options]
+ %corps
+\end{Centrage}
+\end{DemoCode}
+
+Les \MontreCode{options} disponibles sont :
+
+\begin{itemize}
+ \item \MontreCode{Avant} pour spécifier l'espacement avant l'environnement, \MontreCode{0.33\textbackslash baselineskip} par défaut ;
+ \item \MontreCode{Apres} pour spécifier l'espacement après l'environnement, \MontreCode{0.33\textbackslash baselineskip} par défaut.
+\end{itemize}
+
+À noter que les espacements peuvent être donnés de manière absolue, ou via des dimensions existantes.
+
+\subsection{Exemples}
+
+\begin{DemoCode}{}
+%environnement center, par défaut
+\lipsum[1][1-3]
+
+\begin{center}
+ \lipsum[1][1]
+\end{center}
+
+\lipsum[1][1-2]
+\end{DemoCode}
+
+\begin{DemoCode}{}
+%centering
+\lipsum[1][1-3]\par
+
+{\centering\lipsum[1][1]\par}
+
+\lipsum[1][1-2]
+\end{DemoCode}
+
+\begin{DemoCode}{}
+%environnement Centrage, par défaut
+\lipsum[1][1-3]
+
+\begin{Centrage}
+ \lipsum[1][1]
+\end{Centrage}
+
+\lipsum[1][1-2]
+\end{DemoCode}
+
+\begin{DemoCode}{}
+%environnement Centrage, personnalisé
+\lipsum[1][1-3]
+
+\begin{Centrage}[Avant=0pt,Apres=0pt]
+ \lipsum[1][1]
+\end{Centrage}
+
+\lipsum[1][1-2]
+\end{DemoCode}
+
+\begin{DemoCode}{}
+%environnement Centrage, avec des listes
+\lipsum[2][3]
+
+\begin{itemize}
+ \item \lipsum[1][1]
+ \item \lipsum[1][2]
+\end{itemize}
+
+\begin{Centrage}[Avant=-0.25\baselineskip]
+ \lipsum[1][1]
+\end{Centrage}
+
+\lipsum[1][1-2]
+\end{DemoCode}
+
+\pagebreak
+
+\section{Environnement multi-colonnes}
+
+\subsection{Principe}
+
+L'idée est de proposer un environnement basé sur \MontreCode{multicols} (donc le package \MontreCode{multicol} est à charger), pour lequel les espacements avant et après peuvent être personnalisés.
+
+C'est la longueur \MontreCode{\textbackslash multicolsep}, qui vaut \MontreCode{12pt plus 4pt minus 3pt} par défaut, qui gère ces espacements.
+
+\smallskip
+
+L'idée est donc de proposer une environnement \textit{simplifié} intégrant une modification de cette longueur. Il sera également possible de créer automatiquement un environnement multi-colonnes combiné avec une liste d'énumération (avec \MontreCode{enumitem} chargé, par exemple) !
+
+De plus, si le multi-colonnes est destiné à accueillir une liste, les items seront correctement alignés avec une liste sans multi-colonnes.
+
+\begin{DemoCode}{listing only}
+\begin{MultiCols}[options](nbcols)<options enumitem>
+ %corps
+\end{MutiCols}
+\end{DemoCode}
+
+Les \MontreCode{options} disponibles sont :
+
+\begin{itemize}
+ \item \MontreCode{Type} pour spécifier le type d'environnement qui sera inclus en multi-colonnes, et valant \MontreCode{texte} par défaut ;
+
+ \hfill{}à choisir parmi \MontreCode{texte / enum / item}
+ \item \MontreCode{CoeffEspVert} pour spécifier le coefficient à appliquer à la longueur par défaut, et valant \MontreCode{0.5} par défaut ;
+
+ \hfill{}à choisir parmi \MontreCode{0 / 0.25 / 0.33 / 0.5 / 0.66 / 0.75 / 1 / 1.25}
+ \item \MontreCode{EpTrait} pour l'épaisseur éventuelle du trait de séparation, et valant \MontreCode{0pt} par défaut.
+\end{itemize}
+
+Le nombre de colonnes, obligatoire, est à donner entre \MontreCode{(...)}.
+
+L'argument optionnel et entre \MontreCode{<...>} est passé à l'environnement \MontreCode{enumitem} ou \MontreCode{itemize} si spécifié.
+
+\subsection{Exemples}
+
+\begin{DemoCode}{}
+%par défaut
+\lipsum[1][1-2]
+
+\begin{MultiCols}(2)
+ \lipsum[2]
+\end{MultiCols}
+
+\lipsum[1][3-4]
+\end{DemoCode}
+
+\begin{DemoCode}{}
+%espacement réduit + filet
+\lipsum[1][1-2]
+
+\begin{MultiCols}[CoeffEspVert=0.25,EpTrait=1pt](3)
+ \lipsum[2]
+\end{MultiCols}
+
+\lipsum[1][3-4]
+\end{DemoCode}
+
+\begin{DemoCode}{}
+%type enumitem
+\begin{enumerate}
+ \item \lipsum[1][1-2]
+ \begin{MultiCols}[Type=enum](4)
+ \item bla
+ \item bla
+ \item bla
+ \item bla
+ \end{MultiCols}
+ \item \lipsum[1][3-4]
+ \begin{MultiCols}[Type=item](3)<label=$\bullet$>
+ \item bla
+ \item bla
+ \item bla
+ \end{MultiCols}
+\end{enumerate}
+
+\lipsum[3][1]
+\end{DemoCode}
+
+\pagebreak
+
+\section{Énumération avec choix des items, parmi une liste}
+
+\subsection{Principe et fonctionnement}
+
+L'idée est ici de :
+
+\begin{itemize}
+ \item créer une liste d'items qui servira de base pour le(s) choix ;
+ \item afficher la liste avec choix des items, de manière aléatoire ou par items choisis
+\end{itemize}
+
+À noter que l'environnement \MontreCode{MultiCols} du package peut être utilisé comme environnement de listes !
+
+\begin{DemoCode}{listing only}
+\CreerListeItems{liste}{macro}{nomliste}
+\end{DemoCode}
+
+\begin{DemoCode}{listing only}
+\ListeChoixItems[clés]{macro}{nomliste}(numéros)<options enumitem>
+\end{DemoCode}
+
+Les \MontreCode{clés} disponibles sont :
+
+\begin{itemize}
+ \item \MontreCode{Type} pour spécifier le type d'environnement, et valant \MontreCode{enum} par défaut ;
+
+ \hfill{}à choisir parmi \MontreCode{enum} \MontreCode{item} ou \MontreCode{MultiCols/Type/NbCols}
+ \item \MontreCode{Alea} pour forcer un affichage aléatoire, \MontreCode{false} par défaut.
+\end{itemize}
+
+Le deuxième argument, obligatoire et entre \MontreCode{\{...\}} est la macro créée précédemment.
+
+Le troisième argument, obligatoire et entre \MontreCode{\{...\}} est le nom de la liste créée précédemment.
+
+Le quatrième argument, obligatoire et entre \MontreCode{(...)} permet de spécifier :
+
+\begin{itemize}
+ \item le nombre d'items à afficher en mode \MontreCode{Alea=true} ;
+ \item les items à afficher, sous la forme \MontreCode{num1,num2,...}.
+\end{itemize}
+
+Le dernier argument, optionnel et entre \MontreCode{<...>} correspond à des options spécifiques à passer à l'environnement de liste \MontreCode{enumitem} créé.
+
+\medskip
+
+À noter que des contrôles sont effectués lors de l'appel aux macros pour :
+
+\begin{itemize}
+ \item vérifier que la liste n'existe pas déjà (pour la macro de création) ;
+ \item vérifier que la liste existe déjà (pour la macro d'affichage des items).
+\end{itemize}
+\subsection{Exemples}
+
+\begin{DemoCode}{listing only}
+%création de la liste ListeItems, avec la macro \malisteditems
+\CreerListeItems%
+ {Réponse A,Réponse B,Réponse C,Réponse D,Réponse E,Réponse F,Réponse G,Réponse H}%
+ {\malisteditems}{ListeItems}
+\end{DemoCode}
+
+\CreerListeItems{Réponse A,Réponse B,Réponse C,Réponse D,Réponse E,Réponse F,Réponse G,Réponse H}{\malisteditems}{ListeItems}
+
+\begin{DemoCode}{}
+%affichage d'items aléatoires
+\ListeChoixItems[Alea]{\malisteditems}{ListeItems}(5)
+\end{DemoCode}
+
+\begin{DemoCode}{}
+%affichage de certains items
+\ListeChoixItems{\malisteditems}{ListeItems}(1,4,3,8,2)
+\end{DemoCode}
+
+\begin{DemoCode}{listing only}
+%création de la liste ListeItemsB, avec la macro \malisteditemsb
+\CreerListeItems%
+ {{$\int_0^1 x^2 dx$},{$\int_0^1 x^3 dx$},{$\int_0^1 x^4 dx$},...}%
+ {\malisteditemsb}{ListeItemsB}
+\end{DemoCode}
+
+\CreerListeItems{{$\int_0^1 x^2 dx$},{$\int_0^1 x^3 dx$},{$\int_0^1 x^4 dx$},{$\int_0^1 x^5 dx$},{$\int_0^1 x^6 dx$},{$\int_0^1 x^7 dx$},{$\int_0^1 x^8 dx$}}{\malisteditemsb}{ListeItemsB}
+
+\begin{DemoCode}{}
+%affichage d'items aléatoires, via MultiCols
+\ListeChoixItems[Alea,Type={MultiCols/enum/2}]{\malisteditemsb}{ListeItemsB}(4)
+\end{DemoCode}
+
+\begin{DemoCode}{}
+%affichage de certains items
+\ListeChoixItems[Type=item]{\malisteditemsb}{ListeItemsB}(7,2,1,5,3)<label=$\bullet$>
+\end{DemoCode}
+
+\end{document} \ No newline at end of file
diff --git a/macros/latex/contrib/customenvs/tex/customenvs.sty b/macros/latex/contrib/customenvs/tex/customenvs.sty
new file mode 100644
index 0000000000..e444e4e1f0
--- /dev/null
+++ b/macros/latex/contrib/customenvs/tex/customenvs.sty
@@ -0,0 +1,442 @@
+% Author : C. Pierquet
+% licence : Released under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txtf
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{customenvs}[2023/10/22 0.1.0 Custom classic environments]
+
+%====HISTORIQUE
+% v 0.1.0 Version initiale
+
+%====OPTIONS FR ET EN
+\newif\if@enum\@enumtrue%
+\DeclareOption{nonenum}{\@enumfalse}%
+\DeclareOption{noenum}{\@enumfalse}%
+\newif\if@tblr\@tblrtrue%
+\DeclareOption{nontblr}{\@tblrfalse}%
+\DeclareOption{notblr}{\@tblrfalse}%
+\newif\if@multicol\@multicoltrue%
+\DeclareOption{nonmulticol}{\@multicolfalse}%
+\DeclareOption{nomulticol}{\@multicolfalse}%
+\DeclareOption*{}
+\ProcessOptions\relax
+
+%====PACKAGES UTILES À CHARGER
+\if@enum
+ \RequirePackage{enumitem}
+\fi
+\if@tblr
+ \RequirePackage{tabularray}
+\fi
+\if@multicol
+ \RequirePackage{multicol}
+\fi
+\RequirePackage{xintexpr}
+\RequirePackage{randomlist}
+\RequirePackage{simplekv}
+\RequirePackage{xstring}
+\RequirePackage{listofitems}
+
+
+%%----COMMANDES FR
+
+%====DECALER VERTICALEMENT, pas documenté pour le moment...
+\NewDocumentCommand\VCentrer{ O{-0.5} m }{%
+ {\raisebox{#1\depth}{#2\vphantom{azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN0123456789}}}%
+}
+
+%====QCMs
+\defKV[reponsesqcm]{%
+ NbCols=\def\RepQCMNbCol{#1},%
+ PoliceLabels=\def\RepQCMFonte{#1},%
+ EspacesCL=\def\RepQCMOffset{#1},%
+ Labels=\def\RepQCMTypeLabel{#1},%
+ EspaceLabels=\xdef\RepQCMSpace{#1},%
+ Largeur=\def\RepQCMLarg{#1}
+}
+
+\setKVdefault[reponsesqcm]{%
+ EspacesCL={6pt/2pt},%
+ NbCols=4,%
+ Filets=false,%
+ PoliceLabels={\bfseries},%
+ Labels={a.},%
+ EspaceLabels=\kern5pt,%
+ Swap=false,%
+ Largeur=0.99\linewidth
+}
+
+\NewDocumentCommand\QCMFormatteLabel{ m m }{%1=typelabel,%3=caractère
+ \IfSubStr{#1}{a}%
+ {%
+ {\RepQCMFonte\StrSubstitute{#1}{a}{#2}}%
+ }%
+ {}%
+ \IfSubStr{#1}{A}%
+ {%
+ {\RepQCMFonte\StrSubstitute{#1}{A}{#2}}%
+ }%
+ {}%
+ \IfSubStr{#1}{1}%
+ {%
+ {\RepQCMFonte\StrSubstitute{#1}{1}{#2}}%
+ }%
+ {}%
+}
+
+\NewDocumentCommand\ReponsesQCM{ O{} m D<>{} }{%1=nbcol,2=listeréponses
+ \restoreKV[reponsesqcm]%
+ \setKV[reponsesqcm]{#1}%
+ \IfSubStr{\RepQCMOffset}{/}%
+ {\StrCut{\RepQCMOffset}{/}{\RepQCMOffsetCol}{\RepQCMOffsetLgn}}%
+ {\def\RepQCMOffsetCol{\RepQCMOffset}\def\RepQCMOffsetLgn{\RepQCMOffset}}%
+ \setsepchar{§}%
+ \readlist*\QCMListereponses{#2}%
+ \def\QCMNbRep{\QCMListereponseslen}%
+ %les items créés
+ \IfSubStr{\RepQCMTypeLabel}{a}%
+ {%
+ \xdef\RepQCMLabelA{\QCMFormatteLabel{\RepQCMTypeLabel}{a}\RepQCMSpace}%
+ \xdef\RepQCMLabelB{\QCMFormatteLabel{\RepQCMTypeLabel}{b}\RepQCMSpace}%
+ \xdef\RepQCMLabelC{\QCMFormatteLabel{\RepQCMTypeLabel}{c}\RepQCMSpace}%
+ \xdef\RepQCMLabelD{\QCMFormatteLabel{\RepQCMTypeLabel}{d}\RepQCMSpace}%
+ }{}%
+ \IfSubStr{\RepQCMTypeLabel}{A}%
+ {%
+ \xdef\RepQCMLabelA{\QCMFormatteLabel{\RepQCMTypeLabel}{A}\RepQCMSpace}%
+ \xdef\RepQCMLabelB{\QCMFormatteLabel{\RepQCMTypeLabel}{B}\RepQCMSpace}%
+ \xdef\RepQCMLabelC{\QCMFormatteLabel{\RepQCMTypeLabel}{C}\RepQCMSpace}%
+ \xdef\RepQCMLabelD{\QCMFormatteLabel{\RepQCMTypeLabel}{D}\RepQCMSpace}%
+ }{}%
+ \IfSubStr{\RepQCMTypeLabel}{1}%
+ {%
+ \xdef\RepQCMLabelA{\QCMFormatteLabel{\RepQCMTypeLabel}{1}\RepQCMSpace}%
+ \xdef\RepQCMLabelB{\QCMFormatteLabel{\RepQCMTypeLabel}{2}\RepQCMSpace}%
+ \xdef\RepQCMLabelC{\QCMFormatteLabel{\RepQCMTypeLabel}{3}\RepQCMSpace}%
+ \xdef\RepQCMLabelD{\QCMFormatteLabel{\RepQCMTypeLabel}{4}\RepQCMSpace}%
+ }{}%
+ %en fonction du nb de colonnes
+ \IfEq{\QCMNbRep}{2}%2réponses
+ {%
+ \ifboolKV[reponsesqcm]{Filets}%
+ {\begin{tblr}{rowsep=\RepQCMOffsetLgn,colsep=\RepQCMOffsetCol,hlines,vlines,width=\RepQCMLarg,colspec={*{2}{X[b,l]}},#3}}%
+ {\begin{tblr}{rowsep=\RepQCMOffsetLgn,colsep=\RepQCMOffsetCol,width=\RepQCMLarg,colspec={*{2}{X[b,l]}},#3}}%
+ \RepQCMLabelA\QCMListereponses[1] & \RepQCMLabelB\QCMListereponses[2] \\
+ \end{tblr}%
+ }%
+ {}%
+ \IfEq{\QCMNbRep}{3}%3réponses
+ {%
+ \ifboolKV[reponsesqcm]{Filets}%
+ {\begin{tblr}{rowsep=\RepQCMOffsetLgn,colsep=\RepQCMOffsetCol,hlines,vlines,width=\RepQCMLarg,colspec={*{3}{X[b,l]}},#3}}%
+ {\begin{tblr}{rowsep=\RepQCMOffsetLgn,colsep=\RepQCMOffsetCol,width=\RepQCMLarg,colspec={*{3}{X[b,l]}},#3}}%
+ \RepQCMLabelA\QCMListereponses[1] & \RepQCMLabelB\QCMListereponses[2] & \RepQCMLabelC\QCMListereponses[3] \\
+ \end{tblr}%
+ }%
+ {}%
+ \IfEq{\QCMNbRep}{4}%4réponses
+ {%
+ \IfEq{\RepQCMNbCol}{4}%4colonnes
+ {%
+ \ifboolKV[reponsesqcm]{Filets}%
+ {\begin{tblr}{rowsep=\RepQCMOffsetLgn,colsep=\RepQCMOffsetCol,hlines,vlines,width=\RepQCMLarg,colspec={*{4}{X[b,l]}},#3}}%
+ {\begin{tblr}{rowsep=\RepQCMOffsetLgn,colsep=\RepQCMOffsetCol,width=\RepQCMLarg,colspec={*{4}{X[b,l]}},#3}}%
+ \RepQCMLabelA\QCMListereponses[1] & \RepQCMLabelB\QCMListereponses[2] & \RepQCMLabelC\QCMListereponses[3] & \RepQCMLabelD\QCMListereponses[4] \\
+ \end{tblr}%
+ }%
+ {%
+ \ifboolKV[reponsesqcm]{Filets}%
+ {\begin{tblr}{rowsep=\RepQCMOffsetLgn,colsep=\RepQCMOffsetCol,hlines,vlines,width=\RepQCMLarg,colspec={*{2}{X[b,l]}},#3}}%
+ {\begin{tblr}{rowsep=\RepQCMOffsetLgn,colsep=\RepQCMOffsetCol,width=\RepQCMLarg,colspec={*{2}{X[b,l]}},#3}}%
+ \RepQCMLabelA\QCMListereponses[1] & \ifboolKV[reponsesqcm]{Swap}{\RepQCMLabelB\QCMListereponses[2]}{\RepQCMLabelC\QCMListereponses[3]} \\
+ \ifboolKV[reponsesqcm]{Swap}{\RepQCMLabelC\QCMListereponses[3]}{\RepQCMLabelB\QCMListereponses[2]} & \RepQCMLabelD\QCMListereponses[4] \\
+ \end{tblr}%
+ }%
+ }%
+ {}%
+}
+
+%====CENTRAGE
+\newlength{\centeraltbef}%avant
+\newlength{\centeraltbeh}%après
+
+\defKV[myaltcenter]{Avant=\setlength{\centeraltbef}{#1},Apres=\setlength{\centeraltbeh}{#1}}
+\setKVdefault[myaltcenter]{Avant=0.33\baselineskip,Apres=0.33\baselineskip}
+
+\NewDocumentEnvironment{Centrage}{ O{} }%
+ {\restoreKV[myaltcenter]\setKV[myaltcenter]{#1}\par\kern\centeraltbef\centering}%
+ {\par\kern\centeraltbeh}
+
+%====MULTICOLS
+\NewDocumentCommand\CoeffEspaceMulticols{ O{1} }{%
+ \setlength{\multicolsep}{12pt plus 4pt minus 3pt}%
+ \IfStrEq{#1}{1.25}{\setlength{\multicolsep}{15pt plus 5pt minus 3.75pt}}{}% 125% of orig. values
+ \IfStrEq{#1}{0.75}{\setlength{\multicolsep}{9pt plus 3pt minus 2.25pt}}{}% 75% of orig. values
+ \IfStrEq{#1}{0.66}{\setlength{\multicolsep}{8pt plus 2.67pt minus 2pt}}{}% 66% of orig. values
+ \IfStrEq{#1}{0.50}{\setlength{\multicolsep}{6pt plus 2pt minus 1.5pt}}{}% 50% of orig. values
+ \IfStrEq{#1}{0.33}{\setlength{\multicolsep}{4pt plus 1.33pt minus 1pt}}{}% 33% of orig. values
+ \IfStrEq{#1}{0.25}{\setlength{\multicolsep}{3pt plus 1pt minus 0.75pt}}{}% 25% of orig. values
+ \IfStrEq{#1}{0}{\setlength{\multicolsep}{0pt}}{}% 0% of orig. values
+}
+
+\setKVdefault[multicolsperso]{%
+ Type=texte,%
+ CoeffEspVert=0.50,%
+ EpTrait=0pt
+}
+
+\NewDocumentEnvironment{MultiCols}{ O{} r() D<>{} }%
+{%
+ \useKVdefault[multicolsperso]%
+ \setKV[multicolsperso]{#1}%
+ \CoeffEspaceMulticols[\useKV[multicolsperso]{CoeffEspVert}]%
+ \setlength{\columnseprule}{\useKV[multicolsperso]{EpTrait}}%
+ \begin{multicols}{#2}%
+ \IfStrEq{\useKV[multicolsperso]{Type}}{enum}{\begin{enumerate}[#3]}{}%
+ \IfStrEq{\useKV[multicolsperso]{Type}}{item}{\begin{itemize}[#3]}{}%
+}%
+{%
+ \IfStrEq{\useKV[multicolsperso]{Type}}{enum}{\end{enumerate}}{}%
+ \IfStrEq{\useKV[multicolsperso]{Type}}{item}{\end{itemize}}{}%
+ \end{multicols}%
+ \CoeffEspaceMulticols[1]%
+ \setlength{\columnseprule}{0pt}%
+}
+
+%====ITEMCHOICE
+\NewDocumentCommand\CreerListeItems{ m m m }{%1=liste,%2=macro,3=nomliste
+ \@ifIsList{#3}%
+ {La liste \texttt{#3} existe déjà, svp choisir un autre nom.}%
+ {\xdef#2{#1}\NewList{#3}}%
+}
+
+\defKV[itemchoisir]{%
+ Type=\def\ChoixTypeSerie{#1}
+}
+\setKVdefault[itemchoisir]{%
+ Alea=false,%
+ Type=enum
+}
+
+\NewDocumentCommand\ListeChoixItems{ O{} m m r() D<>{} }{%1=options,2=série des items,3=nomsérie,4=liste choix,5=options enum
+ %on teste si la liste considérée existe...
+ \@ifIsList{#3}%
+ {%
+ \restoreKV[itemchoisir]%
+ \setKV[itemchoisir]{#1}%
+ \ClearList{#3}%
+ %création de la liste
+ \ifboolKV[itemchoisir]{Alea}%
+ {%
+ \xintFor* ##1 in {\xintCSVtoList{#2}}\do{\InsertRandomItem{#3}{##1}}
+ }%
+ {%
+ \xintFor* ##1 in {\xintCSVtoList{#2}}\do{\InsertLastItem{#3}{##1}}
+ }%
+ %création de l'environnement
+ \IfStrEq{\ChoixTypeSerie}{enum}%
+ {\begin{enumerate}[#5]}{}%
+ \IfStrEq{\ChoixTypeSerie}{item}%
+ {\begin{itemize}[#5]}{}%
+ \IfSubStr{\ChoixTypeSerie}{MultiCols}%
+ {%
+ \StrBetween[1,2]{\ChoixTypeSerie}{/}{/}[\ChoixTypeMulticols]%
+ \StrBehind[2]{\ChoixTypeSerie}{/}[\NbMulticols]%
+ \begin{MultiCols}[Type=\ChoixTypeMulticols](\NbMulticols)<#5>%
+ }{}%
+ %items choisis
+ \ifboolKV[itemchoisir]{Alea}%
+ {%
+ \xintFor* ##1 in {\xintSeq{0}{\xinteval{#4-1}}}\do{\GetItem{#3}{##1}{ItemChoisi}\item \ItemChoisi}
+ }%
+ {%
+ \xintFor* ##1 in {\xintCSVtoList{#4}}\do{\GetItem{#3}{\xinteval{##1-1}}{ItemChoisi}\item \ItemChoisi}
+ }
+ %fin de l'environnement
+ \IfStrEq{\ChoixTypeSerie}{enum}%
+ {\end{enumerate}}{}
+ \IfStrEq{\ChoixTypeSerie}{item}
+ {\end{itemize}}{}%
+ \IfSubStr{\ChoixTypeSerie}{MultiCols}%
+ {\end{MultiCols}}{}%
+ }%
+ {%
+ La liste \texttt{#3} n'existe pas, veuillez la créer avec la macro \texttt{\textbackslash CreerListeItems}.%
+ }%
+}
+
+%%----COMMANDES EN
+
+%====QCMs
+\defKV[answersmcq]{%
+ NumCols=\def\RepQCMNbCol{#1},%
+ FontLabels=\def\RepQCMFonte{#1},%
+ SpaceCR=\def\RepQCMOffset{#1},%
+ Labels=\def\RepQCMTypeLabel{#1},%
+ SpaceLabels=\xdef\RepQCMSpace{#1},%
+ Width=\def\RepQCMLarg{#1}
+}
+
+\setKVdefault[answersmcq]{%
+ SpaceCR={6pt/2pt},%
+ NumCols=4,%
+ Lines=false,%
+ FontLabels={\bfseries},%
+ Labels={a.},%
+ SpaceLabels=\kern5pt,%
+ Swap=false,%
+ Width=0.99\linewidth
+}
+
+\NewDocumentCommand\MCQFormatLabel{ m m }{%1=typelabel,%3=caractère
+ \IfSubStr{#1}{a}%
+ {%
+ {\RepQCMFonte\StrSubstitute{#1}{a}{#2}}%
+ }%
+ {}%
+ \IfSubStr{#1}{A}%
+ {%
+ {\RepQCMFonte\StrSubstitute{#1}{A}{#2}}%
+ }%
+ {}%
+ \IfSubStr{#1}{1}%
+ {%
+ {\RepQCMFonte\StrSubstitute{#1}{1}{#2}}%
+ }%
+ {}%
+}
+
+\NewDocumentCommand\AnswersMCQ{ O{} m D<>{} }{%1=nbcol,2=listeréponses
+ \restoreKV[answersmcq]%
+ \setKV[answersmcq]{#1}%
+ \IfSubStr{\RepQCMOffset}{/}%
+ {\StrCut{\RepQCMOffset}{/}{\RepQCMOffsetCol}{\RepQCMOffsetLgn}}%
+ {\def\RepQCMOffsetCol{\RepQCMOffset}\def\RepQCMOffsetLgn{\RepQCMOffset}}%
+ \setsepchar{§}%
+ \readlist*\QCMListereponses{#2}%
+ \def\QCMNbRep{\QCMListereponseslen}%
+ %les items créés
+ \IfSubStr{\RepQCMTypeLabel}{a}%
+ {%
+ \xdef\RepQCMLabelA{\MCQFormatLabel{\RepQCMTypeLabel}{a}\RepQCMSpace}%
+ \xdef\RepQCMLabelB{\MCQFormatLabel{\RepQCMTypeLabel}{b}\RepQCMSpace}%
+ \xdef\RepQCMLabelC{\MCQFormatLabel{\RepQCMTypeLabel}{c}\RepQCMSpace}%
+ \xdef\RepQCMLabelD{\MCQFormatLabel{\RepQCMTypeLabel}{d}\RepQCMSpace}%
+ }{}%
+ \IfSubStr{\RepQCMTypeLabel}{A}%
+ {%
+ \xdef\RepQCMLabelA{\MCQFormatLabel{\RepQCMTypeLabel}{A}\RepQCMSpace}%
+ \xdef\RepQCMLabelB{\MCQFormatLabel{\RepQCMTypeLabel}{B}\RepQCMSpace}%
+ \xdef\RepQCMLabelC{\MCQFormatLabel{\RepQCMTypeLabel}{C}\RepQCMSpace}%
+ \xdef\RepQCMLabelD{\MCQFormatLabel{\RepQCMTypeLabel}{D}\RepQCMSpace}%
+ }{}%
+ \IfSubStr{\RepQCMTypeLabel}{1}%
+ {%
+ \xdef\RepQCMLabelA{\MCQFormatLabel{\RepQCMTypeLabel}{1}\RepQCMSpace}%
+ \xdef\RepQCMLabelB{\MCQFormatLabel{\RepQCMTypeLabel}{2}\RepQCMSpace}%
+ \xdef\RepQCMLabelC{\MCQFormatLabel{\RepQCMTypeLabel}{3}\RepQCMSpace}%
+ \xdef\RepQCMLabelD{\MCQFormatLabel{\RepQCMTypeLabel}{4}\RepQCMSpace}%
+ }{}%
+ %en fonction du nb de colonnes
+ \IfEq{\QCMNbRep}{2}%2réponses
+ {%
+ \ifboolKV[answersmcq]{Lines}%
+ {\begin{tblr}{rowsep=\RepQCMOffsetLgn,colsep=\RepQCMOffsetCol,hlines,vlines,width=\RepQCMLarg,colspec={*{2}{X[b,l]}},#3}}%
+ {\begin{tblr}{rowsep=\RepQCMOffsetLgn,colsep=\RepQCMOffsetCol,width=\RepQCMLarg,colspec={*{2}{X[b,l]}},#3}}%
+ \RepQCMLabelA\QCMListereponses[1] & \RepQCMLabelB\QCMListereponses[2] \\
+ \end{tblr}%
+ }%
+ {}%
+ \IfEq{\QCMNbRep}{3}%3réponses
+ {%
+ \ifboolKV[answersmcq]{Lines}%
+ {\begin{tblr}{rowsep=\RepQCMOffsetLgn,colsep=\RepQCMOffsetCol,hlines,vlines,width=\RepQCMLarg,colspec={*{3}{X[b,l]}},#3}}%
+ {\begin{tblr}{rowsep=\RepQCMOffsetLgn,colsep=\RepQCMOffsetCol,width=\RepQCMLarg,colspec={*{3}{X[b,l]}},#3}}%
+ \RepQCMLabelA\QCMListereponses[1] & \RepQCMLabelB\QCMListereponses[2] & \RepQCMLabelC\QCMListereponses[3] \\
+ \end{tblr}%
+ }%
+ {}%
+ \IfEq{\QCMNbRep}{4}%4réponses
+ {%
+ \IfEq{\RepQCMNbCol}{4}%4colonnes
+ {%
+ \ifboolKV[answersmcq]{Lines}%
+ {\begin{tblr}{rowsep=\RepQCMOffsetLgn,colsep=\RepQCMOffsetCol,hlines,vlines,width=\RepQCMLarg,colspec={*{4}{X[b,l]}},#3}}%
+ {\begin{tblr}{rowsep=\RepQCMOffsetLgn,colsep=\RepQCMOffsetCol,width=\RepQCMLarg,colspec={*{4}{X[b,l]}},#3}}%
+ \RepQCMLabelA\QCMListereponses[1] & \RepQCMLabelB\QCMListereponses[2] & \RepQCMLabelC\QCMListereponses[3] & \RepQCMLabelD\QCMListereponses[4] \\
+ \end{tblr}%
+ }%
+ {%
+ \ifboolKV[answersmcq]{Lines}%
+ {\begin{tblr}{rowsep=\RepQCMOffsetLgn,colsep=\RepQCMOffsetCol,hlines,vlines,width=\RepQCMLarg,colspec={*{2}{X[b,l]}},#3}}%
+ {\begin{tblr}{rowsep=\RepQCMOffsetLgn,colsep=\RepQCMOffsetCol,width=\RepQCMLarg,colspec={*{2}{X[b,l]}},#3}}%
+ \RepQCMLabelA\QCMListereponses[1] & \ifboolKV[answersmcq]{Swap}{\RepQCMLabelB\QCMListereponses[2]}{\RepQCMLabelC\QCMListereponses[3]} \\
+ \ifboolKV[answersmcq]{Swap}{\RepQCMLabelC\QCMListereponses[3]}{\RepQCMLabelB\QCMListereponses[2]} & \RepQCMLabelD\QCMListereponses[4] \\
+ \end{tblr}%
+ }%
+ }%
+ {}%
+}
+
+%====ITEMCHOICE
+\NewDocumentCommand\CreateItemsList{ m m m }{%1=liste,%2=macro,3=nomliste
+ \@ifIsList{#3}%
+ {The list \texttt{#3} already exists, pick an other name.}%
+ {\xdef#2{#1}\NewList{#3}}%
+}
+
+\defKV[itemchoice]{%
+ Type=\def\ChoixTypeSerie{#1}
+}
+\setKVdefault[itemchoice]{%
+ Random=false,%
+ Type=enum
+}
+
+\NewDocumentCommand\ListItemsChoice{ O{} m m r() D<>{} }{%1=options,2=série des items,3=nomsérie,4=liste choix,5=options enum
+ %on teste si la liste considérée existe...
+ \@ifIsList{#3}%
+ {%
+ \restoreKV[itemchoice]%
+ \setKV[itemchoice]{#1}%
+ \ClearList{#3}%
+ %création de la liste
+ \ifboolKV[itemchoice]{Random}%
+ {%
+ \xintFor* ##1 in {\xintCSVtoList{#2}}\do{\InsertRandomItem{#3}{##1}}
+ }%
+ {%
+ \xintFor* ##1 in {\xintCSVtoList{#2}}\do{\InsertLastItem{#3}{##1}}
+ }%
+ %création de l'environnement
+ \IfStrEq{\ChoixTypeSerie}{enum}%
+ {\begin{enumerate}[#5]}{}%
+ \IfStrEq{\ChoixTypeSerie}{item}%
+ {\begin{itemize}[#5]}{}%
+ \IfSubStr{\ChoixTypeSerie}{MultiCols}%
+ {%
+ \StrBetween[1,2]{\ChoixTypeSerie}{/}{/}[\ChoixTypeMulticols]%
+ \StrBehind[2]{\ChoixTypeSerie}{/}[\NbMulticols]%
+ \begin{MultiCols}[Type=\ChoixTypeMulticols](\NbMulticols)<#5>%
+ }{}%
+ %items choisis
+ \ifboolKV[itemchoice]{Random}%
+ {%
+ \xintFor* ##1 in {\xintSeq{0}{\xinteval{#4-1}}}\do{\GetItem{#3}{##1}{ItemChoisi}\item \ItemChoisi}
+ }%
+ {%
+ \xintFor* ##1 in {\xintCSVtoList{#4}}\do{\GetItem{#3}{\xinteval{##1-1}}{ItemChoisi}\item \ItemChoisi}
+ }
+ %fin de l'environnement
+ \IfStrEq{\ChoixTypeSerie}{enum}%
+ {\end{enumerate}}{}
+ \IfStrEq{\ChoixTypeSerie}{item}
+ {\end{itemize}}{}%
+ \IfSubStr{\ChoixTypeSerie}{MultiCols}%
+ {\end{MultiCols}}{}%
+ }%
+ {%
+ The list \texttt{#3} doesn't exist, please use \texttt{\textbackslash CreerListeItems} to create it.%
+ }%
+}
+
+\endinput \ No newline at end of file