texlive[68620] Master: customenvs (22oct23)

commits+karl at tug.org commits+karl at tug.org
Sun Oct 22 22:07:46 CEST 2023


Revision: 68620
          https://tug.org/svn/texlive?view=revision&revision=68620
Author:   karl
Date:     2023-10-22 22:07:46 +0200 (Sun, 22 Oct 2023)
Log Message:
-----------
customenvs (22oct23)

Modified Paths:
--------------
    trunk/Master/tlpkg/bin/tlpkg-ctan-check
    trunk/Master/tlpkg/libexec/ctan2tds
    trunk/Master/tlpkg/tlpsrc/collection-latexextra.tlpsrc

Added Paths:
-----------
    trunk/Master/texmf-dist/doc/latex/customenvs/
    trunk/Master/texmf-dist/doc/latex/customenvs/README.md
    trunk/Master/texmf-dist/doc/latex/customenvs/customenvs-doc-en.pdf
    trunk/Master/texmf-dist/doc/latex/customenvs/customenvs-doc-en.tex
    trunk/Master/texmf-dist/doc/latex/customenvs/customenvs-doc-fr.pdf
    trunk/Master/texmf-dist/doc/latex/customenvs/customenvs-doc-fr.tex
    trunk/Master/texmf-dist/tex/latex/customenvs/
    trunk/Master/texmf-dist/tex/latex/customenvs/customenvs.sty
    trunk/Master/tlpkg/tlpsrc/customenvs.tlpsrc

Added: trunk/Master/texmf-dist/doc/latex/customenvs/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/customenvs/README.md	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/customenvs/README.md	2023-10-22 20:07:46 UTC (rev 68620)
@@ -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 at 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


Property changes on: trunk/Master/texmf-dist/doc/latex/customenvs/README.md
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/customenvs/customenvs-doc-en.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/customenvs/customenvs-doc-en.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/customenvs/customenvs-doc-en.pdf	2023-10-22 20:06:30 UTC (rev 68619)
+++ trunk/Master/texmf-dist/doc/latex/customenvs/customenvs-doc-en.pdf	2023-10-22 20:07:46 UTC (rev 68620)

Property changes on: trunk/Master/texmf-dist/doc/latex/customenvs/customenvs-doc-en.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/customenvs/customenvs-doc-en.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/customenvs/customenvs-doc-en.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/customenvs/customenvs-doc-en.tex	2023-10-22 20:07:46 UTC (rev 68620)
@@ -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


Property changes on: trunk/Master/texmf-dist/doc/latex/customenvs/customenvs-doc-en.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/customenvs/customenvs-doc-fr.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/customenvs/customenvs-doc-fr.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/customenvs/customenvs-doc-fr.pdf	2023-10-22 20:06:30 UTC (rev 68619)
+++ trunk/Master/texmf-dist/doc/latex/customenvs/customenvs-doc-fr.pdf	2023-10-22 20:07:46 UTC (rev 68620)

Property changes on: trunk/Master/texmf-dist/doc/latex/customenvs/customenvs-doc-fr.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/customenvs/customenvs-doc-fr.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/customenvs/customenvs-doc-fr.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/customenvs/customenvs-doc-fr.tex	2023-10-22 20:07:46 UTC (rev 68620)
@@ -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


Property changes on: trunk/Master/texmf-dist/doc/latex/customenvs/customenvs-doc-fr.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/customenvs/customenvs.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/customenvs/customenvs.sty	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/customenvs/customenvs.sty	2023-10-22 20:07:46 UTC (rev 68620)
@@ -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 at enum\@enumtrue%
+\DeclareOption{nonenum}{\@enumfalse}%
+\DeclareOption{noenum}{\@enumfalse}%
+\newif\if at tblr\@tblrtrue%
+\DeclareOption{nontblr}{\@tblrfalse}%
+\DeclareOption{notblr}{\@tblrfalse}%
+\newif\if at multicol\@multicoltrue%
+\DeclareOption{nonmulticol}{\@multicolfalse}%
+\DeclareOption{nomulticol}{\@multicolfalse}%
+\DeclareOption*{}
+\ProcessOptions\relax
+
+%====PACKAGES UTILES À CHARGER
+\if at enum
+	\RequirePackage{enumitem}
+\fi
+\if at tblr
+	\RequirePackage{tabularray}
+\fi
+\if at 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


Property changes on: trunk/Master/texmf-dist/tex/latex/customenvs/customenvs.sty
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/tlpkg/bin/tlpkg-ctan-check
===================================================================
--- trunk/Master/tlpkg/bin/tlpkg-ctan-check	2023-10-22 20:06:30 UTC (rev 68619)
+++ trunk/Master/tlpkg/bin/tlpkg-ctan-check	2023-10-22 20:07:46 UTC (rev 68620)
@@ -238,7 +238,7 @@
     ctable ctablestack ctex ctex-faq
     culmus cuprum cursolatex cuisine
     currency currfile curriculum-vitae currvita curve curve2e curves
-    custom-bib customdice cutwin cv cv4tw cvss cweb-latex
+    custom-bib customdice customenvs cutwin cv cv4tw cvss cweb-latex
     cyber cybercic cyklop cyrillic cyrplain
   dad dancers dantelogo darkmode
     dashbox dashrule dashundergaps dataref datax datatool

Modified: trunk/Master/tlpkg/libexec/ctan2tds
===================================================================
--- trunk/Master/tlpkg/libexec/ctan2tds	2023-10-22 20:06:30 UTC (rev 68619)
+++ trunk/Master/tlpkg/libexec/ctan2tds	2023-10-22 20:07:46 UTC (rev 68620)
@@ -1714,6 +1714,7 @@
  'csplain'		=> '&POST_cstexpkgs',
  'cstex'		=> '&POSTcstex',
  'culmus'		=> '&POSTculmus',
+ 'customenvs'		=> '&POST_onelevel',
  'dehyph-exptl'		=> '&POSTdehyph_exptl',
  'digestif'		=> '&POSTdigestif',
  'doipubmed'		=> '&POSTlatex2html',

Modified: trunk/Master/tlpkg/tlpsrc/collection-latexextra.tlpsrc
===================================================================
--- trunk/Master/tlpkg/tlpsrc/collection-latexextra.tlpsrc	2023-10-22 20:06:30 UTC (rev 68619)
+++ trunk/Master/tlpkg/tlpsrc/collection-latexextra.tlpsrc	2023-10-22 20:07:46 UTC (rev 68620)
@@ -284,6 +284,7 @@
 depend currfile
 depend curriculum-vitae
 depend currvita
+depend customenvs
 depend cutwin
 depend cv
 depend cv4tw

Added: trunk/Master/tlpkg/tlpsrc/customenvs.tlpsrc
===================================================================


More information about the tex-live-commits mailing list.