summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2017-05-17 21:54:24 +0000
committerKarl Berry <karl@freefriends.org>2017-05-17 21:54:24 +0000
commit53fd5f4c53a010d8797af79d9c2ccf3c98b770a0 (patch)
tree56cba245d4cdc59cfd3d07e1e26efec5d1cf7809
parentbd3e372ccf55a9c43dee1a91cc11659ff3f09fde (diff)
scratch (17may17)
git-svn-id: svn://tug.org/texlive/trunk@44395 c570f23f-e606-0410-a88d-b1316a301751
-rw-r--r--Master/texmf-dist/doc/latex/scratch/README21
-rw-r--r--Master/texmf-dist/doc/latex/scratch/scratch-fr.pdfbin0 -> 437664 bytes
-rw-r--r--Master/texmf-dist/doc/latex/scratch/scratch-fr.tex407
-rw-r--r--Master/texmf-dist/tex/latex/scratch/scratch.sty484
-rwxr-xr-xMaster/tlpkg/bin/tlpkg-ctan-check2
-rw-r--r--Master/tlpkg/tlpsrc/collection-pictures.tlpsrc1
-rw-r--r--Master/tlpkg/tlpsrc/scratch.tlpsrc0
7 files changed, 914 insertions, 1 deletions
diff --git a/Master/texmf-dist/doc/latex/scratch/README b/Master/texmf-dist/doc/latex/scratch/README
new file mode 100644
index 00000000000..84750c8f107
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/scratch/README
@@ -0,0 +1,21 @@
+___________________________________
+
+ L'extension
+ scratch
+
+ v0.1
+
+ 16 mai 2017
+___________________________________
+
+Authors : Christian Tellechea
+Maintainer: Christian Tellechea
+E-mail : unbonpetit@openmailbox.org (CT)
+ Commentaires, signalements de bugs et
+ suggestions bienvenus
+Licence : Released under the LaTeX Project Public License v1.3c or
+ later, see http://www.latex-project.org/lppl.txt
+
+----------------------------------------------------------------------
+
+Draw programs like scratch (https://scratch.mit.edu/)
diff --git a/Master/texmf-dist/doc/latex/scratch/scratch-fr.pdf b/Master/texmf-dist/doc/latex/scratch/scratch-fr.pdf
new file mode 100644
index 00000000000..e3140e7512c
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/scratch/scratch-fr.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/scratch/scratch-fr.tex b/Master/texmf-dist/doc/latex/scratch/scratch-fr.tex
new file mode 100644
index 00000000000..c8f4039aedf
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/scratch/scratch-fr.tex
@@ -0,0 +1,407 @@
+% !TeX encoding = ISO-8859-1
+% Ceci est la documentation du package "scratch"
+%
+% Fichier compilé avec pdflatex
+\documentclass[frenchb,a4paper,10pt]{article}
+\usepackage[latin1]{inputenc}
+\usepackage[T1]{fontenc}
+\usepackage[margin=2cm]{geometry}
+\usepackage[bottom]{footmisc}
+\usepackage{libertine,boites,tikz,enumitem,MnSymbol,babel,xspace,listings,scratch}
+\usepackage[scaled=0.8]{luximono}
+\frenchbsetup{og=«,fg=»}
+\def\SCRATCH{\texttt{scratch}\xspace}
+\makeatletter
+\def\code{\expandafter\code@i\string}
+\def\code@i#1{%
+ \begingroup
+ \par\nobreak\medskip\parindent0pt
+ \leftskip.1\linewidth
+ \catcode`\^^I 13 \begingroup\lccode`\~`\^^I \lowercase{\endgroup\def~{\leavevmode\space\space\space\space}}%
+ \let\do\@makeother \dospecials
+ \ttfamily\small\@noligs
+ \make@car@active\<{$\langle$\begingroup\itshape}%
+ \make@car@active\>{\endgroup$\rangle$}%
+ \obeylines\obeyspaces
+ \def\code@ii##1#1{##1\par\medbreak\endgroup}%
+ \code@ii
+}
+\long\def\grab@toks#1\relax{\gdef\right@content{#1}}
+
+\newcommand\disable@lig[1]{%
+ \catcode`#1\active
+ \begingroup
+ \lccode`\~`#1\relax
+ \lowercase{\endgroup\def~{\leavevmode\kern\z@\string#1}}%
+}
+
+\newcommand\make@car@active[1]{%
+ \catcode`#1\active
+ \begingroup
+ \lccode`\~`#1\relax
+ \lowercase{\endgroup\def~}%
+}
+
+\newcommand\exemple{%
+ \begingroup
+ \parskip\z@
+ \exemple@}
+
+\newcommand\exemple@{%
+ \medbreak\noindent
+ \begingroup
+ \let\do\@makeother\dospecials
+ \make@car@active\ { {}}%
+ \make@car@active\^^M{\par\leavevmode}%
+ \make@car@active\^^I{\space\space}%
+ \make@car@active\,{\leavevmode\kern\z@\string,}%
+ \make@car@active\-{\leavevmode\kern\z@\string-}%
+ \make@car@active\>{\leavevmode\kern\z@\string>}%
+ \make@car@active\<{\leavevmode\kern\z@\string<}%
+ \@makeother\;\@makeother\!\@makeother\?\@makeother\:% neutralise frenchb
+ \exemple@@
+}
+
+\newcommand\exemple@@[1]{%
+ \def\@tempa##1#1{\exemple@@@{##1}}%
+ \@tempa
+}
+
+\newcommand\exemple@@@[1]{%
+ \xdef\the@code{#1}%
+ \endgroup
+ \begingroup
+ \fboxrule0.4pt \fboxsep=5pt
+ \let\breakboxparindent\z@
+ \def\bkvz@top{\hrule\@height\fboxrule}%
+ \def\bkvz@bottom{\hrule\@height\fboxrule}%
+ \let\bkvz@before@breakbox\relax
+ \def\bkvz@set@linewidth{\advance\linewidth\dimexpr-2\fboxrule-2\fboxsep\relax}%
+ \def\bkvz@left{\vrule\@width\fboxrule\kern\fboxsep}%
+ \def\bkvz@right{\kern\fboxsep\vrule\@width\fboxrule}%
+ \breakbox
+ \kern.5ex\relax
+ \begingroup
+ \ttfamily\small\the@code\par
+ \endgroup
+ \kern3pt
+ \hrule height0.1pt width\linewidth depth0.1pt
+ \vskip5pt
+ \newlinechar`\^^M\everyeof{\noexpand}\scantokens{#1}\par
+ \endbreakbox
+ \endgroup
+ \medbreak
+ \endgroup
+}
+\begingroup
+ \catcode`\<13 \catcode`\>13
+ \gdef\verb{\relax\ifmmode\hbox\else\leavevmode\null\fi
+ \bgroup
+ \verb@eol@error \let\do\@makeother \dospecials
+ \verbatim@font\@noligs
+ \catcode`\<13 \catcode`\>13 \def<{\begingroup$\langle$\itshape}\def>{\/$\rangle$\endgroup}%
+ \@ifstar\@sverb\@verb}
+\endgroup
+\def\longfrscrdate@i#1/#2/#3\@nil{\number#3\relax\space \ifcase#2 \or janvier\or février\or mars\or avril\or mai\or juin\or juillet\or aout\or septembre\or octobre\or novembre\or décembre\fi\space#1}
+\edef\longfrscrdate{\expandafter\longfrscrdate@i\scrdate\@nil}
+\makeatother
+\begingroup
+ \catcode`\_11
+ \gdef\cleval#1#2{%
+ \bigbreak\noindent
+ \hbox to .25\linewidth{%
+ \color{teal}\bfseries\ttfamily
+ \detokenize{#1}=$\langle$\detokenize{#2}$\rangle$\hss}\kern2.5em
+ (\textit{Défaut} : {\color{teal}\ttfamily
+ \hlst_eearg\hlst_ifempty{\useKV[scratch]{#1}}
+ {\detokenize{{}}}
+ {\detokenize\expandafter\expandafter\expandafter{\useKV[scratch]{#1}}}})%
+ \par\nobreak
+ }
+\endgroup
+\def\suffixe#1{\begingroup\sffamily\bfseries\color{scr#1}#1\endgroup}
+\begin{document}
+\parindent=0pt
+\thispagestyle{empty}
+\begin{titlepage}
+ \begingroup
+ \centering
+ \null\vskip.25\vsize
+ {\large\bfseries L'extension pour \LaTeX\par \Huge \scrname\par}
+ \bigbreak
+ v \scrver
+ \smallbreak
+ \longfrscrdate
+ \vskip1.5cm
+ Christian \bsc{Tellechea}\footnote{\texttt{unbonpetit@openmailbox.org}}\par
+ \endgroup
+ \vskip2cm
+ \leftskip=.2\linewidth \rightskip=.2\linewidth \small
+ Cette extension permet de dessiner des empilements de blocs similaires à ceux que l'on trouve dans le logiciel de programmation \emph{visuelle} « \SCRATCH\footnote{Le logiciel que l'on peut utiliser en ligne à \texttt{https://scratch.mit.edu/}} ».
+\end{titlepage}
+\parindent1.5em
+\section{L'environnement \SCRATCH}
+Pour dessiner un programme comme le fait \SCRATCH, il faut ouvrir un environnement «\SCRATCH» et écrire dans cet environnement les macros correspondant aux \emph{blocs} que l'on veut y mettre :
+
+\code|\begin{scratch}
+ macros pour dessiner des blocs
+\end{scratch}|
+
+Comme le savent ceux qui enseignent l'algorithmique et la programmation avec le très-à-la-mode logiciel « \SCRATCH », les programmes sont construits avec des briques, appelés «blocs», qui peuvent s'emboiter les uns sur les autres. Ces blocs sont de plusieurs couleurs, chacune correspondant à un type d'instruction que l'on retrouve dans les menus de \SCRATCH.
+
+J'ai pris le parti d'écrire des macros ayant comme argument le texte qui figure dans le bloc. Ce faisant, on a plus de liberté que dans \SCRATCH où les blocs ont des textes prédéfinis, mais cette liberté permet d'utiliser cette extension quelle que soit la langue dans laquelle on écrit.
+
+Enfin, j'ai cherché le bon compromis entre complexité du code et qualité des dessins obtenus avec cette extension: ils \emph{ressemblent} à ceux du logiciel \SCRATCH, mais le but de cette extension n'est \emph{pas} la ressemblance absolue au pixel près!
+
+\section{Les blocs normaux}
+Ces blocs sont les plus courants et possèdent une encoche d'emboitement, femelle en haut et mâle en bas. Les macros permettant de dessiner ces blocs ont des noms de la forme \verb|\block<suffixe>| et ont un seul argument obligatoire qui est le texte que l'on souhaite mettre dans le bloc. Par exemple, un bloc bleu (correspondant au menu «mouvement») a un suffixe \suffixe{move}, et est dessiné grâce à la macro \verb|\blocmove{<texte>}|. Ainsi, dans l'environnement \SCRATCH, écrire \verb|\blockmove{Bonjour le monde}| donne
+\begin{center}\begin{scratch}\blockmove{Bonjour le monde}\end{scratch}\end{center}
+
+La police d'écriture dans chaque bloc est la police « \textsf{sans serif} » en gras qui est définie dans le document au moment où l'environnement est appelé : pratiquement, cela signifie que les macros \verb|\sffamily| et \verb|\bfseries| sont exécutées avant que le texte des blocs ne soit composé. Dans cette documentation, la police sans serif est «\textsf{biolinum}».
+
+La plupart des dimensions des blocs sont proportionnelles à la taille de la police en cours. On peut donc jouer sur la taille de la police (via les classiques macros \verb|\small|, \verb|\large|, \verb|\footnotesize|, etc) pour modifier la taille des blocs.
+
+Voici un inventaire des tous les blocs disponibles, empilés les uns sous les autres :
+
+\exemple/Voici un algorithme bizarre : \begin{scratch}
+ \blockmove{bloc de mouvement}
+ \blocklook{bloc d'apparence}
+ \blocksound{bloc de son}
+ \blockpen{bloc de stylo}
+ \blockvariable{bloc de variable}
+ \blocklist{bloc de liste}
+ \blockevent{bloc d'événement}
+ \blockcontrol{bloc de contrôle}
+ \blocksensing{bloc de capteur}
+\end{scratch}/
+
+Il faut donc retenir cette logique : les suffixes \suffixe{move}, \suffixe{look}, \suffixe{sound}, \suffixe{pen}, \suffixe{variable}, \suffixe{list}, \suffixe{event}, \suffixe{control} et \suffixe{sensing} correspondent aux couleurs des blocs. Il existe aussi le suffixe \suffixe{operator} qui n'a pas été montré précédemment puisqu'aucun bloc n'existe pour la fonction «opérateurs».
+
+\section{Les ovales}
+Les « ovales » sont, selon le code graphique de \SCRATCH, censés contenir des nombres. Lorsque ces nombres sont explicitement écrits en chiffres, ces ovales ont un fond blanc : \begin{center}\begin{scratch}\blockmove{ajouter \ovalnum{10} à x}\end{scratch}\end{center}
+Les valeurs numériques sont parfois issues de valeurs prédéfinies auquel cas, une flèche de sélection doit apparaitre après le nombre prédéfini choisi : \begin{center}\begin{scratch}\blockmove{s'orienter à \ovalnum{180\selectarrownum}}\end{scratch}\end{center}
+
+Au niveau des macros utilisées dans l'exemple plus bas :
+\begin{itemize}
+ \item la macro \verb|\ovalnum{<nombre>}| dessine un nombre dans un ovale à fond blanc;
+ \item la macro \verb|\selectarrownum| trace la flèche de sélection;
+ \item les macros \verb|\turnleft| et \verb|\turnright| dessinent des flèches de rotation dans les blocs \verb|\blockmove|.
+\end{itemize}
+
+\exemple/Ovales sur fond blanc : \begin{scratch}
+ \blockmove{ajouter \ovalnum{10} à x}
+ \blockmove{s'orienter à \ovalnum{180\selectarrownum}}
+ \blockmove{tourner de \turnleft{} de \ovalnum{45} degrés}
+ \blockcontrol{attendre \ovalnum{1} seconde}
+ \blockpen{mettre l'intensité du stylo à \ovalnum{50}}
+\end{scratch}/
+
+Lorsque les \verb|<nombres>| sont contenus dans des variables, les ovales prennent alors la couleur de la fonction correspondant à ces variables. Les macros ont des noms de la forme \verb|\oval<suffixe>| et ont pour suffixe \suffixe{move}, \suffixe{look}, \suffixe{sound}, \suffixe{variable}, \suffixe{list}, \suffixe{sensing} et \suffixe{operator}.
+
+Voici quelques exemples :
+\exemple/Ovales divers : \begin{scratch}
+ \blockmove{s'orienter à \ovalmove{direction}}
+ \blocksound{ajouter \ovaloperator{\ovalnum{-0.5} * \ovalsound{volume}} au volume}
+ \blockmove{glisser en \ovalsound{tempo} secondes à x: \ovalsensing{souris x}
+ y: \ovaloperator{\ovalnum{4} * \ovalsensing{souris y}}}
+\end{scratch}
+
+Toutes les macros ayant pour préfixe \verb|\oval| sont utilisables \emph{en dehors} de l'environnement \texttt{scratch}, la preuve : voici \ovalvariable{une variable} et \ovaloperator{un opérateur}./
+
+\section{Les blocs de début}
+Ces blocs sont de la couleur \suffixe{event} pour la plupart (macro \verb|\blockinit|), mais il existe aussi un bloc de début de couleur \suffixe{control} (macro \verb|\blockinitclone|). Le drapeau vert est dessiné avec la macro \verb|\greenflag|.
+
+\exemple/Voici un début :
+\begin{scratch}
+ \blockinit{quand \greenflag est cliqué}
+ \blockmove{suite de l'algorithme...}
+\end{scratch}
+et un autre :
+\begin{scratch}
+ \blockinitclone{quand je commence comme un clone}
+ \blocklook{enfiler le costume de clown !}
+\end{scratch}/
+
+\section{Les rectangles}
+Du texte spécifié par l'utilisateur se trouve dans un rectangle sur fond blanc, en graisse normale et en couleur noir. La macro \verb|\txtbox{<du texte>}| permet, dans l'environnement \SCRATCH d'insérer ces rectangles « de texte »:
+
+\exemple/\begin{scratch}
+ \blocklook{dire \txtbox{Hello} pendant \ovalnum{2} secondes}
+ \blocksensing{demander \txtbox{Quel est votre nom ?} et attendre}
+\end{scratch}/
+
+Un menu déroulant ayant des valeurs prédéfinies est également symbolisé par un rectangle dont la couleur reprend la fonction du bloc qui le contient. Pour ce faire, la macro \verb|\selectmenu{<texte>}| doit être exécutée :
+
+\exemple/\begin{scratch}
+ \blockinit{Quand je reçois \selectmenu{message 1}}
+ \blockcontrol{créer un clone de \selectmenu{moi même}}
+ \blockmove{aller à \selectmenu{pointeur de souris}}
+ \blocklook{ajouter à l'effet \selectmenu{couleur} \ovalnum{25}}
+\end{scratch}/
+
+Un carré rempli de couleur et accessible avec la macro \verb|\squarecolor{<couleur>}| achève cet inventaire sur les rectangles :
+
+\exemple/\begin{scratch}
+ \blockpen{stylo en position d'écriture}
+ \blockpen{mettre la couleur du style à \squarecolor{red!75!black}}
+ \blockmove{avancer de \ovalnum{25}}
+\end{scratch}/
+
+\section{Les losanges et les blocs de test}
+Dans la symbolique graphique de \SCRATCH, les losanges contiennent des valeurs booléennes ayant vocation à se retrouver dans un bloc de test. Pour dessiner de tels objets booléens, les macros \verb|\bool<suffixe>{<texte>}| sont utilisées où les \verb|<suffixes>| représentent les couleurs correspondant à la fonction du booléen tracé : \suffixe{list}, \suffixe{sensing} ou \suffixe{operator}.
+
+Les blocs de test sont de deux types,selon qu'ils possèdent ou pas une branche « else».
+\code|\blocif{<texte du test>}
+ {<instructions si test vrai>}|
+et
+\code|\blocifelse{<texte du test>}
+ {<instructions si test vrai>}
+ {<instructions si test faux>}|
+
+
+\exemple/Conditions :\begin{scratch}
+ \blockif{si \booloperator{\ovalmove{abscisse x} < \txtbox{7}} alors}
+ {\blockmove{aller à \selectmenu{position aléatoire}}
+ \blocklook{basculer sur costume \selectmenu{costume 4}}
+ }
+ \blockmove{aller à \selectmenu{pointeur souris}}
+\end{scratch}
+et
+\begin{scratch}
+ \blockifelse{si \boolsensing{couleur \squarecolor{blue!65} touchée ?} alors}
+ {\blockmove{avancer de \ovalnum{2}}
+ \blocksound{jouer le son \selectmenu{miaou}}
+ }
+ {\blockvariable{mettre \ovalvariable{total} à \ovaloperator{\ovalvariable{total} + \ovalnum{1}}}
+ \blocksound{arrêter tous les sons}
+ }
+ \blockmove{aller à \selectmenu{pointeur souris}}
+\end{scratch}/
+
+Les macros \verb|\squarecolor| et celles de la forme \verb|\bool<suffixe>| sont utilisables \emph{en dehors} d'un environnement \SCRATCH :
+
+\exemple/Une couleur : \squarecolor{cyan}.\par
+Un booléen : \boollist{liste \selectmenu{malist} contient \txtbox{foobar}}.\par
+Un autre : \booloperator{\booloperator{\ovalvariable{varx} > \txtbox{1}}
+et \booloperator{\ovalvariable{varx} < \txtbox{5}}}./
+
+\section{Les blocs de fin}
+Ces blocs sont susceptibles de clore un algorithme et n'ont donc pas d'encoche mâle dans leur partie basse. Ils ne peuvent être que du type \suffixe{control} et sont dessinés avec la macro \verb|\blockstop{<texte>}|
+
+\exemple/\begin{scratch}\blockstop{supprimer ce clone}\end{scratch}
+ou
+\begin{scratch}\blockstop{stop \selectmenu{ce script}}\end{scratch}/
+
+\section{Les blocs de répétition}
+Ces blocs sont de deux types, selon que la répétition est prévue pour s'arrêter ou pas (boucle infinie). Ils seront dessinés par les macros \verb|\blockrepeat| et \verb|\blocinfloop| ayant chacune \emph{deux} arguments : le premier étant le \verb|<texte>| du bloc et le second la suite d'instructions à répéter.
+
+\exemple/\begin{scratch}
+ \blockpen{stylo en position d'écriture}
+ \blockrepeat{répéter \ovalnum{4} fois}
+ {
+ \blockmove{avancer de \ovalnum{10}}
+ \blockmove{tourner \turnright{} de \ovalnum{90} degrés}
+ }
+\end{scratch}
+et
+\begin{scratch}
+ \blockpen{stylo en position d'écriture}
+ \blockinfloop{répéter indéfiniment}
+ {
+ \blockmove{s'orienter à \ovaloperator{nombre aléatoire entre \ovalnum{0} et \ovalnum{359}}}
+ \blockmove{avancer de \ovaloperator{nombre aléatoire entre \ovalnum{1} et \ovalnum{10}}}
+ \blockif{si \boolsensing{\selectmenu{bord} touché?}}
+ {
+ \blockmove{aller à x: \ovalnum{0} y: \ovalnum{0}}
+ }
+ }
+\end{scratch}/
+
+\section{Les blocs de définition}
+Les « procédures », ayant le suffixe \suffixe{moreblocks}, permettent d'étendre les maigres possibilités données au programmeur en \SCRATCH.
+
+\exemple/\begin{scratch}
+ \initmoreblocks{définir \namemoreblocks{trace_carré \ovalmoreblocks{coté_carré}}}
+ \blockrepeat{répéter \ovalnum4 fois}
+ {\blockmove{avancer de \ovalmoreblocks{coté_carré}}
+ \blockmove{tourner \turnleft{} de \ovalnum{90} degrés}
+ }
+\end{scratch}
+puis
+\begin{scratch}
+ \blockinit{Quand \greenflag est cliqué}
+ \blockpen{effacer tout}
+ \blockpen{relever le stylo}
+ \blockmove{aller à x: \ovalnum0 y: \ovalnum0}
+ \blockmove{s'orienter à \ovalnum{90\selectarrownum} degrés}
+ \blockpen{stylo en position d'écriture}
+ \blockrepeat{répéter \ovalnum{10} fois}
+ {
+ \blockmoreblocks{trace carré \ovalnum{50}}
+ \blockmove{avancer de \ovalnum{10}}
+ \blockmove{tourner \turnleft{} de \ovalnum{36} degrés}
+ }
+\end{scratch}/
+
+\section{Bloc invisible}
+Bien que ce genre de bloc n'existe pas avec \SCRATCH, cette fonctionnalité peut s'avérer utile. On insère un espace vide avec \verb|\blockspace[<coeff>]|. L'espace verticale insérée est égale à la hauteur normale d'un bloc multipliée par le \verb|<coeff>|, valeur optionnelle qui vaut 1 par défaut.
+
+\exemple/\begin{scratch}
+ \blockmove{ci-dessous, une espace d'un bloc}
+ \blockspace
+ \blockmove{ci dessous, une espace égale à la moitié d'un bloc}
+ \blockspace[0.5]
+ \blockmove{la suite}
+\end{scratch}/
+
+\section{Personnalisation}
+Plusieurs \verb|<paramètres>| peuvent être réglés par l'utilisateur selon la syntaxe \verb|<clé>=<valeur>|. Cas paramètres peuvent être spécifiés dans :
+
+\begin{itemize}
+ \item l'argument optionnel de l'environnement \verb|\begin{scratch}[<paramètres>]| auquel cas les \verb|<paramètres>| ne s'appliquent qu'à cet environnement;
+ \item l'argument de la macro \verb|\setscratch{<paramètres>}| pour spécifier des \verb|<paramètres>| pour les environnements \SCRATCH à venir;
+ \item l'argument de \verb|\setdefaultscratch{<paramètres>}| pour spécifier des \verb|<paramètres>| \emph{par défaut}.
+\end{itemize}
+
+Il existe la macro \verb|\resetscratch| qui remet à leur valeur par défaut tous les \verb|<paramètres>| de \SCRATCH, pour annuler les effets d'une macro \verb|\setscratch|.\bigbreak
+
+Voici les \verb|<paramètres>| disponibles :
+
+\cleval{else word}{caractères}
+Représente est le mot qui est inséré dans la branche « else » d'un bloc de test.
+
+\cleval{x sep}{dimension}
+Représente l'espace horizontale insérée entre les bords droit et gauche du texte du bloc et les bords droits et gauche du bloc.
+
+\cleval{y sepsup}{dimension}
+Représente l'espace verticale insérée entre le bas de l'encoche femelle et le bord supérieur du texte du bloc.
+
+\cleval{y sepinf}{dimension}
+Représente l'espace verticale insérée entre le bas du bloc et le bord inférieur du texte du bloc.
+
+\cleval{line width}{dimension}
+Représente l'épaisseur des lignes de relief des blocs et le double des lignes de relief des losanges booléens.
+
+\cleval{loop width}{dimension}
+Représente est la largeur de la barre verticale des blocs de répétition ou de test.
+
+\cleval{loop height}{dimension}
+Représente est l'épaisseur des barres horizontales « else » et inférieure des blocs de répétition ou de test.
+
+\cleval{corner}{dimension}
+Représente la dimension des chanfreins des blocs. Cette dimension est utilisée proportionnellement pour le placement horizontal, l'épaisseur et la largeur des encoches des blocs.
+
+\cleval{init arcangle}{angle}
+Représente l'angle avec l'horizontale de l'arc de cercle tracé dans la partie haute des blocs de départ.
+
+\cleval{init arclength}{dimension}
+Représente la longueur horizontale de l'arc de cercle tracé dans la partie haute des blocs de départ.*
+
+\cleval{moreblock arcangle}{angle}
+Représente l'angle avec l'horizontale de l'arc de cercle tracé dans la partie haute des blocs de de type « moreblock».
+
+\section{Mot de la fin}
+Le code de cette extension démontre mon immense ignorance de ti\textit kz/pgf et les méthodes de programmation qui lui sont propres que, décidément, je ne comprendrai jamais! C'est sans doute le trop grand éloignement avec la logique de \TeX{} et la documentation de ti\textit kz/pgf, aussi indigeste qu'illisible, qui explique cette incompatibilité d'humeur et mon désintérêt à l'égard de ti\textit kz. Toujours est-il que cette extension fonctionne, avec une lenteur certaine que j'attribue à ma programmation hasardeuse ainsi qu'à la lenteur intrinsèque de ti\textit kz.
+
+Toute remarque, remontée de bug ---~je n'ose pas dire amélioration du code~---, demande d'implémentation de fonctionnalité est bien évidemment bienvenue; j'invite les utilisateurs à m'en faire part \emph{via} email.
+\end{document} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/latex/scratch/scratch.sty b/Master/texmf-dist/tex/latex/scratch/scratch.sty
new file mode 100644
index 00000000000..ac9ea58fbc7
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/scratch/scratch.sty
@@ -0,0 +1,484 @@
+% !TeX encoding = ISO-8859-1
+% Ce fichier contient le code de l'extension "scratch"
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+\def\scrname {scratch} %
+\def\scrver {0.1} %
+% %
+\def\scrdate {2017/05/16} %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% --------------------------------------------------------------------
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+%
+% % http://www.latex-project.org/lppl.txt
+%
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+% --------------------------------------------------------------------
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is Christian Tellechea
+% email: unbonpetit@openmailbox.org
+% Commentaires, suggestions et signalement de bugs bienvenus !
+% Comments, bug reports and suggestions are welcome.
+% --------------------------------------------------------------------
+% L'extension scratch est composée des 4 fichiers suivants :
+% - code : scratch.sty
+% - manuel en français : scratch-fr (.tex et .pdf)
+% - fichier lisezmoi : README
+% --------------------------------------------------------------------
+\ProvidesPackage{scratch}[\scrdate\space v\scrver\space Draw scratch instructions (CT)]
+\NeedsTeXFormat{LaTeX2e}
+\RequirePackage{hlist,tikz}
+\usepgflibrary{shapes.misc,arrows.meta}
+\usetikzlibrary{bending}
+
+\expandafter\edef\csname scr\string_restorecatcode\endcsname{\catcode`\noexpand\_=\the\catcode`\_\relax}
+\catcode`\_11
+% Les réglages par défaut (modifiables avec \setdefaulthlist)
+\setKVdefault[\scrname]{
+ else word = sinon,% mot dans branche "else"
+ x sep = 0.5em,% séparation entre côtés droits et gauche du bloc et le texte
+ y sepsup = 1pt,% séparation entre côté sup (insert) et haut texte
+ y sepinf = 3pt,% séparation entre côté inf et bas texte
+ line width = 0.8pt,% épaisseur des lignes de relief
+ loop width = 3ex,% épaisseur de la barre verticale à gauche d'un bloc de boucle
+ loop height = 1.75ex,% hauteur de la barre du else et la barre finale
+ corner = 0.66667ex,% valeur du chanfrein
+ init arcangle = 30,% angle début et fin de l'arc
+ init arclength = 5em,% longueur de l'arc
+ moreblock arcangle = 15,% angle de départ et arriéve des "more blmocks"
+}
+\expandafter\let\expandafter\resetscratch\csname hlst_[\scrname]\endcsname
+\def\setscratch#{\setKV[\scrname]}
+\def\setdefaultscratch#{\setKVdefault[\scrname]}
+
+\def\scr_thesentinelkern{17}% nombre de "sp" sentinelle pour les booleanbox. Personne n'utilise 17sp j'espère ?
+\def\scr_blockstrut{\vrule height2.1ex depth.9ex width0pt\relax}% TODO à modifier ?
+\def\scr_ovalstrut{\vphantom{lp}}% TODO c'est pas un peu petit en hauteur tout ça ?
+\def\scr_cslet#1{\expandafter\let\csname#1\endcsname}
+\def\scr_csedef#1{\expandafter\edef\csname#1\endcsname}
+\newcount\scr_loopnest
+\newbox\scr_box
+\newdimen\scr_yoffset
+\newdimen\scr_xoffset
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% dessine un bloc normal %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\def\scr_normalblock#1#2{% #1=couleur #2=texte
+ \def\current_bloccolor{#1}%
+ \node[at=(origin)](x){%
+ \setbox\scr_box\hbox{\begingroup\color{white}\sffamily\bfseries#2\scr_blockstrut\endgroup}%
+ \xdef\__boxht{\the\ht\scr_box}%
+ \xdef\__totht{\the\dimexpr\ht\scr_box+\dp\scr_box\relax}%
+ \xdef\__boxwd{\the\wd\scr_box}%
+ };%
+ \let\scr_boxht\__boxht\let\scr_totht\__totht\let\scr_boxwd\__boxwd
+ \draw[draw=none,fill=#1,yshift=\scr_yoffset,xshift=\scr_xoffset]
+ (\scr_corner,0)--++(\scr_corner*3,0)--++(\scr_corner,-\scr_corner)--++(\scr_corner*3,0)--++(\scr_corner,\scr_corner)--++(\scr_boxwd+2*\scr_xsep-\scr_corner*10,0)--++(\scr_corner,-\scr_corner)% ligne sup
+ --++(0,-\scr_totht-\scr_ysepsup-\scr_ysepinf+\scr_corner)--++(-\scr_corner,-\scr_corner)--++(-\scr_boxwd-2*\scr_xsep+\scr_corner*10,0)--++(-\scr_corner,-\scr_corner)--++(-\scr_corner*3,0)--++(-\scr_corner,\scr_corner)--++(-\scr_corner*3,0)--++(-\scr_corner,\scr_corner)--++(0,\scr_totht+\scr_ysepsup+\scr_ysepinf-\scr_corner)--cycle
+ node[at=(origin),draw=none,anchor=base west,xshift=\scr_xoffset+\scr_xsep,yshift=\scr_yoffset-\scr_boxht-\scr_corner-\scr_ysepsup,text=white](texte){\sffamily\bfseries#2\scr_blockstrut};
+ \draw[draw=#1!80!black,yshift=\scr_yoffset,xshift=\scr_xoffset](\scr_boxwd+\scr_xsep*2,-\scr_corner)--++(0,-\scr_totht-\scr_ysepsup-\scr_ysepinf+\scr_corner)--++(-\scr_corner,-\scr_corner)--++(-\scr_boxwd-2*\scr_xsep+\scr_corner*10,0)--++(-\scr_corner,-\scr_corner)--++(-\scr_corner*3,0)--++(-\scr_corner,\scr_corner)--++(-\scr_corner*3,0);
+ \draw[draw=#1!80!white,yshift=\scr_yoffset,xshift=\scr_xoffset](\scr_corner,-\scr_corner-\scr_ysepsup-\scr_totht-\scr_ysepinf)--++(-\scr_corner,\scr_corner)--++(0,\scr_totht+\scr_ysepsup+\scr_ysepinf-\scr_corner)--++(\scr_corner,\scr_corner)--++(\scr_corner*3,0)--++(\scr_corner,-\scr_corner)--++(\scr_corner*3,0)--++(\scr_corner,\scr_corner)--++(\scr_boxwd+2*\scr_xsep-\scr_corner*10,0)--++(\scr_corner,-\scr_corner);
+ \advance\scr_yoffset\dimexpr-\scr_totht-\scr_ysepsup-\scr_ysepinf-\scr_corner-\scr_linewidth\relax
+ \gdef\scr_blockstop{0}%
+}
+\newcommand*\blockspace[1][1]{%
+ \advance\scr_yoffset#1\dimexpr-\scr_blockstruttotht-\scr_ysepsup-\scr_ysepinf-\scr_corner-\scr_linewidth\relax
+ \gdef\scr_blockstop{1}%
+}
+\def\blockstop#1{% #1=texte
+ \def\current_bloccolor{scrcontrol}%
+ \node[at=(origin)](x){%
+ \setbox\scr_box\hbox{\begingroup\color{white}\sffamily\bfseries#1\scr_blockstrut\endgroup}%
+ \xdef\__boxht{\the\ht\scr_box}%
+ \xdef\__totht{\the\dimexpr\ht\scr_box+\dp\scr_box\relax}%
+ \xdef\__boxwd{\the\wd\scr_box}%
+ };%
+ \let\scr_boxht\__boxht\let\scr_totht\__totht\let\scr_boxwd\__boxwd
+ \draw[draw=none,fill=\current_bloccolor,yshift=\scr_yoffset,xshift=\scr_xoffset]
+ (\scr_corner,0)--++(\scr_corner*3,0)--++(\scr_corner,-\scr_corner)--++(\scr_corner*3,0)--++(\scr_corner,\scr_corner)--++(\scr_boxwd+2*\scr_xsep-\scr_corner*10,0)--++(\scr_corner,-\scr_corner)% ligne sup
+ --++(0,-\scr_totht-\scr_ysepsup-\scr_ysepinf+\scr_corner)--++(-\scr_corner,-\scr_corner)--++(-\scr_boxwd-2*\scr_xsep+\scr_corner*2,0)--++(-\scr_corner,\scr_corner)--++(0,\scr_totht+\scr_ysepsup+\scr_ysepinf-\scr_corner)--cycle
+ node[at=(origin),draw=none,anchor=base west,xshift=\scr_xoffset+\scr_xsep,yshift=\scr_yoffset-\scr_boxht-\scr_corner-\scr_ysepsup,text=white](texte){\sffamily\bfseries#1\scr_blockstrut};
+ \draw[draw=\current_bloccolor!80!black,yshift=\scr_yoffset,xshift=\scr_xoffset](\scr_boxwd+\scr_xsep*2,-\scr_corner)--++(0,-\scr_totht-\scr_ysepsup-\scr_ysepinf+\scr_corner)--++(-\scr_corner,-\scr_corner)--++(-\scr_boxwd-2*\scr_xsep+\scr_corner*2,0);
+ \draw[draw=\current_bloccolor!80!white,yshift=\scr_yoffset,xshift=\scr_xoffset](\scr_corner,-\scr_corner*2-\scr_ysepsup-\scr_totht-\scr_ysepinf+\scr_corner)--++(-\scr_corner,\scr_corner)--++(0,\scr_totht+\scr_ysepsup+\scr_ysepinf-\scr_corner)--++(\scr_corner,\scr_corner)--++(\scr_corner*3,0)--++(\scr_corner,-\scr_corner)--++(\scr_corner*3,0)--++(\scr_corner,\scr_corner)--++(\scr_boxwd+2*\scr_xsep-\scr_corner*10,0)--++(\scr_corner,-\scr_corner);
+ \advance\scr_yoffset\dimexpr-\scr_totht-\scr_ysepsup-\scr_ysepinf-\scr_corner-\scr_linewidth\relax
+ \gdef\scr_blockstop{1}%
+}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% dessine un bloc de départ %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\def\scr_initblock#1#2{%
+ \def\current_bloccolor{#1}%
+ \node[at=(origin)](x){%
+ \setbox\scr_box\hbox{\begingroup\color{white}\sffamily\bfseries#2\scr_blockstrut\endgroup}%
+ \xdef\__boxht{\the\ht\scr_box}%
+ \xdef\__totht{\the\dimexpr\ht\scr_box+\dp\scr_box\relax}%
+ \xdef\__boxwd{\the\wd\scr_box}%
+ };%
+ \let\scr_boxht\__boxht\let\scr_totht\__totht\let\scr_boxwd\__boxwd
+ \draw[draw=none,fill=\current_bloccolor,yshift=\scr_yoffset,xshift=\scr_xoffset]
+ (0,0)to[out=\scr_initarcangle,in=180-\scr_initarcangle](\scr_xsep+\scr_initarclength,0)--(\scr_boxwd+2*\scr_xsep-\scr_corner,0)--++(\scr_corner,-\scr_corner)% ligne sup
+ --++(0,-\scr_totht-\scr_ysepsup-\scr_ysepinf+\scr_corner)--++(-\scr_corner,-\scr_corner)--++(-\scr_boxwd-2*\scr_xsep+\scr_corner*10,0)--++(-\scr_corner,-\scr_corner)--++(-\scr_corner*3,0)--++(-\scr_corner,\scr_corner)--++(-\scr_corner*3,0)--++(-\scr_corner,\scr_corner)--++(0,\scr_totht+\scr_ysepsup+\scr_ysepinf)--cycle
+ node[at=(origin),draw=none,anchor=base west,xshift=\scr_xoffset+\scr_xsep,yshift=\scr_yoffset-\scr_boxht-\scr_corner-\scr_ysepsup,text=white](texte){\sffamily\bfseries#2\scr_blockstrut};
+ \draw[draw=\current_bloccolor!80!black,yshift=\scr_yoffset,xshift=\scr_xoffset](\scr_boxwd+\scr_xsep*2,-\scr_corner)--++(0,-\scr_totht-\scr_ysepsup-\scr_ysepinf+\scr_corner)--++(-\scr_corner,-\scr_corner)--++(-\scr_boxwd-2*\scr_xsep+\scr_corner*10,0)--++(-\scr_corner,-\scr_corner)--++(-\scr_corner*3,0)--++(-\scr_corner,\scr_corner)--++(-\scr_corner*3,0);
+ \draw[draw=\current_bloccolor!80!white,yshift=\scr_yoffset,xshift=\scr_xoffset](\scr_corner,-\scr_corner-\scr_ysepsup-\scr_totht-\scr_ysepinf)--++(-\scr_corner,\scr_corner)--++(0,\scr_totht+\scr_ysepsup+\scr_ysepinf)--(0,0);
+ \draw[draw=\current_bloccolor!80!white,yshift=\scr_yoffset,xshift=\scr_xoffset](\scr_xsep+\scr_initarclength,0)--(\scr_boxwd+2*\scr_xsep-\scr_corner,0)--++(\scr_corner,-\scr_corner);
+ \advance\scr_yoffset\dimexpr-\scr_totht-\scr_ysepsup-\scr_ysepinf-\scr_corner-\scr_linewidth\relax
+ \gdef\scr_blockstop{0}%
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% dessine un bloc de définition %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\def\initmoreblocks#1{%
+ \def\current_bloccolor{scrmoreblocks}%
+ \node[at=(origin)](x){%
+ \setbox\scr_box\hbox{\begingroup\color{white}\sffamily\bfseries#1\scr_blockstrut\endgroup}%
+ \xdef\__boxht{\the\ht\scr_box}%
+ \xdef\__totht{\the\dimexpr\ht\scr_box+\dp\scr_box\relax}%
+ \xdef\__boxwd{\the\wd\scr_box}%
+ };%
+ \let\scr_boxht\__boxht\let\scr_totht\__totht\let\scr_boxwd\__boxwd
+ \draw[draw=none,fill=\current_bloccolor,yshift=\scr_yoffset,xshift=\scr_xoffset]
+ (0,0)to[out=\scr_moreblockarcangle,in=180-\scr_moreblockarcangle](\scr_boxwd+2*\scr_xsep,0)% ligne sup
+ --++(0,-\scr_totht-\scr_ysepsup-\scr_ysepinf)--++(-\scr_corner,-\scr_corner)--++(-\scr_boxwd-2*\scr_xsep+\scr_corner*10,0)--++(-\scr_corner,-\scr_corner)--++(-\scr_corner*3,0)--++(-\scr_corner,\scr_corner)--++(-\scr_corner*3,0)--++(-\scr_corner,\scr_corner)--++(0,\scr_totht+\scr_ysepsup+\scr_ysepinf)--cycle
+ node[at=(origin),draw=none,anchor=base west,xshift=\scr_xoffset+\scr_xsep,yshift=\scr_yoffset-\scr_boxht-\scr_corner-\scr_ysepsup,text=white](texte){\sffamily\bfseries#1\scr_blockstrut};
+ \draw[draw=\current_bloccolor!80!black,yshift=\scr_yoffset,xshift=\scr_xoffset](\scr_boxwd+\scr_xsep*2,0)--++(0,-\scr_totht-\scr_ysepsup-\scr_ysepinf)--++(-\scr_corner,-\scr_corner)--++(-\scr_boxwd-2*\scr_xsep+\scr_corner*10,0)--++(-\scr_corner,-\scr_corner)--++(-\scr_corner*3,0)--++(-\scr_corner,\scr_corner)--++(-\scr_corner*3,0);
+ \draw[draw=\current_bloccolor!80!white,yshift=\scr_yoffset,xshift=\scr_xoffset](\scr_corner,-\scr_corner-\scr_ysepsup-\scr_totht-\scr_ysepinf)--++(-\scr_corner,\scr_corner)--++(0,\scr_totht+\scr_ysepsup+\scr_ysepinf)--(0,0);
+ \draw[line width=1.5pt,draw=scrmoreblocksurround,shorten <=-\scr_linewidth,shorten >=-\scr_linewidth](0,0)to[out=15,in=165](\scr_boxwd+2*\scr_xsep,0);
+ \advance\scr_yoffset\dimexpr-\scr_totht-\scr_ysepsup-\scr_ysepinf-\scr_corner-\scr_linewidth\relax
+ \gdef\scr_blockstop{0}%
+}
+\def\namemoreblocks#1{%
+ \begin{tikzpicture}[baseline=(moreblocksdef.base)]
+ \def\scr_ysepinf{2pt}\def\scr_ysepsup{2pt}%
+ \edef\scr_xsep{\the\dimexpr\scr_xsep*3/2\relax}%
+ \node(moreblocksdefaux){%
+ \setbox\scr_box\hbox{\begingroup\color{white}\sffamily\bfseries#1\strut\endgroup}%
+ \xdef\__boxht{\the\ht\scr_box}%
+ \xdef\__totht{\the\dimexpr\ht\scr_box+\dp\scr_box\relax}%
+ \xdef\__boxwd{\the\wd\scr_box}%
+ };%
+ \let\scr_boxht\__boxht\let\scr_totht\__totht\let\scr_boxwd\__boxwd
+ \draw[draw=scrmoreblockcontour,line width=\scr_linewidth*2]
+ (\scr_corner,0)--++(\scr_corner*3,0)--++(\scr_corner,-\scr_corner)--++(\scr_corner*3,0)--++(\scr_corner,\scr_corner)--++(\scr_boxwd+2*\scr_xsep-\scr_corner*10,0)--++(\scr_corner,-\scr_corner)% ligne sup
+ --++(0,-\scr_totht-\scr_ysepsup-\scr_ysepinf+\scr_corner)--++(-\scr_corner,-\scr_corner)--++(-\scr_boxwd-2*\scr_xsep+\scr_corner*10,0)--++(-\scr_corner,-\scr_corner)--++(-\scr_corner*3,0)--++(-\scr_corner,\scr_corner)--++(-\scr_corner*3,0)--++(-\scr_corner,\scr_corner)--++(0,\scr_totht+\scr_ysepsup+\scr_ysepinf-\scr_corner)--cycle
+ node[at=(moreblocksdefaux),draw=none,anchor=base west,xshift=\scr_xoffset+\scr_xsep,yshift=\scr_yoffset-\scr_boxht-\scr_corner-\scr_ysepsup,text=white](moreblocksdef){\sffamily\bfseries#1\strut};
+ \end{tikzpicture}
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% dessine un bloc de répétition ou test %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\def\scr_blockloop#1#2#3#4#5{% #1=texte #2=instructions sup #3=instructions inf #4=boucle infinie (1 ou 0) #5=fleche de répétition (1 ou 0)
+ \def\current_bloccolor{scrcontrol}%
+ \edef\scr_blocminheight{\dimexpr\scr_loopblockheight+\scr_ysepinf+\scr_ysepsup+\scr_corner\relax}% hauteur minimale d'un bloc normal
+ \node[at=(origin)](x){%
+ \setbox\scr_box\hbox{\begingroup\color{white}\sffamily\bfseries#1\scr_blockstrut\endgroup}%
+ \xdef\__boxht{\the\ht\scr_box}%
+ \xdef\__totht{\the\dimexpr\ht\scr_box+\dp\scr_box\relax}%
+ \xdef\__boxwd{\the\wd\scr_box}%
+ };%
+ \scr_cslet{scr_txtloopht\number\scr_loopnest}\__boxht
+ \scr_cslet{scr_txtlooptotht\number\scr_loopnest}\__totht
+ \scr_cslet{scr_txtloopwd\number\scr_loopnest}\__boxwd
+ \scr_csedef{toploopx\number\scr_loopnest}{\the\scr_xoffset}% coordonnées du point nord-west
+ \scr_csedef{toploopy\number\scr_loopnest}{\the\scr_yoffset}%
+ \advance\scr_xoffset by \scr_loopblockwidth
+ \advance\scr_yoffset\dimexpr-\scr_corner-\scr_ysepsup-\csname scr_txtlooptotht\number\scr_loopnest\endcsname-\scr_ysepinf-\scr_linewidth\relax
+ \advance\scr_loopnest1
+ #2%
+ \advance\scr_loopnest-1
+ \expandafter\let\csname scr_blockstopif_\number\scr_loopnest\endcsname\scr_blockstop
+ \scr_csedef{bottomifx\number\scr_loopnest}{\the\scr_xoffset}%
+ \scr_csedef{bottomify\number\scr_loopnest}{\the\scr_yoffset}%
+ \ifcat\relax\detokenize{#3}\relax\else% si instruction #3
+ \advance\scr_yoffset\dimexpr-\scr_blocminheight-\scr_linewidth\relax% épaisseur théorique de la branche "sinon"
+ \advance\scr_loopnest1
+ #3%
+ \advance\scr_loopnest-1
+ \scr_csedef{bottomelsex\number\scr_loopnest}{\the\scr_xoffset}%
+ \scr_csedef{bottomelsey\number\scr_loopnest}{\the\scr_yoffset}%
+ \fi
+ \advance\scr_yoffset by \dimexpr-\scr_blocminheight-\scr_linewidth\relax% épaisseur de la branche du bas
+ \draw[draw=none,fill=scrcontrol](\csname toploopx\number\scr_loopnest\endcsname+\scr_corner,\csname toploopy\number\scr_loopnest\endcsname)--++(\scr_corner*3,0)--++(\scr_corner,-\scr_corner)--++(\scr_corner*3,0)--++(\scr_corner,\scr_corner)--++(\csname scr_txtloopwd\number\scr_loopnest\endcsname+2*\scr_xsep-\scr_corner*10,0)% ligne haut du titre boucle "--\__/---------"
+ --++(\scr_corner,-\scr_corner)--++(0,-\csname scr_txtlooptotht\number\scr_loopnest\endcsname-\scr_ysepsup-\scr_ysepinf+\scr_corner)--++(-\scr_corner,-\scr_corner)% ligne est "\ + | + /"
+ --++(-\csname scr_txtloopwd\number\scr_loopnest\endcsname-2*\scr_xsep+\scr_corner*10+\scr_loopblockwidth,0)--++(-\scr_corner,-\scr_corner)--++(-\scr_corner*3,0)--++(-\scr_corner,\scr_corner)--++(-\scr_corner*3-\scr_linewidth,0)--++(-\scr_corner,-\scr_corner)% ligne sud "/--\__/---------"
+ --(\csname bottomifx\number\scr_loopnest\endcsname-\scr_linewidth,\csname bottomify\number\scr_loopnest\endcsname+\scr_corner)% descente gauche bloc "if"
+ \ifcat\relax\detokenize{#3}\relax\else% tracé de la branche du bas du else
+ --++(\scr_corner,-\scr_corner)% chanfrein"\" pour raccord sur ligne haut
+ \ifnum\csname scr_blockstopif_\number\scr_loopnest\endcsname=1
+ --++(\csname scr_txtloopwd\number\scr_loopnest\endcsname+2*\scr_xsep-\scr_corner*2-\scr_loopblockwidth+\scr_linewidth,0)% ligne haut de la barre else "--\__/---------"
+ \else
+ --++(\scr_corner*3+\scr_linewidth,0)--++(\scr_corner,-\scr_corner)--++(\scr_corner*3,0)--++(\scr_corner,\scr_corner)--++(\csname scr_txtloopwd\number\scr_loopnest\endcsname+2*\scr_xsep-\scr_corner*10-\scr_loopblockwidth,0)% ligne haut de la barre else "--\__/---------"
+ \fi
+ --++(\scr_corner,-\scr_corner)--++(0,-\scr_loopblockheight-\scr_ysepsup-\scr_ysepinf+\scr_corner)--++(-\scr_corner,-\scr_corner)--++(-\csname scr_txtloopwd\number\scr_loopnest\endcsname-2*\scr_xsep+\scr_corner*10+\scr_loopblockwidth,0)--++(-\scr_corner,-\scr_corner)% ligne Est "\ + | + /"
+ --++(-\scr_corner*3,0)--++(-\scr_corner,\scr_corner)--++(-\scr_corner*3-\scr_linewidth,0)--++(-\scr_corner,-\scr_corner)% ligne sud "/--\__/---------"
+ --(\csname bottomelsex\number\scr_loopnest\endcsname-\scr_linewidth,\csname bottomelsey\number\scr_loopnest\endcsname+\scr_corner)% descente gauche bloc "else"
+ \fi
+ --++(\scr_corner,-\scr_corner)% chanfrein "\" pour rejoindre haut de la ligne de fin
+ \ifnum\scr_blockstop=1
+ --++(\csname scr_txtloopwd\number\scr_loopnest\endcsname+2*\scr_xsep-\scr_corner*2-\scr_loopblockwidth+\scr_linewidth,0)% ligne haut de la barre de fin "--\__/---------"
+ \else
+ --++(\scr_corner*3+\scr_linewidth,0)--++(\scr_corner,-\scr_corner)--++(\scr_corner*3,0)--++(\scr_corner,\scr_corner)--++(\csname scr_txtloopwd\number\scr_loopnest\endcsname+2*\scr_xsep-\scr_corner*10-\scr_loopblockwidth,0)% ligne haut de la barre de fin "--\__/---------"
+ \fi
+ --++(\scr_corner,-\scr_corner)--++(0,-\scr_loopblockheight-\scr_ysepsup-\scr_ysepinf+\scr_corner)--++(-\scr_corner,-\scr_corner)% ligne Est "\ + | + /"
+ \ifnum#4=1 %infiniteloop
+ --++(-\csname scr_txtloopwd\number\scr_loopnest\endcsname-2*\scr_xsep+\scr_corner*2,0)% ligne Sud "\---------------"
+ \else
+ --++(-\csname scr_txtloopwd\number\scr_loopnest\endcsname-2*\scr_xsep+\scr_corner*10,0)--++(-\scr_corner,-\scr_corner)--++(-\scr_corner*3,0)--++(-\scr_corner,\scr_corner)--++(-\scr_corner*3,0)% ligne Sud "\--\__/---------"
+ \fi
+ --++(-\scr_corner,\scr_corner)
+ --(\csname toploopx\number\scr_loopnest\endcsname,\csname toploopy\number\scr_loopnest\endcsname-\scr_corner)--cycle% remontée tout en haut et cycle
+ ;%
+ \advance\scr_xoffset by -\scr_loopblockwidth
+ \draw[draw=scrcontrol!80!white](\scr_xoffset+\scr_corner,\scr_yoffset+\scr_linewidth)--++(-\scr_corner,\scr_corner)
+ --(\csname toploopx\number\scr_loopnest\endcsname,\csname toploopy\number\scr_loopnest\endcsname-\scr_corner)--++(\scr_corner,\scr_corner)--++(\scr_corner*3,0)--++(\scr_corner,-\scr_corner)--++(\scr_corner*3,0)--++(\scr_corner,\scr_corner)--++(\csname scr_txtloopwd\number\scr_loopnest\endcsname+2*\scr_xsep-\scr_corner*10,0)--++(\scr_corner,-\scr_corner);% remontée gauche + ligne haut bandeau
+ \draw[draw=scrcontrol!80!black](\csname toploopx\number\scr_loopnest\endcsname+\scr_xsep*2+\csname scr_txtloopwd\number\scr_loopnest\endcsname,\csname toploopy\number\scr_loopnest\endcsname-\scr_corner)--++(0,-\csname scr_txtlooptotht\number\scr_loopnest\endcsname-\scr_ysepsup-\scr_ysepinf+\scr_corner)--++(-\scr_corner,-\scr_corner)--++(-\csname scr_txtloopwd\number\scr_loopnest\endcsname-2*\scr_xsep+\scr_corner*10+\scr_loopblockwidth,0)--++(-\scr_corner,-\scr_corner)--++(-\scr_corner*3,0)--++(-\scr_corner,\scr_corner)--++(-\scr_corner*3-\scr_linewidth,0)--++(-\scr_corner,-\scr_corner)--(\csname bottomifx\number\scr_loopnest\endcsname-\scr_linewidth,\csname bottomify\number\scr_loopnest\endcsname+\scr_corner);
+ \draw[draw=scrcontrol!80!white](\csname bottomifx\number\scr_loopnest\endcsname-\scr_linewidth,\csname bottomify\number\scr_loopnest\endcsname+\scr_corner)--++(\scr_corner,-\scr_corner)
+ \ifnum\csname scr_blockstopif_\number\scr_loopnest\endcsname=1
+ --++(\csname scr_txtloopwd\number\scr_loopnest\endcsname+2*\scr_xsep-\scr_corner*2-\scr_loopblockwidth+\scr_linewidth,0)
+ \else
+ --++(\scr_corner*3+\scr_linewidth,0)--++(\scr_corner,-\scr_corner)--++(\scr_corner*3,0)--++(\scr_corner,\scr_corner)--++(\csname scr_txtloopwd\number\scr_loopnest\endcsname+2*\scr_xsep-\scr_corner*10-\scr_loopblockwidth,0)
+ \fi
+ --++(\scr_corner,-\scr_corner);
+ \edef\scr_tempname{\ifcat\relax\detokenize{#3}\relax bottomif\else bottomelse\fi}%
+ \draw[draw=scrcontrol!80!black](\csname \scr_tempname x\number\scr_loopnest\endcsname+\scr_xsep*2+\csname scr_txtloopwd\number\scr_loopnest\endcsname-\scr_loopblockwidth,\csname \scr_tempname y\number\scr_loopnest\endcsname-\scr_corner)--++(0,-\scr_loopblockheight-\scr_ysepsup-\scr_ysepinf+\scr_corner)--++(-\scr_corner,-\scr_corner)
+ \ifnum#4=1 %infiniteloop
+ --++(-\csname scr_txtloopwd\number\scr_loopnest\endcsname-2*\scr_xsep+\scr_corner*2,0)
+ \else
+ --++(-\csname scr_txtloopwd\number\scr_loopnest\endcsname-2*\scr_xsep+\scr_corner*10,0)--++(-\scr_corner,-\scr_corner)--++(-\scr_corner*3,0)--++(-\scr_corner,\scr_corner)--++(-\scr_corner*3,0)
+ \fi
+ ;% ligne Sud de la barre du bas
+ \node[at=(origin),draw=none,anchor=base west,xshift=\csname toploopx\number\scr_loopnest\endcsname+\scr_xsep,yshift=\csname toploopy\number\scr_loopnest\endcsname-\csname scr_txtloopht\number\scr_loopnest\endcsname-\scr_corner-\scr_ysepsup,text=white](texte){\sffamily\bfseries#1\scr_blockstrut};
+ \ifcat\relax\detokenize{#3}\relax\else
+ \node[at=(origin),draw=none,anchor=base west,xshift=\csname toploopx\number\scr_loopnest\endcsname+\scr_xsep,yshift=\csname bottomify\number\scr_loopnest\endcsname-\scr_loopblockheight-\scr_corner,text=white](texte){\sffamily\bfseries\useKV[\scrname]{else word}};
+ \draw[draw=scrcontrol!80!black](\csname bottomifx\number\scr_loopnest\endcsname+\scr_xsep*2+\csname scr_txtloopwd\number\scr_loopnest\endcsname-\scr_loopblockwidth,\csname bottomify\number\scr_loopnest\endcsname-\scr_corner)--++(0,-\scr_loopblockheight-\scr_ysepsup-\scr_ysepinf+\scr_corner)--++(-\scr_corner,-\scr_corner)--++(-\csname scr_txtloopwd\number\scr_loopnest\endcsname-2*\scr_xsep+\scr_corner*10+\scr_loopblockwidth,0)--++(-\scr_corner,-\scr_corner)% ligne Est "\ + | + /"
+ --++(-\scr_corner*3,0)--++(-\scr_corner,\scr_corner)--++(-\scr_corner*3-\scr_linewidth,0)--++(-\scr_corner,-\scr_corner)% ligne sud "/--\__/---------"
+ --(\csname bottomelsex\number\scr_loopnest\endcsname-\scr_linewidth,\csname bottomelsey\number\scr_loopnest\endcsname+\scr_corner)
+ ;
+ \draw[draw=scrcontrol!80!white](\csname bottomelsex\number\scr_loopnest\endcsname-\scr_linewidth,\csname bottomelsey\number\scr_loopnest\endcsname+\scr_corner)--++(\scr_corner,-\scr_corner)% chanfrein "\" pour rejoindre haut de la ligne de fin
+ \ifnum\scr_blockstop=1
+ --++(\csname scr_txtloopwd\number\scr_loopnest\endcsname+2*\scr_xsep-\scr_corner*2-\scr_loopblockwidth+\scr_linewidth,0)--++(\scr_corner,-\scr_corner);
+ \else
+ --++(\scr_corner*3+\scr_linewidth,0)--++(\scr_corner,-\scr_corner)--++(\scr_corner*3,0)--++(\scr_corner,\scr_corner)--++(\csname scr_txtloopwd\number\scr_loopnest\endcsname+2*\scr_xsep-\scr_corner*10-\scr_loopblockwidth,0)--++(\scr_corner,-\scr_corner);
+ \fi
+ \fi
+ \ifnum#5=1 %fleche
+ \draw[scrcontrol!80!black,line width=1.5pt,-{Triangle[length=1.25ex,width=1.5ex]},rounded corners=1pt](\scr_xoffset+\scr_xsep*2+\csname scr_txtloopwd\number\scr_loopnest\endcsname-\scr_ex*3.5+1pt,\scr_yoffset+\scr_linewidth+\scr_ysepinf-1.25pt)--++(\scr_loopblockheight,0)--++(0,\scr_loopblockheight+\scr_corner*0.5);
+ \draw[white,line width=1.5pt,-{Triangle[length=1.25ex,width=1.5ex]},rounded corners=1pt](\scr_xoffset+\scr_xsep*2+\csname scr_txtloopwd\number\scr_loopnest\endcsname-\scr_ex*3.5,\scr_yoffset+\scr_linewidth+\scr_ysepinf)--++(\scr_loopblockheight,0)--++(0,\scr_loopblockheight+\scr_corner*0.5);
+ \fi
+ \xdef\scr_blockstop{\ifnum#4=1 1\else0\fi}%
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% dessine un ovale %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\def\scr_ovalbox#1#2{% #1=couleur remplissage et contour #2=texte
+ \edef\scr_linewidth{\the\dimexpr\useKV[\scrname]{line width}\relax}%
+ \begin{tikzpicture}[baseline=(x.base),x=1ex,y=1ex,inner ysep=0.25ex,inner xsep=0.1ex,line width=\scr_linewidth]
+ \node[rounded rectangle,draw=none,fill=#1,text=white](x){\sffamily\bfseries\relax#2\scr_ovalstrut};%
+ \draw[draw=#1!80!black](x.west)to[out=270,in=180](x.south west)--(x.south east)to[out=0,in=270](x.east);
+ \draw[draw=#1!80!white](x.west)to[out=90,in=180](x.north west)--(x.north east)to[out=0,in=90](x.east);
+ \end{tikzpicture}%
+}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% dessine un triangle de sélection %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\def\scr_menuselectarrow{%
+ \tikz[baseline=-1ex,x=1ex,y=1ex,rounded corners=0pt]\draw[fill=\current_bloccolor!35!black,draw=none](0,0)--(1,0)--(0.5,-0.6)--cycle;%
+}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% dessine un menu %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\def\selectmenu#1{% #1=texte du menu (sera composé et suivi du triangle de sélection)
+ \begin{tikzpicture}[anchor=base west,baseline=(textmenu.base west),outer sep=0pt,inner sep=0pt]
+ \node[draw=none,inner xsep=0.2em,fill=\current_bloccolor!85!black](textmenu){\normalfont\sffamily#1\scr_ovalstrut\hskip.6666em \scr_menuselectarrow};
+ \draw[draw=\current_bloccolor!80!black,line width=0.5pt](textmenu.south west)--(textmenu.north west)--(textmenu.north east);
+ \draw[draw=\current_bloccolor!80!white,line width=0.5pt](textmenu.south west)--(textmenu.south east)--(textmenu.north east);
+ \end{tikzpicture}%
+}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% dessine un losange %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\def\scr_boolbox#1#2{%
+ \begingroup
+ \edef\scr_previouskern{\number\lastkern}%
+ \edef\scr_linewidth{\useKV[\scrname]{line width}}%
+ \def\current_bloccolor{#1}%
+ \setbox\scr_box\hbox{\begingroup\color{white}\bfseries\scr_ovalstrut\kern\scr_thesentinelkern sp #2\xdef\__tmpkern{\number\lastkern}\endgroup}%
+ \let\scr_endkern\__tmpkern
+ \edef\scr_totheight{\the\dimexpr\ht\scr_box+\dp\scr_box\relax}%
+ \def\scr_sep{1pt}%
+ \edef\scr_retainedwd{\the\dimexpr\wd\scr_box\ifnum\scr_endkern=\scr_thesentinelkern-\scr_totheight/2+\scr_sep\fi\relax}%
+ \begin{tikzpicture}[baseline=(x.base),x=1ex,y=1ex,line width=\scr_linewidth/2]
+ \draw[draw=none,use as bounding box](\ifnum\scr_previouskern=\scr_thesentinelkern\space -\scr_sep\else -\scr_totheight/2\fi,-1pt)rectangle(\scr_retainedwd+\scr_totheight/2,\scr_totheight+1pt);
+ \draw[fill=#1,draw=none](\scr_sep,-\scr_sep)--++(\scr_retainedwd-\scr_sep*2,0)--++(\scr_totheight/2+\scr_sep,\scr_totheight/2+\scr_sep)--++(-\scr_totheight/2-\scr_sep,\scr_totheight/2+\scr_sep)--++(-\scr_retainedwd+\scr_sep*2,0)--++(-\scr_totheight/2-\scr_sep,-\scr_totheight/2-\scr_sep)--cycle;
+ \draw[#1!80!black](\scr_sep,-\scr_sep)--++(\scr_retainedwd-\scr_sep*2,0)--++(\scr_totheight/2+\scr_sep,\scr_totheight/2+\scr_sep);
+ \draw[#1!80!white](\scr_retainedwd-\scr_sep,\scr_totheight+\scr_sep)--++(-\scr_retainedwd+\scr_sep*2,0)--++(-\scr_totheight/2-\scr_sep,-\scr_totheight/2-\scr_sep);
+ \node[inner sep=0pt,outer sep=0pt,minimum size=0pt,draw=none,anchor=south west,text=white](x){\sffamily\bfseries\scr_ovalstrut\kern\scr_thesentinelkern sp #2};
+ \end{tikzpicture}%
+ \endgroup
+ \kern\scr_thesentinelkern sp
+}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% environnement scratch %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newenvironment{scratch}[1][]
+ {\hlst_ifempty{#1}{}{\setscratch{#1}}%
+ \normalfont
+ \edef\scr_ex{\the\dimexpr1ex\relax}% valeur d'1ex pour le tracé de la flèche
+ \edef\scr_corner{\the\dimexpr\useKV[\scrname]{corner}\relax}
+ \edef\scr_xsep{\the\dimexpr\useKV[\scrname]{x sep}\relax}%
+ \edef\scr_ysepsup{\the\dimexpr\useKV[\scrname]{y sepsup}\relax}%
+ \edef\scr_ysepinf{\the\dimexpr\useKV[\scrname]{y sepinf}\relax}%
+ \edef\scr_linewidth{\the\dimexpr\useKV[\scrname]{line width}\relax}%
+ \edef\scr_loopblockwidth{\the\dimexpr\useKV[\scrname]{loop width}\relax}%
+ \edef\scr_loopblockheight{\the\dimexpr\useKV[\scrname]{loop height}\relax}%
+ \edef\scr_initarcangle{\useKV[\scrname]{init arcangle}}%
+ \edef\scr_initarclength{\useKV[\scrname]{init arclength}}%
+ \edef\scr_moreblockarcangle{\useKV[\scrname]{moreblock arcangle}}%
+ \setbox\scr_box\hbox{\scr_blockstrut}\edef\scr_blockstruttotht{\the\dimexpr\ht\scr_box+\dp\scr_box\relax}% haut totale du strut
+ \def\turnleft{\turn_arrow{}}\def\turnright{\turn_arrow{xscale=-1}}%
+ \let\blockmove\scr_blockmove\let\blocklook\scr_blocklook\let\blocksound\scr_blocksound
+ \let\blockpen\scr_blockpen\let\blockvariable\scr_blockvariable\let\blocklist\scr_blocklist
+ \let\blockevent\scr_blockevent\let\blockinit\scr_blockinit
+ \let\blockrepeat\scr_blockrepeat\let\blockinfloop\scr_blockinfloop
+ \let\blockifelse\scr_blockifelse\let\blockif\scr_blockif
+ \let\blockinitclone\scr_blockinitclone\let\blockcontrol\scr_blockcontrol
+ \let\blocksensing\scr_blocksensing\let\blockmoreblocks\scr_blockmoreblocks
+ \catcode`\:12 \catcode`\;12 \catcode`\!12 \catcode`\?12 \catcode`\_12
+ \begin{tikzpicture}[line width=\scr_linewidth,inner sep=0pt,outer sep=0pt,minimum size=0pt,line cap=round]
+ \node[shape=coordinate](origin){};% origine
+ }
+ {\end{tikzpicture}}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% menu mouvement %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\definecolor{scrmove}{rgb}{0.2902,0.4235,0.8314}
+\def\scr_blockmove{\scr_normalblock{scrmove}}
+\def\ovalmove{\scr_ovalbox{scrmove}}
+\def\ovalnum#1{% ovale blanc qui doit contenir un _nombre_
+ \begin{tikzpicture}[baseline=(x.base),x=1ex,y=1ex,minimum size=2.5ex,inner ysep=1pt,inner xsep=0.15em,outer sep=0pt]
+ \node[rounded rectangle,draw=none,fill=white,text=black](x){\vphantom{0}\let\select\selectarrownum\normalfont#1};%
+ \end{tikzpicture}%
+}
+\def\turn_arrow#1{\tikz[baseline=.25ex,x=6.5ex,y=6.5ex,#1]\draw[-{Triangle[angle=45:0.5ex 0.5ex,bend]},line width=.3333ex](0,0) arc[start angle=-80,end angle=190,radius=1ex];}
+\def\selectarrownum{% le petit triangle verss le bas à côté d'un _nombre_
+ \unskip\hskip0.125em \tikz[baseline=-1.25ex,x=1ex,y=1ex,rounded corners=0pt]\draw[fill=black!70,draw=none](0,0)--(1,0)--(0.5,-0.6)--cycle;
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% menu apparence %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\definecolor{scrlook}{rgb}{0.5412,0.3333,0.8431}
+\def\scr_blocklook{\scr_normalblock{scrlook}}
+\def\ovallook{\scr_ovalbox{scrlook}}
+\def\txtbox#1{% #1=texte dans un rectangle blanc
+ \begin{tikzpicture}[inner xsep=0.2em,inner ysep=0pt,baseline=(text.base west)]
+ \node[fill=white,text=black](text){\normalfont\sffamily\strut#1};
+ \draw[draw=white!80!black,line width=0.5pt](text.south west)--(text.north west)--(text.north east);
+ \end{tikzpicture}%
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% menu son %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\definecolor{scrsound}{rgb}{0.7333,0.2588,0.7647}
+\def\scr_blocksound{\scr_normalblock{scrsound}}
+\def\ovalsound{\scr_ovalbox{scrsound}}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% menu stylo %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\definecolor{scrpen}{rgb}{0.0549,0.6039,0.4235}
+\def\scr_blockpen{\scr_normalblock{scrpen}}
+\def\ovalpen{\scr_ovalbox{scrpen}}
+\def\squarecolor#1{% #1 est la couleur
+ \begin{tikzpicture}[x=1ex,y=1ex,baseline=.33333ex]
+ \colorlet{__tempcolor}{#1}%
+ \draw[fill=__tempcolor,draw=none](0,0) rectangle (2,2);
+ \draw[draw=__tempcolor!80!black](0,0)--(0,2)--(2,2);
+ \draw[draw=__tempcolor!80!white](0,0)--(2,0)--(2,2);
+ \end{tikzpicture}%
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% menu données %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\definecolor{scrvariable}{rgb}{0.9333,0.4902,0.0863}
+\definecolor{scrlist}{rgb}{0.8,0.3569,0.1333}
+\def\scr_blockvariable{\scr_normalblock{scrvariable}}
+\def\scr_blocklist{\scr_normalblock{scrlist}}
+\def\ovalvariable{\scr_ovalbox{scrvariable}}
+\def\ovallist{\scr_ovalbox{scrvariable}}
+\def\boollist{\scr_boolbox{scrlist}}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% menu événement %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\definecolor{screvent}{rgb}{0.7843,0.5137,0.1882}
+\def\scr_blockevent{\scr_normalblock{screvent}}
+\def\scr_blockinit{\scr_initblock{screvent}}
+\definecolor{greenflag}{rgb}{0.2471,0.5529,0.0824}
+\def\greenflag{%
+ \tikz[baseline=2pt]\draw[fill=greenflag,draw=none,scale=.4,rotate=-12]
+ (-.1,0)--(-.1,1)--(0,1)--(0,0.95)..controls(.5,1.2) and (.7,.8)..(1,1)..controls(.95,.7)..
+ (1,.4)..controls(.7,.3)and(.45,.6)..(0,.4)--(0,0)--cycle; % espace ici
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% menu contrôle %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\definecolor{scrcontrol}{rgb}{0.8824,0.6627,0.1020}
+\def\scr_blockrepeat#1#2{\scr_blockloop{#1}{#2}{}01}
+\def\scr_blockinfloop#1#2{\scr_blockloop{#1}{#2}{}11}% 1= texte #2=instructions dans la boucle
+\def\scr_blockifelse#1#2#3{\scr_blockloop{#1}{#2}{#3}00}% 1= texte #2=instructions dans la boucle
+\def\scr_blockif#1#2{\scr_blockifelse{#1}{#2}{}}
+\def\scr_blockinitclone{\scr_initblock{scrcontrol}}
+\def\scr_blockcontrol{\scr_normalblock{scrcontrol}}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% menu capteur %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\definecolor{scrsensing}{rgb}{0.1725,.6471,0.8863}
+\definecolor{scroperator}{rgb}{0.3608,0.7176,0.0706}
+\def\ovalsensing{\scr_ovalbox{scrsensing}}
+\def\scr_blocksensing{\scr_normalblock{scrsensing}}
+\def\boolsensing{\scr_boolbox{scrsensing}}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% menu opérateur %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\def\ovaloperator{\scr_ovalbox{scroperator}}
+\def\booloperator{\scr_boolbox{scroperator}}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% menu ajouter bloc %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\definecolor{scrmoreblocks}{rgb}{0.3882,0.1765,0.6}
+\definecolor{scrmoreblocksurround}{rgb}{0.5569,0.1804,0.7608}
+\definecolor{scrmoreblockcontour}{rgb}{0.5098,0.3412,0.6784}
+\definecolor{scrmoreblocksaux}{rgb}{0.3504,0.2784,0.6941}
+\def\ovalmoreblocks{\scr_ovalbox{scrmoreblocksaux}}
+\def\scr_blockmoreblocks{\scr_normalblock{scrmoreblocks}}
+\def\boolmoreblocks{\scr_boolbox{scrmoreblocksaux}}
+
+\scr_restorecatcode
+\endinput
+
+Versions :
+ _____________________________________________________________________________
+| Version | Date | Changements |
+|-----------------------------------------------------------------------------|
+| 0.1 | 16/05/2017 | Première version |
+|-----------------------------------------------------------------------------| \ No newline at end of file
diff --git a/Master/tlpkg/bin/tlpkg-ctan-check b/Master/tlpkg/bin/tlpkg-ctan-check
index 6b277c2ea46..025182365ff 100755
--- a/Master/tlpkg/bin/tlpkg-ctan-check
+++ b/Master/tlpkg/bin/tlpkg-ctan-check
@@ -540,7 +540,7 @@ my @TLP_working = qw(
sauter sauterfonts savefnmark savesym savetrees
scale scalebar scalerel scanpages
schemabloc schemata sclang-prettifier schule schulschriften schwalbe-chess
- sciposter screenplay screenplay-pkg scrjrnl scrlttr2copy scsnowman
+ sciposter scratch screenplay screenplay-pkg scrjrnl scrlttr2copy scsnowman
sdrt sduthesis
secdot section sectionbox sectsty seealso
selectp selnolig semantic semantic-markup semaphor
diff --git a/Master/tlpkg/tlpsrc/collection-pictures.tlpsrc b/Master/tlpkg/tlpsrc/collection-pictures.tlpsrc
index 9117ccf9c67..9241aeac6d0 100644
--- a/Master/tlpkg/tlpsrc/collection-pictures.tlpsrc
+++ b/Master/tlpkg/tlpsrc/collection-pictures.tlpsrc
@@ -108,6 +108,7 @@ depend rviewport
depend sa-tikz
depend schemabloc
depend scsnowman
+depend scratch
depend setdeck
depend signchart
depend smartdiagram
diff --git a/Master/tlpkg/tlpsrc/scratch.tlpsrc b/Master/tlpkg/tlpsrc/scratch.tlpsrc
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/Master/tlpkg/tlpsrc/scratch.tlpsrc