diff options
Diffstat (limited to 'macros/latex/contrib/customenvs')
-rw-r--r-- | macros/latex/contrib/customenvs/README.md | 7 | ||||
-rw-r--r-- | macros/latex/contrib/customenvs/doc/customenvs-doc-en.pdf | bin | 0 -> 95687 bytes | |||
-rw-r--r-- | macros/latex/contrib/customenvs/doc/customenvs-doc-en.tex | 341 | ||||
-rw-r--r-- | macros/latex/contrib/customenvs/doc/customenvs-doc-fr.pdf | bin | 0 -> 203410 bytes | |||
-rw-r--r-- | macros/latex/contrib/customenvs/doc/customenvs-doc-fr.tex | 559 | ||||
-rw-r--r-- | macros/latex/contrib/customenvs/tex/customenvs.sty | 442 |
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 Binary files differnew file mode 100644 index 0000000000..49dd9c958e --- /dev/null +++ b/macros/latex/contrib/customenvs/doc/customenvs-doc-en.pdf 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 Binary files differnew file mode 100644 index 0000000000..8729772ec0 --- /dev/null +++ b/macros/latex/contrib/customenvs/doc/customenvs-doc-fr.pdf 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 |