diff options
author | Karl Berry <karl@freefriends.org> | 2020-03-21 21:19:31 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2020-03-21 21:19:31 +0000 |
commit | 6d32dbc09b0aa2ebd4b09010126c58dc1c4ec09c (patch) | |
tree | 0af8098f309f8a662935a34275f2c98830555f1c /Master/texmf-dist/doc | |
parent | 2836126906a8ae46781df9e08c9eabb75228bd83 (diff) |
expose-expl3-dunkerque-2019 (21mar20)
git-svn-id: svn://tug.org/texlive/trunk@54451 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/doc')
20 files changed, 2821 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/LISEZMOI.md b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/LISEZMOI.md new file mode 100644 index 00000000000..1f182be82ae --- /dev/null +++ b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/LISEZMOI.md @@ -0,0 +1,40 @@ +<!-- Time-stamp: <2020-03-21 17:22:35 administrateur> --> +<!-- Création : 2019-09-24T11:13:44+0200 --> + +# expose-expl3-dunkerque-2019 + +Auteur: Yvon Henel, alias _Le TeXnicien de surface_ +([contact](le.texnicien.de.surface@yvon-henel.fr)) + +## LICENCE + +Le contenu de cette archive est placé sous la « LaTeX Project Public License ». +Voir http://www.ctan.org/license/lppl1.3 +pour la licence. + +© 2019-2020 Yvon Henel (Le TeXnicien de surface) + +## Description du document (dun19expl3.pdf) + +**Documentation en français** + +Article basé sur l'exposé fait lors du stage de Dunkerque 2019 +sur Expl3. + +Codes en Expl3 commentés des algorithmes de création d’une liste +d’entiers premiers ; du crible d’Ératosthène ; des suites de Kaprekar. + + +## Description de l’archive + +L’archive contient tous les fichiers nécessaires à compiler le +document au format pdf. Invoquer `make all` dans le répertoire +principal. + +## Historique + +Version 1.2 — 2020-03-21 + +Version 1.1 — 2019-09-24 + +Version 1 — 2019-08-29 diff --git a/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/Makefile b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/Makefile new file mode 100644 index 00000000000..4e4fc1fb9d0 --- /dev/null +++ b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/Makefile @@ -0,0 +1,134 @@ +# Time-stamp: <2019-08-29 11:09:56 administrateur> +# Création: 2019-08-08T10:10:07+0200 +# --------------------------------------------------------------- +# Makefile pour latexmk et la suite par Y. Henel +# +# !!! règle "zip" à revoir, fichier bib etc. pas à la bonne place +# +# --------------------------------------------------------------- +SHELL:=/bin/bash +# --------------------------------------------------------------- + +AXLRTEX:=aux,toc +PRDTTEX:=ltx +PRDTVERBATIM:=vrb +TEXLOG:=log +AXLRINDEX:=idx,ind +INDEXLOG:=ilg +AXLRHYPERREF:=out,nav +AXLRGLOSSARIES:=xdy,glo,gls +GLOSSARIESLOG:=glg +AXLRBIBLATEX:=run.xml,bbl,bcf +BIBLATEXLOG:=blg +LATEXMKAUX:=fdb_latexmk,fls +AXLR=$(AXLRTEX),$(AXLRINDEX),$(AXLRHYPERREF),$(AXLRGLOSSARIES),$(AXLRBIBLATEX),$(AUTRESAXLR) +PRDTAUX=$(PRDTTEX),$(PRDTVERBATIM) +FICHIERSLOG=$(TEXLOG),$(INDEXLOG),$(GLOSSARIESLOG),$(BIBLATEXLOG),$(AUTRESLOG) + +# --------------------------------------------------------------- + +NOM:=dun19expl3 +NOMCOMP:= $(NOM) +VERSION:=1.0 +SUJET:=expl3 + +PRES:=$(NOMCOMP) + +SOURCE:=$(PRES).tex + +SRCAUX:=$(wildcard *.tex) + +BIBLIODIR=bibliographie +BIBLIO:=$(wildcard $(BIBLIODIR)/*.bib) + +CODESDIR=codes +CODES:=$(wildcard $(CODESDIR)/*.tex) + +GLOSAIRESDIR=glosaires +GLOSAIRES:=$(wildcard $(GLOSAIRESDIR)/*.tex) + +SOURCES:= \ + Makefile\ + latexmkrc\ + $(SOURCE)\ + $(SRCAUX)\ + $(BIBLIO)\ + $(CODES)\ + $(GLOSAIRES)\ + + +PRDT:= $(subst .tex,.pdf,$(SOURCE)) + +AUTRESAXLR:=klo,kls + +AUTRESLOG:=klg + +# --------------------------------------------------------------- +# règles +# astuce avec TEXINPUT tirée du Makefile de la doc de pgf + +TEXINPUTS := ./extensions:$(TEXINPUTS) + +%.pdf: %.tex + TEXINPUTS="$(TEXINPUTS)" latexmk -pdf -bibtex $< +# --------------------------------------------------------------- + +doc: $(PRDT) +$(PRDT): $(SOURCES) +# --------------------------------------------------------------- + +.PHONY: refaire + +refaire: + TEXINPUTS="$(TEXINPUTS)" latexmk -gg -pdf -bibtex $(SOURCE) +# --------------------------------------------------------------- + +.PHONY: almostclean + +almostclean: + @rm -f *~ + @rm -f *.{$(AXLR)} +# --------------------------------------------------------------- + +.PHONY: clean + +clean: almostclean + @rm -f *.{$(PRDTAUX)} +# --------------------------------------------------------------- + +.PHONY: veryclean + +veryclean: clean + @rm -f *.{$(FICHIERSLOG),$(LATEXMKAUX)} +# --------------------------------------------------------------- + +.PHONY: distclean + +distclean: veryclean + @rm -f $(PRDT) +# --------------------------------------------------------------- + +.PHONY: prepazip + +REPERT:= ./$(NOMCOMP) + +prepazip: doc veryclean + @rm -rf $(REPERT) + @mkdir -p $(REPERT)/SRC + @mkdir -p $(REPERT)/DOC + @cp $(SOURCES) $(REPERT)/SRC + @cp $(PRDT) $(REPERT)/DOC +# --------------------------------------------------------------- + +.PHONY: zip + +zip: prepazip + @rm -f $(NOMCOMP).zip + @zip -r $(NOMCOMP) $(REPERT) + @rm -rf $(REPERT) + +# --------------------------------------------------------------- +# version allégée, avec BASH ; +# utilisation d'un fichier inclus 2019-08-08 +# --------------------------------------------------------------- + diff --git a/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/README.md b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/README.md new file mode 100644 index 00000000000..b085718cb8a --- /dev/null +++ b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/README.md @@ -0,0 +1,45 @@ +<!-- Time-stamp: <2020-03-21 17:22:24 administrateur> --> +<!-- Création : 2019-09-24T11:13:44+0200 --> + +# expose-expl3-dunkerque-2019 + +Author: Yvon Henel, aka Le TeXnicien de surface +([contact](le.texnicien.de.surface@yvon-henel.fr)) + +**Documentation in French only** + +## LICENCE + +This material is subject to the LaTeX Project Public License. +See http://www.ctan.org/license/lppl1.3 +for the details of that license. + +© 2019-2020 Yvon Henel (Le TeXnicien de surface) + +## Description of the Archive + +An article based on the presentation made in Dunkerque +for the “stage LaTeX”, 12 June 2019. + +The archive contains the pdf file and all the necessary files to +produce it. You have to invoke the Makefile with `make all` to create +the pdf file. + +## Summary of the Article + +1. I use Expl3 to solve the well known problem of creating the prime + numbers +2. I use Expl3 again to implement the Sieve of Eratosthenes +3. I finish with an Expl3 implementation of Kaprekar algorithm + +You can cast a glance at the glossary to see a list of all the +commands used in the code. + + +## History + +Version 1.2 — 2020-03-21 + +Version 1.1 — 2019-09-24 + +Version 1 — 2019-08-29 diff --git a/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/bibliographie/dun19expl3.bib b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/bibliographie/dun19expl3.bib new file mode 100644 index 00000000000..f6a803b3a8f --- /dev/null +++ b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/bibliographie/dun19expl3.bib @@ -0,0 +1,56 @@ +% Time-stamp: <2019-08-26 11:22:07 administrateur> +% Création : 2019-08-07T10:51:21+0200 + +@String{l3p = {The \LaTeX 3 Project Team}} + +@Manual{expl3progr, + author = l3p, + title = {The expl3 package and \LaTeX 3 programming}, + type = {manual}, + date = {2019-07-25}, + language = {english}, + pagetotal = 16} + +@Manual{l3interfaces, + author = l3p, + title = {The \LaTeX 3 Interfaces}, + type = {manual}, + date = {2019-07-25}, + language = {english}, + pagetotal = 299} + +@Manual{source3, + author = l3p, + title = {The \LaTeX 3 Source}, + type = {manual}, + date = {2019-07-25}, + language = {english}, + pagetotal = 1302} + +@Manual{source2e, + author = {Braams, Johannes and + Carlisle, David and + Jeffrey, Alan and + Lamport, Leslie and + Mittelbach, Frank and + Rowley, Chris and + Schöpf, Rainer}, + title = {The \LaTeXe{} Source}, + type = {manual}, + date = {2019-07-25}, + language = {english}, + pagetotal = 677} + +@Manual{xparse, + author = l3p, + title = {The \Pkg{xparse} package, Document command parser}, + date = {2019-05-28}, + language = {english}, + pagetotal = 15} + +@Book{tellechea, + author = {Tellechea,Christian}, + title = {Apprendre à programmer en \TeX}, + date = {2014-09-21}, + isbn = {978-2-9548602-0-6}} + diff --git a/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/codes/erato-def.tex b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/codes/erato-def.tex new file mode 100644 index 00000000000..26e3d94f864 --- /dev/null +++ b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/codes/erato-def.tex @@ -0,0 +1,103 @@ +% Time-stamp: <2019-08-26 11:48:16 administrateur> +% ReCréation : 2019-08-23T10:40:31+0200 +\ExplSyntaxOn + +\NewDocumentCommand{ \eratosthene } { m } { + \group_begin: + \int_new:N \l_ERA_diviseur_max_int + \int_set:Nn \l_ERA_diviseur_max_int { \fp_to_int:n { floor( sqrt ( #1 ))} } + \intarray_new:Nn \__ERA_qt_ia { #1 } + \intarray_new:Nn \__ERA_dv_ia { #1 } + % commande auxiliaire -------------------------------------------------------- + \cs_set:Nn \ERA_marquer_de_a_par:nnn { + \int_set:Nn \l_tmpa_int { ##1 / ##3} + + \int_step_inline:nnnn { ##1 } { ##3 } { ##2 } { + \int_compare:nNnT { \intarray_item:Nn \__ERA_dv_ia { ####1 } } = { 0 } + { \intarray_gset:Nnn \__ERA_dv_ia { ####1 } { ##3 } + \intarray_gset:Nnn \__ERA_qt_ia { ####1 } { \l_tmpa_int } } + \int_incr:N \l_tmpa_int } + } + % ---------------------------------------------------------------------------- + % marquer les pairs + \int_set:Nn \l_tmpa_int { 1 } + + \int_step_inline:nnnn { 2 } { 2 } { #1 } + { \intarray_gset:Nnn \__ERA_dv_ia { ##1 } { 2 } + \intarray_gset:Nnn \__ERA_qt_ia { ##1 } { \l_tmpa_int } + \int_incr:N \l_tmpa_int } + + % marquer les impairs jusqu'à racine de #1 + \int_set:Nn \l_tmpb_int { 3 } + + \int_while_do:nNnn { \l_tmpb_int } < { \l_ERA_diviseur_max_int } + { \ERA_marquer_de_a_par:nnn { \l_tmpb_int } { #1 } { \l_tmpb_int } + \int_do_until:nNnn {\intarray_item:Nn \__ERA_dv_ia { \l_tmpb_int }} = { 0 } + { \int_add:Nn \l_tmpb_int { 2 } } } + + % marquer les derniers impairs + \int_step_inline:nnnn { 3 } { 2 } { #1 } + { \int_compare:nNnT { \intarray_item:Nn \__ERA_dv_ia { ##1 } } = { 0 } + { \intarray_gset:Nnn \__ERA_dv_ia { ##1 } { ##1 } + \intarray_gset:Nnn \__ERA_qt_ia { ##1 } { 1 } } } + + % nettoyage + \cs_undefine:N \l_ERA_diviseur_max_int + \group_end: } + +%%% ----------------------------------------------------------------------- + +\cs_new:Nn \ERA_presenter_nieme:n { + \group_begin: + \int_set:Nn \l_tmpa_int { \intarray_item:Nn \__ERA_qt_ia { #1 } } + \int_set:Nn \l_tmpb_int { \int_mod:nn { #1 } { 10 } } + + \framebox[4em] {\strut \footnotesize + \int_compare:nNnTF { \l_tmpa_int } = { 1 } + {\textbf} % premier + {\textcolor{gray}} % composé + {\int_to_arabic:n { #1 }} + \int_compare:nNnT { \l_tmpa_int } > { 1 } + { \int_set:Nn \l_tmpa_int { \intarray_item:Nn \__ERA_dv_ia { #1 } } + ~\({}^{\langle \int_to_arabic:n { \l_tmpa_int } \rangle}\) } } + \kern-\fboxrule + % saut de paragraphe tous les 10 + \int_compare:nNnT { \l_tmpb_int } = { 0 } + { \par \nointerlineskip \kern-\fboxrule \noindent } + \group_end: } + +\NewDocumentCommand { \EcrireCribleEratosthene } { m }{ + \par \noindent \int_step_inline:nn { #1 } { \ERA_presenter_nieme:n {##1} } } + + +\NewDocumentCommand { \EcrireDiviseurs } { s m } { + \group_begin: + \int_new:N \l_ERA_nv_qt_int % quotient + \int_set:Nn \l_ERA_nv_qt_int { #2 } + \int_new:N \l_ERA_vx_dv_int % ancient diviseur + \int_set:Nn \l_ERA_vx_dv_int { 0 } + \int_new:N \l_ERA_nv_dv_int % nouveau diviseur + \int_set:Nn \l_ERA_nv_dv_int { \intarray_item:Nn \__ERA_dv_ia { #2 } } + + \IfBooleanF{#1}{\par} + \( \int_to_arabic:n { #2 } = + \int_while_do:nNnn { \l_ERA_nv_qt_int } > { 1 } + { \int_compare:nNnT { \l_ERA_vx_dv_int } > { 0 } { \times } + \int_to_arabic:n { \l_ERA_nv_dv_int } + \int_set:Nn \l_ERA_vx_dv_int { \l_ERA_nv_dv_int } + \int_set:Nn \l_ERA_nv_qt_int { + \intarray_item:Nn \__ERA_qt_ia { \l_ERA_nv_qt_int } } + \int_set:Nn \l_ERA_nv_dv_int { + \intarray_item:Nn \__ERA_dv_ia { \l_ERA_nv_qt_int } } } + \) + \cs_undefine:N \l_ERA_nv_qt_int + \cs_undefine:N \l_ERA_vx_dv_int + \cs_undefine:N \l_ERA_nv_dv_int + \group_end: } + +\ExplSyntaxOff + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: t +%%% End: diff --git a/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/codes/henel-def.tex b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/codes/henel-def.tex new file mode 100644 index 00000000000..0beae24a670 --- /dev/null +++ b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/codes/henel-def.tex @@ -0,0 +1,66 @@ +% Time-stamp: <2019-08-07 10:59:31 administrateur> +% Création : 2019-05-20T11:51:49+0200 +\ExplSyntaxOn + +\cs_new:Nn \__yh_ecrire_nombre:n { \(\np{\int_to_arabic:n{ #1 }}\) } + +\cs_new:Nn \yh_impair_est_premier:nT { + \bool_set_true:N \yh_continue_bool + \bool_set_true:N \yh_est_premier_bool + \int_set:Nn \l_tmpa_int {1} + % FIN INITIALISATION + \bool_do_while:Nn \yh_continue_bool { % BOUCLE `TANTQUE' + % INCRÉMENTATION + \int_add:Nn \l_tmpa_int { 2 } + \bool_if:nTF { + % TEST de divisibilité + \int_compare_p:nNn { \int_mod:nn {#1} { \l_tmpa_int } } = { 0 } + } { % SI VRAI + \bool_set_false:N \yh_continue_bool + \bool_gset_false:N \yh_est_premier_bool + } { % SI FAUX + \int_compare:nNnT { \l_tmpa_int * \l_tmpa_int } > { #1 } + { \bool_set_false:N \yh_continue_bool } + } } % FIN DU SI ET FIN DE LA BOUCLE + \bool_if:nT {\yh_est_premier_bool} {#2} } + +\cs_new:Nn \yh_ecrire_separateur:n { } + +\cs_new:Nn \yh_ecrire_si_premier:n { + \yh_impair_est_premier:nT { #1 } + { \yh_ecrire_separateur:n { #1 } + \__yh_ecrire_nombre:n { #1 } } } + +\NewDocumentCommand { \ListePremiers } { m } { + \group_begin: + % INITIALISATION + \int_new:N \l_compteur_int + \int_new:N \l_nombre_requis + \int_set:Nn \l_compteur_int { 2 } + \int_set:Nn \l_nombre_requis { #1 } + \cs_set:Nn \yh_ecrire_separateur:n { + \int_compare:nNnTF { ##1 } < { \l_nombre_requis - 1} {,~} {~et~} } + % LES DEUX PREMIERS NOMBRES PREMIERS NE SONT PAS CALCULÉS + \__yh_ecrire_nombre:n {2} + \yh_ecrire_separateur:n {1} + \__yh_ecrire_nombre:n {3} + % PRÉPARATION DE LA BOUCLE, \l_tmpb_int EST LE CANDIDAT À TESTER + \int_set:Nn \l_tmpb_int { 3 } + % BOUCLE `TANT QUE' + \int_while_do:nNnn { \l_compteur_int } < { \l_nombre_requis } { + \int_add:Nn \l_tmpb_int { 2 } + \yh_impair_est_premier:nT { \l_tmpb_int } + { \yh_ecrire_separateur:n { \l_compteur_int } + \__yh_ecrire_nombre:n{ \l_tmpb_int } + \int_incr:N \l_compteur_int } } + % ON FAIT LE MÉNAGE AVANT DE SORTIR + \cs_undefine:N \l_compteur_int + \cs_undefine:N \l_nombre_requis + \group_end: } + +\ExplSyntaxOff + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: t +%%% End: diff --git a/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/codes/kaprekar-def.tex b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/codes/kaprekar-def.tex new file mode 100644 index 00000000000..097279d8fe9 --- /dev/null +++ b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/codes/kaprekar-def.tex @@ -0,0 +1,81 @@ +% Time-stamp: <2019-08-28 11:48:38 administrateur> +% ReCréation : 2019-08-26T12:32:29+0200 +\ExplSyntaxOn +\seq_new:N \kaprun_seq +\seq_new:N \kaprekar_seq +\int_new:N \l_tmpc_int + + +\cs_new:Nn \KAP_int_to_seq:NN { + \int_set:Nn \l_tmpa_int { #1 } + \int_do_until:nNnn { \l_tmpa_int } = { 0 } + { \int_set:Nn \l_tmpb_int { \int_mod:nn { \l_tmpa_int } { 10 } } + \seq_put_left:NV #2 \l_tmpb_int + \int_set:Nn \l_tmpa_int + { \int_div_truncate:nn { \l_tmpa_int - \l_tmpb_int } { 10 } } } } + +\cs_new:Nn \KAP_seq_to_int:NN { + \seq_pop_right:NNT #1 \l_tmpa_tl + { \int_set:Nn #2 { \l_tmpa_tl } + \bool_do_until:nn { \seq_if_empty_p:N #1 } + { \seq_pop_right:NNT #1 \l_tmpa_tl + \int_set:Nn #2 { 10 * #2 + \l_tmpa_tl } } } } + +\cs_new:Nn \KAP_remplir_seq:Nn { + \int_while_do:nNnn { \seq_count:N #1 } < { #2 } + { \seq_put_left:Nn #1 { 0 } } } + +\cs_new:Nn \KAP_ranger_seq:N { + \seq_sort:Nn #1 + { \int_compare:nNnTF { ##1 } > { ##2 } + { \sort_return_swapped: } + { \sort_return_same: } } } + +\cs_new:Nn \KAP_suivant:nNN { + \KAP_int_to_seq:NN #2 \kaprun_seq + \KAP_remplir_seq:Nn \kaprun_seq { #1 } + \KAP_ranger_seq:N \kaprun_seq + + \seq_set_eq:NN \kaprdx_seq \kaprun_seq + \seq_reverse:N \kaprdx_seq + + \KAP_seq_to_int:NN \kaprdx_seq \l_tmpa_int + \KAP_seq_to_int:NN \kaprun_seq \l_tmpb_int + \int_set:Nn #3 { \l_tmpb_int - \l_tmpa_int } } + +\cs_new:Nn \KAP_ecrire_tous_les_suivants:nn { + \group_begin: + \bool_set_true:N \l_tmpa_bool + \seq_clear:N \kaprekar_seq + \int_set:Nn \l_tmpc_int { #2 } + \seq_put_right:NV \kaprekar_seq \l_tmpc_int + \KAP_suivant:nNN {#1} \l_tmpc_int \l_tmpc_int + \seq_if_in:NVT \kaprekar_seq \l_tmpc_int {\bool_set_false:N \l_tmpa_bool} + \bool_while_do:nn { \l_tmpa_bool } + { \seq_put_right:NV \kaprekar_seq \l_tmpc_int + \KAP_suivant:nNN {#1} \l_tmpc_int \l_tmpc_int + \seq_if_in:NVT \kaprekar_seq \l_tmpc_int { \bool_set_false:N \l_tmpa_bool } } + % \seq_show:N \kaprekar_seq + % \seq_use:Nnnn \kaprekar_seq {~et~} {,~} {~et~}\par{} + \int_set:Nn \l_tmpa_int { \seq_count:N \kaprekar_seq } + \seq_map_inline:Nn \kaprekar_seq + { \( \np{##1} \) + \int_decr:N \l_tmpa_int + \int_case:nnF { \l_tmpa_int } + { + { 1 } {~et~} + { 0 } { } + } + {~;~} + } + \group_end: } + +\NewDocumentCommand{\Kaprekar}{ O{4} m }{ + \KAP_ecrire_tous_les_suivants:nn { #1 } { #2 } } + +\ExplSyntaxOff +%%% Local Variables: +%%% coding: utf-8 +%%% mode: latex +%%% TeX-master: "../dun19expl3" +%%% End: diff --git a/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/codes/knuth-def.tex b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/codes/knuth-def.tex new file mode 100644 index 00000000000..34c771501e1 --- /dev/null +++ b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/codes/knuth-def.tex @@ -0,0 +1,20 @@ +\newif\ifprime \newif\ifunknown +\newcount\n \newcount\p +\newcount\d \newcount\a + +\def \primes#1{2,~3\n=#1 \advance \n by-2 \p=5 + \loop \ifnum \n>0 \printifprime \advance \p by2 \repeat} + +\def \printp{, \ifnum \n=1 and~\fi + \number \p \advance \n by -1 } + +\def \printifprime{\testprimality \ifprime\printp\fi} + +\def \testprimality{{\d=3 \global \primetrue + \loop \trialdivision \ifunknown \advance \d by2 \repeat}} + +\def \trialdivision{\a=\p \divide \a by\d + \ifnum \a>\d \unknowntrue \else \unknownfalse \fi + \multiply \a by\d \ifnum \a=\p \global \primefalse \unknownfalse \fi} + +\endinput
\ No newline at end of file diff --git a/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/dk19ecrireprem.tex b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/dk19ecrireprem.tex new file mode 100644 index 00000000000..cff913ae230 --- /dev/null +++ b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/dk19ecrireprem.tex @@ -0,0 +1,400 @@ +% Time-stamp: <2019-09-24 10:47:32 administrateur> +% Création : 2019-08-24T14:29:55+0200 +\section{Rappel} +\label{sec:rappel} + +Je commence par redonner le code de Donald E. \textsc{Knuth} mais je +laisse le lecteur rechercher l'article précité de Denis \textsc{Roegel} +pour y trouver toutes les explications nécessaires. + +\VerbatimInput[frame=lines, framesep=0.75\baselineskip, +label={\textsc{Knuth} \textemdash{} \emph{définitions}}, +labelposition=topline]{./codes/knuth-def.tex} + +L'appel |\primes{15}| permet d'obtenir +\og \primes{15}\fg. + +\section{Version avec \Expliii} +\label{sec:versionexpl3} + + +Commençons par quelques remarques: comme le code est écrit dans un +fichier \texttt{.tex} \TO et non dans un \gls{module} \TF je dois +commencer par enclencher la syntaxe propre à \Expliii{}, ce que je +fais dès la première ligne qui n'est pas un commentaire à usage +interne \TO d'où le décalage de numéro \TF dans le premier fragment +ci-dessous: +% +\Fragment{3}{5}{./codes/henel-def} + +\subsection{Une macro privée pour écrire les nombres} +\label{sec:macro+ecrire+entier} + +Sur la ligne~\(5\), on lit la définition d'une macro \emph{interne} +\CAD d'une macro qui n'a pas vocation à être appelée directement dans +un document rédigé par l'utilisateur final. On y voit déjà quelques +différences avec du code \LaTeXe{} que je vais préciser maintenant: +\begin{itemize} +\item les caractères |_| et~|:| sont promus au rang de lettres mais + par l'arobase~|@| cher aux programmeurs en~\LaTeXe{}; + +\item les espaces du code ne donneront pas d'espace dans le + document. Voilà qui soulage grandement le programmeur puisque + disparait la phase de recherche des \TdSTrad{blancs + inopportuns}{spurious blanks}. +\end{itemize} + +Autre remarque, d'ordre typographique, la présentation que j'adopte +dans ce document \TO pour des raisons de place\TF n'est pas la +présentation recommandée par l'équipe du projet \LaTeX3. On devrait +plutôt, en effet, adopter la présentation qui suit\index{présentation + du code}: +% +\begin{Verbatim}[frame=lines, framesep=0.75\baselineskip] +\cs_new:Nn \__yh_ecrire_nombre:n + { + \(\np{\int_to_arabic:n{ #1 }}\) + } +\end{Verbatim} +% +dont on m'accordera, j'espère, qu'elle occupe plus d'espace. + +La commande que je définis s'appelle +\Macro{__yh_ecrire_nombre:n}. Ce nom comporte plusieurs parties: +\begin{enumerate} + +\item les \og |__|\fg initiaux signalent que cette commande est + \emph{privée} \CAD que son usage est réservée au \gls{module} \TO + ici le simple fichier contenant le code\TF et n'est pas + nécessairement documentée. Le programmeur ne s'engage à rien sur + cette commande et un utilisateur du \gls{module} ne doit pas + s'attendre à ce que le comportement de cette commande reste stable + au fil des versions ni même à ce qu'elle soit toujours + disponible. Il ne s'agit ici que d'une \textsb{convention} car + \TeX{} est resté ce qu'il est et la gestion des espaces de noms + n'est pas implémentée\footnote{L'équipe des développeurs de + \Expliii{} nous dit, dans \autocite[p.~1]{expl3progr} que celà + pourrait se faire mais avec un surcoût prohibitif.}; + +\item \og |yh|\fg remplace ici ce qui est \TO dans un \gls{module}\TF + le nom du \gls{module} ou, à tout le moins, une chaine de caractères + réservée pour ce \gls{module}; + +\item vient le nom explicite de la commande: \og |ecrire_nombre|\fg + dans lequel le souligné~\og |_|\fg sert de séparateur de mots; + +\item suivi du caractère~\og |:|\fg qui introduit la \gls{signature} + de la commande qui est, ici, \og |n|\fg. Cela nous indique que la + commande est une \gls{fonction} \TO c'est le vocabulaire défini par le + projet \LaTeX3\TF qui attend un seul argument fourni entre + accolades. +\end{enumerate} + +La fonction \Macro{cs_new:Nn} utilise la \gls{signature} de la +commande qui suit pour déterminer le nombre et le type des arguments +que demande cette commande. Elle vérifie que la commande n'est pas +déjà définie et produit une erreur si c'est le cas. De plus, elle +définit la commande de manière globale \TO penser à \Macro{gdef} avec +les pouvoirs de \Macro{newcommand}\TF. + +Elle possède plusieurs variantes dont, \PX{}, \Macro{cs_new:cn} qui +attend comme premier argument le \emph{nom} de la commande plutôt que +la commande elle-même. J'aurais obtenu le même résultat avec: +% +\begin{Verbatim}[frame=lines, framesep=0.75\baselineskip] +\cs_new:cn { __yh_ecrire_nombre:n } { \(\np{\int_to_arabic:n{ #1 }}\) } +\end{Verbatim} +% +code que je livre compacté. + +Le 2\ieme argument de \Macro{cs_new:Nn} doit être fourni entre +accolades, c'est la définition de la commande. Ici j'utilise +\Macro{np} de l'extension \Pkg{numprint} en mode mathématique en +ligne \TO à l'aide du bien connu couple |\(| et~|\)| \TF afin +d'obtenir \og \(\np{3257}\)\fg au lieu de \og \(3257\)\fg. + +La \gls{fonction} \Macro{int_to_arabic:n} appartient au \gls{module} +\Mdl{int}, partie du noyau de \LaTeX3, qui regroupe les commandes +traitant les \glspl{entier}. Elle prend un argument dont elle fournit +la représentation en chiffres \emph{arabes}. + +\subsection{Commande vérifiant qu'un entier impair est premier} +\label{sec:macro+impair+premier} + +La commande \Macro{yh_impair_est_premier:nT} ne se déclare pas comme +privée, dans un \gls{module} elle devrait avoir une interface et une +sortie stable et être documentée car son nom ne commence pas par~|__| +mais ça aurait pu être le cas. + +\(2\) étant le seul nombre pair premier, la question de la primarité +ne se pose vraiment que pour les entiers impairs. Je pourrai donc +n'essayer que des diviseurs impairs. + +La \gls{signature} de cette \gls{fonction}, \CAD |nT|, nous indique +qu'elle attend deux arguments entre accolades, que le 1\ier sera un +test qui renverra soit~\VRAI{} soit~\FAUX{} et que, \emph{dans le seul + cas} où le test est~\VRAI{}, le code contenu dans la 2\ieme paire +d'accolades sera considéré. + +Regardons le code: +% +\Fragment{7}{25}{./codes/henel-def} + +Dans la partie d'initialisation \TO lignes~\(8\) à~\(10\)\TF, je crée +deux \glspl{booleen} \TO \Macro{yh_continue_bool} et +\Macro{yh_est_premier_bool}\TF à l'aide de la \gls{fonction} +\Macro{bool_set_true:N} qui, dans le même temps, leur donne la +valeur~\VRAI. + +Les \glspl{fonction} dont le nom contient |set| définissent les +commandes sans vérification et, à moins que le nom contienne |gset| +\TO |g| comme \og global\fg\TF, elles créent ces commandes +\emph{localement} \CAD{} dans le groupe où a lieu la définition. + +Ici, contrairement à ma devise\footnote{À savoir: \og ceinture et + bretelles\fg.}, je coure le risque que ces deux \glspl{booleen} +existent déjà, risque dont je pense qu'il est faible. On verra plus +bas ce que j'aurais pu faire pour sécuriser la définition. + +Ces deux \glspl{booleen} ne sont pas des \glspl{fonction} mais des +\glspl{variable} \CAD{} des macros \TO au sens de \TeX{}\TF dont le +seul objet est de contenir une valeur et non pas de \emph{faire} +quelque chose. C'est pour cela que leurs noms n'ont pas de +\gls{signature} et ne se termine pas par~|:| qui signalerait une +\gls{fonction} sans argument. + +Dernière étape de l'initialisation, avec \Macro{int_set:Nn} je donne +à la variable entière \textbf{l}ocale temporaire \Macro{l_tmpa_int} +la valeur~\(1\). Plusieurs \glspl{module} du noyau de \LaTeX3 +fournissent deux variables locales dont les noms comportent |tmpa| +et~|tmpb| respectivement et deux variables \textbf{g}lobales \TO avec +les noms équivalents\TF. + +Suivant la convention générale qui veut que le nom d'une +\gls{variable} se termine par son type \TO c'est le cas des deux +\glspl{booleen} que j'ai définis\TF, les variables temporaires +fournies par un \gls{module} du noyau ont une finale qui donne le type +comme \Macro{l_tmpa_int}. Cependant, contrairement à cette même +convention de nommage, les variables temporaires n'ont pas, en tête de +nom, le nom du module. On aura voulu éviter quelque chose comme +\Macro*{int_l_tmpa_int} dont on peut penser que c'est légèrement +redondant. + +En ligne~\(12\), je commence une boucle \TANTQUE avec +\Macro{bool_do_while:Nn} qui attend un premier argument constitué d'un +seul lexème \TO ici \Macro{yh_continue_bool} qui est~\VRAI à l'entrée +dans la boucle\TF et un deuxième argument entre accolades: le corps de +la boucle. + +Le corps de cette boucle commence avec l'accolade ouvrante du bout de +la ligne~\(12\) et s'achève avec la 2\ieme accolade fermante de la +ligne~\(24\). + +Je commence par ajouter~\(2\) à la valeur courante de +\Macro{l_tmpa_int} à l'aide de la \gls{fonction} \Macro{int_add:Nn}; +\Macro{l_tmpa_int} est ici le candidat diviseur. + +\Macro{bool_if:nTF} est une forme de~\SIALORSSINON: on a bien les deux +branches de l'alternative puisque la signature se termine en~|TF|. Il +s'agit de savoir si le candidat est bien un diviseur de l'entier +représenté par~|#2|. Pour ce faire, j'utilise la \gls{fonction} +\Macro{int_compare_p:nNn} dont le 2\ieme argument est un opérateur de +comparaison \CAD |>|, |<| ou~|=|. Le 3\ieme argument est +simplement~\(0\). Le premier, lui, est le reste de la division de~|#2| +par \Macro{l_tmpa_int} que l'on obtient à l'aide de la \gls{fonction} +\Macro{int_mod:nn}. + +Si le reste est nul, on exécute le code du 2\ieme argument de +\Macro{bool_if:nTF}. On positionne les deux \glspl{booleen} à~\FAUX{} +puisque |#2|, divisible par \Macro{l_tmpa_int}, n'est pas premier et +qu'il n'est donc pas nécessaire de reprendre la boucle. + +Si le reste n'est pas nul, je compare l'entier~|#2| et le carré du +candidat \TO on peut utiliser les opérateurs \emph{classiques} +d'opérations: |+|, |-|, |*|, |/| car, derrière ce code, c'est le +mécanisme de la macro \Macro{numexpr} de \hologo{eTeX} qui est à +l'œuvre\TF. Si le carré est plus grand, c'est que |#2|~est premier et +qu'il est temps de s'arrêter d'où les valeurs données aux deux +\glspl{booleen}. Le 3\ieme argument du \Macro{bool_if:nTF} s'arrête +avec la 1\iere accolade fermante de la ligne~\(24\). + +À la sortie de la boucle, si |#2| n'est pas premier il n'y a rien à +faire, s'il est premier, on le retourne. Cela est accompli à l'aide +de la \gls{fonction} \Macro{bool_if:nT} qui réalise un saut +conditionnel \SIALORS. + +\subsubsection{Compléments} +\label{sec:complementbouclesaut} + +Outre les deux \glspl{fonction} \Macro{bool_if:nTF} et +\Macro{bool_if:nT}, \Expliii fournit également la \gls{fonction} +\Macro{bool_if:nF} qui réalise un saut conditionnel \SISINON. Dans le +manuel, on verra que la signature se termine +par~\underline{\texttt{\emph{TF}}} pour signaler la présence des trois +signatures~|T|, |F| et~|TF|. + +Par ailleurs, \Expliii fournit essentiellement quatre boucles: +\begin{itemize} +\item \Macro{bool_do_while:Nn}, déjà rencontrée. C'est un \TANTQUE + dont le corps est exécuté puis le test effectué \CAD qu'en toutes + circonstances, le corps est exécuté au moins une fois; + +\item \Macro{bool_do_until:Nn}, qui inverse le sens du test. C'est un + \JUSQUA dont le corps est exécuté au moins une fois;\label{booldountilNn} + +\item \Macro{bool_while_do:Nn}, \TANTQUE qui commence par le + test. Il se peut donc que le corps ne soit pas exécuté; + +\item \Macro{bool_until_do:Nn}, \JUSQUA commençant par le + test. +\end{itemize} + +Ces quatres \glspl{fonction} ont des variantes de signatures~|cn| +et~|nn|. Avec~|cn|, le 1\ier argument est le nom d'un \gls{booleen}; +avec~|n|, c'est une expression booléenne comme \TO exemple tiré de +\autocite{l3interfaces}\TF +% +\begin{Verbatim}[frame=lines, framesep=0.75\baselineskip] +\int_compare_p:n { 1 = 1 } && + ( + \int_compare_p:n { 2 = 3 } || + \int_compare_p:n { 4 <= 4 } || + \str_if_eq_p:nn { abc } { def } + ) && +! \int_compare_p:n { 2 = 4 } +\end{Verbatim} +% +qui permet de mesurer la complexité acceptée. + +\subsection{Écrire la liste des nombres premiers} +\label{sec:ecrirelistepremiers} + +Avant d'aborder la commande destinée à l'utilisateur \TO dont je dirai +que c'est une \emph{commande de document}, comme le suggère le nom de +la macro qui permettra de la créer tout à l'heure. L'extension +\Pkg{xparse}~\autocite{xparse} parle de \English{document-level + command}\TF, je présente deux nouvelles macros utilitaires \TO +qui elles aussi auraient pu être \emph{privées}\TF à savoir +\Macro{yh_ecrire_separateur:n} et \Macro{yh_ecrire_si_premier:n}. + +\subsubsection{Deux macros utilitaires} + +\Fragment{27}{32}{./codes/henel-def} + +On voit dans le code ci-dessus, en ligne~\(27\), une pré-déclaration +de \Macro{yh_ecrire_separateur:n} qui permet juste de s'assurer que ce +nom est bien disponible. + +La macro suivante \Macro{yh_ecrire_si_premier:n} fait exactement ce +que son nom suggère. + +Passons maintenant à la commande principale. + +\subsubsection{La commande de document} +\label{sec:commandededocument} + +\Fragment{34}{59}{./codes/henel-def} + +Le code permettant de définir cette commande utilise l'extension +\Pkg{xparse}~\autocite{xparse} et sa macro \Macro{NewDocumentCommand}. + +La syntaxe de déclaration d'argument change quelque peu! Le |m|, +2\ieme argument de la macro, indique que l'on définit une commande +requérant un unique argument obligatoire fourni entre accolades \TO +|m| pour \English{mandatory} \CAD \og obligatoire\fg\TF. +% Le 1\ier argument est attendu \textsb{entre accolades} \TO pas de +% fantaisie à la \LaTeXe{}, du genre |\new|\0|com|\0|mand| +% |\truc|\dots{}, ici\TF. FAUX! +Le 1\ier argument est, comme on s'y attend, le nom de la commande +créée. + +Le corps de la définition commence en ligne~\(35\) en ouvrant un +groupe avec \Macro{group_begin:} et finit en ligne~\(59\) en fermant +le groupe avec \Macro{group_end:}. + +\paragraph{Initialisation} + +Dans le groupe, je crée en lignes~\(37\) et~\(38\) deux \glspl{entier} +locaux \TO d'où le |l| initial\TF mais qui seront créés +\emph{globalement}, car il n'y a pas moyen de faire autrement. Leur +caractère local est donc conventionnel mais signale que l'on ne doit +pas s'attendre à ce qu'ils aient une valeur pertinente à l'extérieur +du groupe. + +Pour respecter ce caractère local, je donne à ces \glspl{entier}, une +valeur avec \Macro{int_set:Nn} et pas avec \Macro{int_gset:Nn} qui, de +fait, n'est qu'un alias de la première, à moins que ce soit +l'inverse\footnote{Je ne suis pas allé vérifier dans le + source~\autocite{source3}.}. + +Afin que, en sortie de commande, ces deux \glspl{entier} ne soient +plus accessibles \TO \textsl{Vous êtes priés de laisser ces lieux dans l'état +où vous auriez aimé les trouver en entrant!} \TF, je les annihile en +lignes~\(57\) et~\(58\) à l'aide de \Macro{cs_undefine:N}. + +Il est temps à présent de définir, localement, avec \Macro{cs_set:Nn}, +la fonction \Macro{yh_ecrire_separateur:n}, ce que je fais en +ligne~\(41\) et~\(42\). Comme la définition est faite dans une +définition, on doit, bien entendu, recourir au doublement des +\emph{dièses} d'où le |##1| dans le code de cette fonction. + +Dans les 1\ier et 3\ieme arguments de \Macro{int_compare:nNnTF} on +peut écrire \emph{naturellement} des opérations sur les entiers. Je ne +m'en prive pas. + +Les tildes~|~| que l'on voit apparaitre en ligne~\(42\) permettent de +coder un espace qui apparaitra dans le document final. Par contre, il +faut utiliser autre chose pour coder un espace insécable \TO la +solution est la macro \Macro{nobreakspace}\TF. + +Je suis obligé de regarder si le séparateur est le dernier car, en +français\footnote{Encore que, si j'ai bien compris un article récent + paru dans la presse britanique, même à Oxford on a fini par + renoncer à la virgule devant le \emph{and} précédant le dernier mot + d'une énumération. \textsl{Tout fout l'camp, ma bonne dame!}} il ne +doit pas y avoir de virgule devant le \emph{et}. + +Comme l'annonce la ligne~\(43\) je ne calcule pas les deux premiers +nombres premiers \TO Donald \textsc{Knuth} ne le faisait pas\TF et je +ne vérifie pas que l'utilisateur demande au moins trois nombres \TO +même remarque\TF; pour faire comme dans les livres sérieux, je laisse +cette amélioration comme exercice pour le lecteur. + +Je prépare maintenant la boucle en initialisant, localement, le +\emph{candidat premier} à~\(3\). On a déjà vu \Macro{int_set:Nn}. +Et je rentre dans la boucle en ligne~\(50\) pour en sortir en +ligne~\(55\). La seule nouveauté de ce fragment de code est l'emploi +de \Macro{int_incr:N} qui permet d'incrémenter localement le compteur +\Macro{l_compteur_int}. + +J'ai déjà expliqué ci-dessus l'utilité des lignes~\(57\) à~\(59\). + +\subsection{Utilisation de la commande de document} +\label{sec:utilisation} + +Il me reste à utiliser cette commande dans ce document: +|\ListePremiers{15}| produit \og \ListePremiers{15}\fg. + +Au passage, on notera avec satisfaction que |\primes| et +|\ListePremiers| sont d'accord quant aux quinze premiers nombres +premiers. C'est rassurant. + +\subsection{Quelques commentaires subjectifs} +\label{sec:commentairessubjectifs} + +J'accorde sans peine qu'avec \Expliii le code est plus verbeux qu'avec +\TeX{} tout seul. Je ne peux, cependant, m'empêcher de penser qu'il +est plus clair. Pour ma part, le gain énorme que je vois en passant +cette fois de \LaTeXe{} à \Expliii{} c'est le systématisme du nommage +des macros, \glspl{fonction} ou \glspl{variable}. L'équipe du projet +\LaTeX3 en fait d'ailleurs, elle-même, un ``\emph{argument de + vente}''. + +La puissance de \Macro{NewDocumentCommand} \TO que l'on a à peine +effleuré ci-dessus\TF, à elle seule, peut inciter à passer à +\Expliii{} pour créer ses propres macros. + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "dun19expl3" +%%% End: diff --git a/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/dk19eratosthene.tex b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/dk19eratosthene.tex new file mode 100644 index 00000000000..269efbcb462 --- /dev/null +++ b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/dk19eratosthene.tex @@ -0,0 +1,234 @@ +% Time-stamp: <2019-09-24 10:45:10 administrateur> +% Création : 2019-08-24T14:40:52+0200 + +Il s'agit maintenant de fournir quelques commandes de document permettant de +créer un exemple du crible d'Eratosthène comme ceci: +\begin{center}\label{lecrible100} + \eratosthene{100} + \EcrireCribleEratosthene{100} +\end{center} + +Ce sera l'occasion d'évoquer un des \og objets de haut niveau\fg +fourni par \Expliii. Non, je ne parle pas de programmation objet! + +Une fois encore, je place le code dans un ``bête'' +fichier~\texttt{.tex} d'où les bien connus désormais +\Macro{ExplSyntaxOn} et \Macro{ExplSyntaxOff} en début et fin de +fichier. + +\section{Buts et algorithmes} +\label{sec:butsalgo} + +L'objet dont il est question est appelé \English{intarray}. Il est +global et, une fois créé, ne peut être détruit\footnote{C'est du moins + ce que je comprends à la lecture \TO que j'ai voulu rapide\TF du + source. En tout cas \Expliii ne fournit pas d'outil pour ce + faire.}. Dans certains langages on parle de \emph{vecteurs} mais il +s'agit ici d'un vecteur d'\glspl{entier} (relatifs) et d'entiers +seulement. Sa taille doit être donnée à la création et ne peut pas +être changée. + +Avec la commande \Macro{eratosthene}, on crée deux \emph{vecteurs + d'entiers}. Le premier, \Macro{__ERA_dv_ia}, contient en \(n\)\ieme +place le plus petit diviseur premier de~\(n\). Le second, +\Macro{__ERA_qt_ia}, contient en \(n\)\ieme place le quotient de~\(n\) +et de ce diviseur premier dont je viens de parler. + +La commande \Macro{eratosthene} ne prend qu'un argument, un entier +naturel, qui est la taille des deux vecteurs sus-définis. + +Une fois les vecteurs créés, on pourra les utiliser pour écrire le +crible d'Eratosthène comme vu précédemment ou, pour donner un autre +exemple, obtenir la décomposition d'un entier comme produit de ses +diviseurs premiers. + +\section{Création des vecteurs} +\label{sec:creationvecteurs} + +\Fragment[commande \texttt{eratosthene}, +initialisation]{5}{10}{./codes/erato-def} + +En \Ligne{6} j'ouvre un groupe avec \Macro{group_begin+} qui sera +fermé juste avant l'accolade fermante marquant la fin de la définition +de \Macro{eratosthene} en \Ligne{45}. + +Dans ce groupe je vais créer un \emph{entier} avec +\Macro{int_new+N}. Il est créé globalement mais je le détruis en +\Ligne{44} avec \Macro{cs_undefine+N}. Il ne survivra donc pas à la +macro. + +Je crée également les deux vecteurs en lignes~\(9\) et~\(10\) à l'aide +de \Macro{intarray_new+Nn} qui prend en 2\ieme argument la taille du +vecteur qui est l'argument passé à \Macro{eratosthene}. Initialement +ces vecteurs ne contiennent que des zéros. + +Les noms des vecteurs devraient se terminer par \texttt{_intarray} +mais je me suis permis un raccourci en \texttt{_ia}. Leurs noms +commencent avec le double souligné puisque ce sont des +\glspl{variable} \emph{privées}. \texttt{ERA} est le sigle de ce +pseudo-module. + +En \Ligne{8} je donne à la \gls{variable} +\Macro{l_ERA_diviseur_max_int} la partie entière de la racine carrée +de la taille des vecteurs \TO valeur donnée par~|#1|\TF en +\emph{transtypant} le résultat de l'opération |floor(| |sqrt (| |#1| +|))| qui est un \gls{flottant} en un \gls{entier}. + +\subsection{Une commande auxiliaire} + +Je crée maintenant, à l'intérieur de la définition de +\Macro{eratosthene} la commande \Macro{ERA_marquer_de_a_par+nnn} que, +de fait, je n'utiliserai qu'une fois, en \Ligne{33}, et dont, par +conséquent, j'aurais pu faire l'économie, au risque d'embrouiller +considérablement le code suivant. + +\Fragment[commande \texttt{eratosthene}, +auxiliaire]{12}{20}{./codes/erato-def} + +Je crée cette commande localement grâce à \Macro{cs_set+Nn}, elle ne +survivra donc pas au groupe. Je commence, dans la définition de +\Macro{ERA_marquer_de_a_par+nnn}, par donner comme valeur à la +\gls{variable} \emph{locale} \Macro{l_tmpa_int} le quotient entier des +1\ier et 3\ieme arguments de la commande. + +Puis, lignes~\(15\) à~\(19\), j'utilise \Macro{int_step_inline+nnnn} +pour accomplir le travail. C'est une boucle \POUR. L'index \TO +implicite et anonyme\TF parcourt les entiers en partant du premier +argument de cette dernière macro jusqu'au troisième argument avec un +pas donné par le deuxième. Le 4\ieme argument est le code \emph{en + ligne} dans lequel |#1| est l'indice de la boucle. Enfin, |#1| +serait l'indice de la boucle si on utilisait directement la macro +\Macro{int_step_inline+nnnn} au niveau du document. Ici comme je +l'utilise dans une définition incluse elle-même dans une définition, +je dois doubler les dièses deux fois d'où le |####1| que l'on voit +dans le code. + +En \Ligne{19}, j'incrémente \Macro{l_tmpa_int}. De la \Ligne{16} à la +\Ligne{18}, j'ai un test \SIALORS avec \Macro{int_compare+nNnT}: +les actions des lignes~\(17\) et~\(18\) ne seront accomplies que s'il +est vrai que la |####1|-ième composante du vecteur \Macro{__ERA_dv_ia} +est nulle \CAD que ce nombre n'a pas encore été traité. Dans ce cas, +je place la valeur du pas~|##3| \TO c'est le plus petit diviseur +premier du nombre considéré\TF à la bonne place dans le vecteur des +diviseurs et je place le quotient à la place idoine dans le vecteur +des quotients. L'incrémentation faite en-dessous me dispense de +calculer ce quotient à l'aide d'une division entière. + +Comme le nom l'indique la macro \Macro{intarray_gset+Nnn} réalise une +affectation \textbf{g}lobale dans le vecteur donné en 1\ier argument. C'est +bien ce que je veux. Le 2\ieme argument donne l'indice, le 3\ieme la +valeur à y placer. + +\subsection{Traitement des entiers pairs} +\label{sec:lespairs} + +Je retourne maintenant au niveau de la définition de la commande +\Macro{eratosthene} et je commence par traiter les nombres pairs. + +\Fragment[commande \texttt{eratosthene}, +nombres pairs]{23}{28}{./codes/erato-def} + +À ce moment de l'action, les deux vecteurs ne contiennent que des +zéros, cela nous dispense du test tel qu'il apparaît dans la macro +auxiliaire vue ci-dessus. De plus, le premier quotient (\(2/2\)) est +clairement~\(1\) d'où la \Ligne{23}. + +On retrouve ensuite \Macro{int_step_inline+nnnn} pour traiter les +nombres pairs en partant de~\(2\), avec un pas de~\(2\), et en +finissant à la taille des vecteurs~|#1|. + +\subsection{Traitement des entiers impairs} +\label{sec:lesimpairs} + +Le traitement des entiers impairs se fera en deux étapes, la deuxième +étant d'une simplicité déconcertante. + +\Fragment[commande \texttt{eratosthene}, +impairs]{31}{36}{./codes/erato-def} + +Nous avons déjà vu tout ce que j'utilise ici. On notera, lignes~\(35\) +et~\(36\), la boucle permettant, en avançant de~\(2\) en~\(2\), de +trouver le prochain nombre impair non traité avec +\Macro{int_do_until+nNnn} analogue, pour réaliser une boucle sur les +entiers, de \Macro{bool_do_until+Nn} présentée page~\pageref{booldountilNn}. + +La dernière boucle traite les nombres impairs qui n'ont pas encore été +vus. On pourrait améliorer la chose en commençant avec le premier +impair non-vu, une fois encore je laisse ça en exercice! + +\Fragment[commande \texttt{eratosthene}]{39}{42}{./codes/erato-def} + +\section{Deux exemples d'utilisation} +\label{sec:utilisationcrible} + +Les deux vecteurs ayant été créés, on peut les utiliser. Je donne deux +exemples: l'écriture du \og crible\fg, l'écriture d'un nombre comme +produit de ses facteurs premiers \TO version améliorable\TF. + +\subsection{Écriture du crible} +\label{sec:ecriturecrible} + +Je présente maintenant la commande permettant de créer le tableau +présenté en page~\pageref{lecrible100}. + +\Fragment[écriture du crible, commande de +document]{69}{70}{./codes/erato-def} + +L'unique argument de \Macro{EcrireCribleEratosthene} doit être un +entier positif plus petit que la taille des deux vecteurs créés +auparavant sinon on aura une erreur d'accès aux vecteurs dû à un +indice hors bornes. + +Bien entendu, cette commande se contente de refiler le boulot à la +commande interne \Macro{ERA_presenter_nieme+n} par l'intermédiaire de +la boucle \Macro{int_step_inline+nn}. + +Soulevons le capot. + +\Fragment[écriture du crible, commande interne]{50}{67}{./codes/erato-def} + +Pour la création du tableau, je copie servilement le code que fourni +Christian \textsc{Tellechea} dans~\autocite{tellechea}. J'utilise +quand même la macro \Macro{framebox} fournie par \LaTeXe{} car +personne n'est obligé de réinventer la roue chaque matin! + +\subsection{Décomposition d'un nombre en facteurs premiers} +\label{sec:facteurspremiers} + +Regardons à présent la commande permettant d'obtenir: +\EcrireDiviseurs{78} \qquad \EcrireDiviseurs*{75} \qquad +\EcrireDiviseurs*{64} +\par\noindent +avec le code +\par\noindent +|\EcrireDiviseurs{78}| |\qquad| |\EcrireDiviseurs*{75}| |\qquad| |\EcrireDiviseurs*{64}|. + +Voici le code: +\Fragment[facteurs premiers]{73}{96}{./codes/erato-def} + +Comme on l'aura remarqué, la commande \Macro{EcrireDiviseurs} admet +une variante étoilée. On l'obtient facilement avec +\Macro{NewDocumentCommand} en donnant comme descriptif de 1\ier +argument le~|s| que l'on voit en \Ligne{73}. + +Avec \Macro{IfBooleanF} de la \Ligne{82}, on ne place un saut de +paragraphe \TO avec \Macro{par}\TF que s'il n'y a \textsb{pas} +d'étoile. + +Pour réagir à la présence ou l'absence d'un lexème \TO une étoile~|*| +avec le descripteur d'argument~|s|, n'importe quel lexème avec~|t| \TF +on dispose également de \Macro{IfBooleanT} et de \Macro{IfBooleanTF}. + +On retrouve les mêmes techniques de création d'\glspl{entier} dans un +groupe et leur destruction en sortie du corps de la définition de la +commande. J'évite les entiers de brouillon fournis par \Expliii{} car +je préfère, pour ne pas me perdre, des noms plus explicites. De toute +façon, j'ai besoin d'au moins trois entiers locaux. On devrait pouvoir +écrire la décomposition de \(75\) sous la forme \(75=3\times5^{2}\) à +l'aide d'un \gls{entier} supplémentaire. Là encore, l'exercice etc. + + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "dun19expl3" +%%% End: diff --git a/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/dk19intro.tex b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/dk19intro.tex new file mode 100644 index 00000000000..c9f84b41b55 --- /dev/null +++ b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/dk19intro.tex @@ -0,0 +1,25 @@ +% Time-stamp: <2020-03-21 12:02:52 administrateur> +% Création : 2019-08-24T14:27:10+0200 +\section{Introduction} +\label{sec:introduction} + +À l'occasion du stage de Dunkerque 2019, j'ai eu envie, pour présenter +\Expliii{}, de revenir sur un code donné par \textsc{Knuth} dans le +\TeX book et que Denis \textsc{Roegel} avait décortiqué dans +l'article \og Anatomie d’une macro\fg paru dans les \emph{Cahiers + Gutenberg}, \no 31 (1998), p. 19-28. + +Cette macro, bien évidemment écrite en \TeX{}, calcule les +\(n\)~nombres premiers pour \(n\)~entier supérieur à~\(3\). + +J'ai décidé de réécrire une macro produisant le même résultat à l'aide +de \Expliii{} pour utiliser le code comme base de mon exposé. Une fois +lancé, j'ai écrit d'autres petits morceaux de code pour présenter +quelques fonctionalités du langage que le premier exemple ne m'avait +pas permis d'exposer. C'est tout cela que je vais présenter dans ce +qui suit. + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "dun19expl3" +%%% End: diff --git a/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/dk19kaprekar.tex b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/dk19kaprekar.tex new file mode 100644 index 00000000000..ad374490a4e --- /dev/null +++ b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/dk19kaprekar.tex @@ -0,0 +1,244 @@ +% Time-stamp: <2019-09-22 16:32:18 administrateur> +% Création : 2019-08-26T12:37:33+0200 + +\section{Suites de \textsc{Kaprekar}} +\label{sec:suiteskaprekar} + +Une suite de \textsc{Kaprekar} est définie par la donnée d'un nombre +entier, p.~ex. \(125\), d'une base \TO je prendrai systématiquement et +uniquement~\(10\) comme base de l'écriture des nombres entiers\TF et +d'un nombre~\(N\) de chiffres que j'appellerai la \emph{taille} du +nombre. On obtient un terme~\(u\sb{n+1}\) à partir du terme +précédent~\(u\sb{n}\) en appliquant l'algorithme suivant: +\begin{enumerate}\label{algokap} +\item on écrit \(u\sb{n}\) avec \(N\) chiffres dans la base choisie + quitte à compléter avec des zéros; +\item on range les \(N\) chiffres ainsi obtenus dans l'ordre + décroissant pour obtenir \(v\sb{n}\); +\item on range les \(N\) chiffres dans l'ordre croissant pour obtenir + \(w\sb{n}\); +\item enfin, \(u\sb{n+1} = v\sb{n} - w\sb{n}\). +\end{enumerate} + +Une telle suite est évidemment finie. La commande que nous allons +détailler s'arrête sur le dernier nombre déjà obtenu. + +En voici deux exemples. + +On obtient \og \Kaprekar{125}\fg avec |\Kaprekar{125}| qui, par +défaut, travaille avec \(N=4\), et \og \Kaprekar[6]{125}\fg pour +lequel on a pris \(N=6\). + +L'objet qui va nous servir à créer ces suites est la \gls{sequence} +\TO dont le sigle est \texttt{seq} \TF que fournit l'extension +\Pkg{l3seq}. + + +\section{Le code} +\label{sec:kaprekarcode} + +Je rappelle que tout le code est placé entre \Macro{ExplSyntaxOn} +et \Macro{ExplSyntaxOff} pour les raisons déjà exposées. + +La commande de document est \Macro{Kaprekar} dont voici le code. + +\Fragment[Kaprekar, commande de +document]{73}{74}{./codes/kaprekar-def} + +On y retrouve l'habituelle \Macro{NewDocumentCommand} mais un nouveau +descripteur d'argument, à savoir |O{4}|: le premier argument est +optionnel et sa valeur par défaut est~\(4\). Si on veut en fournir une +autre, on le placera entre crochet comme d'habitude. + +La commande n'est, de fait et à part le truc de l'argument optionnel, +qu'un alias de \Macro{KAP_ecrire_tous_les_suivants+nn} que je vais +maintenant détailler. Mais commençons par la phase d'initialisation. + +\subsection{Initialisation} +\label{sec:kaprinit} + +\Fragment[Kaprekar, initialisation]{4}{6}{./codes/kaprekar-def} + +Avec \Macro{seq_new+N} je crée deux \glspl{sequence}: \Macro{kaprun_seq} +et \Macro{kaprekar_seq}. La première \gls{variable} a vocation à +recevoir la suite des chiffres du nombre traité. La seconde contiendra +la suite de \textsc{Kaprekar}. + +Je crée ensuite un \gls{entier} \emph{local} en suivant le modèle +de l'extension \Pkg{int}. + +\subsection{De l'entier à la suite et retour} +\label{sec:entiersuiteretour} + +J'ai besoin de commandes internes \TO qui pourraient être privées\TF +pour \emph{découper} un entier en la suite de ses chiffres et pour +créer un entier à partir d'une suite de chiffres. Le fait de +travailler en base fixée \TO et en base~\(10\) qui plus est\TF +facilite largement le travail. Là encore, si le cœur vous en dit, +exercice! + +\Fragment[Kaprekar, de l'entier à la +suite]{9}{15}{./codes/kaprekar-def} + +Le premier argument de \Macro{KAP_int_to_seq+NN} est le nombre à +découper, le second la suite qui contiendra ses chiffres. Dans les +deux cas, la commande attend une \gls{variable}. + +Nous avons déjà rencontré la majorité des commandes utilisées dans la +définition. Avec \Macro{seq_put_left+NV} je place en première place +\TO à gauche \InEnglish{left}\TF la valeur contenue dans la +\gls{variable} \Macro{l_tmpb_int}. Le~|V| dans la signature assure que +la commande \Macro{l_tmpb_int} sera traitée de telle sorte que l'on +récupère bien son contenu. + +Dans la boucle, on trouve \Macro{int_div_truncate+nn} qui permet de +récupérer le quotient entier de~|#1| par~|#2|. + +\medbreak + +\Fragment[Kaprekar, de la suite à +l'entier]{17}{22}{./codes/kaprekar-def} + +Cette commande transforme une suite de chiffres en un \gls{entier}. On +trouve, en~\Ligne{18}, la commande \Macro{seq_pop_right+NNT} qui +prend la valeur la plus à droite dans la suite passée en 1\ier +argument pour la placer dans la \gls{variable} donnée en 2\ieme +argument. Si cette opération est possible \TO \CAD si la pile n'était +pas vide\TF le 3\ieme argument est développé. + +La suite, après cette opération, est amputée de sa dernière +valeur. J'utilise ici la suite comme une pile \TO c'est le fameux +\textsc{lifo} pour \English{Last In First Out} \TF. \Expliii{} fournit +aussi des commandes qui permettent d'utiliser la suite comme une queue +\TO \textsc{fifo} pour \English{First In First Out}\TF. + +Dans la boucle, j'utilise \Macro{seq_if_empty_p+N} qui prend la valeur +\VRAI{} si la \gls{sequence} est vide. Tant qu'elle n'est pas vide, je +multiplie par~\(10\) la valeur conservée dans la \gls{variable} donnée +en~|#2| et j'y ajoute la dernière valeur extraite de la pile. + +De fait, le chiffre le plus à droite est celui de \emph{poids} le plus +grand. + +\medbreak + +\Fragment[Kaprekar, remplissage]{24}{26}{./codes/kaprekar-def} + +Cette commande assure que la suite contient le bon nombre de chiffres +en ajoutant des zéros si nécessaire. La seule nouveauté est +\Macro{seq_count+N} qui donne le nombre de valeurs contenues dans la +suite. + +\medbreak + +\Fragment[Kaprekar, tri]{28}{32}{./codes/kaprekar-def} + +\Macro{seq_sort+Nn} trie la \gls{sequence} donnée \TO par son \og +nom\fg\TF en 1\ier argument à l'aide du code donnée en 2\ieme +argument. Ici, j'échange |##1| et |##2| si le premier est strictement +supérieur au second, autrement dit, je trie les éléments de la suite du +plus petit au plus grand. Les commandes \Macro{sort_return_swapped+} +\TO retourner en échangeant\TF et \Macro{sort_return_same+} \TO +retourner le même\TF assurent le tri. + +\medbreak + +\Fragment[Kaprekar, calcul du terme +suivant]{34}{44}{./codes/kaprekar-def} + +Le terme courant est donné par une \gls{variable} comme 2\ieme +argument, le 1\ier est la taille, le 3\ieme doit être la +\gls{variable} qui recevra le terme suivant. + +\Macro{kaprun_seq} prend en~\Ligne{35} les chiffres du terme courant +puis on remplit puis on range dans l'ordre croissant. + +Avec \Macro{seq_set_eq:NN}, en~\Ligne{39}, on crée, localement et sans +contrôle, \Macro{kaprdx_seq} comme copie de \Macro{kaprun_seq} puis, +en ligne suivante, on la range dans l'ordre décroissant. + +Les trois dernières lignes traduisent l'algorithme de \textsc{Kaprekar} +tel qu'exposé en~\pageref{algokap}. + +Il ne reste plus qu'à utiliser tout cela. + +\subsection{Commande interne} + +\Fragment[Kaprekar, commande interne]{46}{71}{./codes/kaprekar-def} + +La commande \Macro{KAP_ecrire_tous_les_suivants+nn} prend la valeur +de~\(N\) \TO la \emph{taille}\TF en premier argument et le premier +terme de la suite comme 2\ieme argument. + +Une fois de plus, tout se passe dans un groupe, ouvert en~\Ligne{47} +et fermé en~\Ligne{71}. + +J'utilise la \gls{variable} booléenne locale \Macro{l_tmpa_bool} +fournie par \Expliii{}. Je lui donne la valeur \VRAI{} +en~\Ligne{48}. Quand elle prendra la valeur \FAUX{} il sera temps de +sortir de la boucle \TO lignes~\(54\) à~\(57\)\TF qui remplit la +\gls{sequence} \Macro{kaprekar_seq}. + +Avec \Macro{seq_clear+N}, en~\Ligne{49}, je vide la suite +\Macro{kaprekar_seq}. + +En \Ligne{51} je place le 1\ier terme de la suite dans la +\gls{sequence} \Macro{kaprekar_seq}. Cette fois je remplis par la +droite avec \Macro{seq_put_right+NV} \TO j'utilise la suite comme une +\emph{queue}\TF. + +C'est parce que j'ai besoin que cette valeur soit placée dans la +\gls{variable} \Macro{l_tmpc_int} que j'utilise +\Macro{seq_put_right+NV}. S'il suffisait de placer la valeur +directement dans la suite, on pourrait utiliser +\Macro{seq_put_right+Nn} avec le code +\vspace{-\baselineskip} +\begin{Verbatim}[frame=lines,framesep=0.75\baselineskip] +\seq_put_right:Nn \kaprekar_seq {#2} +\end{Verbatim} + +Je place dans \Macro{l_tmpc_int} le terme suivant calculé avec +\Macro{KAP_suivant+nNN} en~\Ligne{52} et si ce terme est déjà présent +dans la suite \TO cas ou \(u\sb{1} = u\sb{0}\)\TF je donne à +\Macro{l_tmpa_bool} la valeur \FAUX. C'est \Macro{seq_if_in+NVT} qui +permet de vérifier que la valeur~|#2| est présente dans la suite~|#1| +et de développer, si besoin le code placé dans~|#3|. + +À la fin de la \Ligne{57} la suite a été créée. + +J'ai laissé, commentée, la \Ligne{58} que j'ai utilisée à titre de +diagnostic: la commande \Macro{seq_show+N} permet d'écrire le +contenu de la \gls{sequence} dans le fichier~|.log|. + +À la ligne suivante, la commande \Macro{seq_use+Nnnn} permet d'écrire +le contenu de la \gls{sequence}, donnée en 1\ier argument. Les trois +arguments suivants donnent, dans l'ordre, le séparateur du premier et +deuxième élément quand il n'y a que deux éléments; ce qui précède +chaque élément, sauf le dernier, quand il y plus de deux éléments; +enfin, ce qui sépare l'avant-dernier du dernier élément. Comme je veux +que les nombres soient écrits à l'aide de \Macro{np} je ne peux pas me +contenter de cette ligne d'où ce qui suit. + +Après avoir placé dans un compteur le nombre d'éléments de la suite, +j'utilise \Macro{seq_map_inline+Nn} pour appliquer à chaque élément de +la suite passée en 1\ier argument le code contenu dans le 2\ieme +argument \TO \Ligne{62} à~\(70\)\TF. + +Dans ce code, j'écris l'élément en en donnant la valeur à \Macro{np} +en mode mathématique en ligne puis je décrémente le compteur à l'aide +de \Macro{int_decr+N}. + +Avec \Macro{int_case+nnF}, je sélectionne le séparateur à placer: si +le compteur vaut~\(1\) j'écris \og |~et~|\fg, s'il vaut~\(0\), je n'écris +rien \TO \Ligne{67}\TF et, dans tous les autres cas \TO \Ligne{69}\TF, +j'écris \og |~;~|\fg. + +% \subsection{\texorpdfstring{\Kaprekar[2]{12}}{kaprekar 2-12}} + +% \Fragment[Kaprekar]{4}{45}{./codes/kaprekar-def} + + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "dun19expl3" +%%% End: diff --git a/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/dun19expl3.pdf b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/dun19expl3.pdf Binary files differnew file mode 100644 index 00000000000..f8e8f8d91fb --- /dev/null +++ b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/dun19expl3.pdf diff --git a/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/dun19expl3.tex b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/dun19expl3.tex new file mode 100644 index 00000000000..1a81dda9072 --- /dev/null +++ b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/dun19expl3.tex @@ -0,0 +1,152 @@ +% Time-stamp: <2020-03-21 18:06:46 administrateur> +% Création : 2019-08-04T17:42:03+0200 + +\documentclass[french]{article} +\usepackage[T1]{fontenc} +\usepackage[a4paper]{geometry} +\usepackage{xspace} +\usepackage{array} +\usepackage{csquotes} +\usepackage[expert,oldstyle]{fourier} +\usepackage[CharPoCal=false,suite=false,taupe=false]{tdsfrmath} + +\usepackage{fancybox} +\usepackage{etaremune} + +\usepackage{fvextra} +\usepackage{xparse} +\usepackage{dun19codepres} + +\usepackage[xindy]{imakeidx} +\makeindex + +\usepackage[main=french]{babel} +\usepackage[np,autolanguage]{numprint} + +\usepackage[hidelinks]{hyperref} % options à définir ! + +\usepackage[backend=biber]{biblatex} +\addbibresource{./bibliographie/dun19expl3.bib} + +\usepackage[xindy,nogroupskip]{glossaries-extra} +\newglossary[klg]{cs}{kls}{klo}{Commandes, fonctions et variables} +\makeglossaries + +\loadglsentries{./glosaires/termes-techniques} +\loadglsentries{./glosaires/les-macros} +\loadglsentries{./glosaires/erato-supp-glo} +\loadglsentries{./glosaires/kaprekar-sup-glo} + +\title{% + Quelques aspects de la programmation avec + \Expliii{}\footnote{Version 1.2}} +\author{Yvon \textsc{Henel}} + +\begin{document} +\input{./codes/knuth-def} +\input{./codes/henel-def} +\input{./codes/erato-def} +\input{./codes/kaprekar-def} + +\makeunderlineletter +\DefineShortVerb{\|} +\maketitle{} + +\begin{abstract} + Quelques aspects de la programmation avec \Expliii{} présentés au + travers de code calculant sur les entiers: écriture des \(n\) + premiers entiers premiers; crible d'\textsc{Ératosthène}; suites de + \textsc{Kaprekar}. +\end{abstract} + +\vspace{4\baselineskip} + +\begin{center} + \shadowbox{% + \begin{minipage}{0.8\linewidth} + \centering \large \textbf{Remerciements}\par + + \vspace{\baselineskip} + + \normalsize + Je remercie François \textsc{Pantigny} pour sa lecture attentive + de la version~1. + + \vspace*{\baselineskip} + \end{minipage}} +\end{center} + + +\newpage{} + +\tableofcontents{} + +\newpage{} + +\input{dk19intro} + +\part{Écrire les premiers nombres premiers} +\label{part:premierspremiers} + +\input{dk19ecrireprem} + +\part{Le crible d'Eratosthène} +\label{part:cribleerato} + +\input{dk19eratosthene} + +\part{Les suites de Kaprekar} +\label{part:kaprekar} + +\input{dk19kaprekar} + +\newpage{} + +\part{Annexes} +\label{part:annexes} + +\printbibliography{} + +\printindex{} + +\printglossaries + +\newpage{} + +\section*{Remarques sur le document et historique des corrections} +\label{sec:historique} + +\subsection*{Remarques} +\label{sec:remarques} + +Je tente \TO comme chacun sait il y a souvent loin de la coupe aux +lèvres\TF de respecter l'orthographe dite \emph{nouvelle}. On ne verra +donc plus d'accent circonflexe sur certains i! Il m'arrive, dans mon +ardeur de jeune révolutionnaire, de priver dudit accent certains o ou +autres a. On devra à quelque lectrice ou lecteur leur rétablissement. + +Je tiens à remercier, d'avance, tout ceux qui prendront la peine de me +signaler erreur, omission, impropriété, obscurité et autres +maladresses. + +\subsection*{Historique des corrections} +\label{sec:histocorr} + +\begin{etaremune} +\item + Seule une correction orthographique motive la version~\(1.2\), + première version déposée sur le CTAN. + +\item + La version~\(1.1\) intègre les corrections proposées par François + \textsc{Pantigny} \TO courriel du 21 septembre 2019\TF même si je + persiste à dépouiller les i de leurs si surannés chapeaux. +\end{etaremune} +\end{document} + +%%% Local Variables: +%%% coding: utf-8 +%%% mode: latex +%%% TeX-master: t +%%% End: + diff --git a/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/extensions/dun19codepres.sty b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/extensions/dun19codepres.sty new file mode 100644 index 00000000000..988999d60bd --- /dev/null +++ b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/extensions/dun19codepres.sty @@ -0,0 +1,321 @@ +% Time-stamp: <2019-08-28 08:02:26 administrateur> +% Création : 2019-08-05T10:18:51+0200 +%%%%% --------------------------------------------------------------------- +%%%%% © Yvon Henel, 2019 +%%%%% --------------------------------------------------------------------- +\NeedsTeXFormat{LaTeX2e}[1999/12/01] +\RequirePackage{l3keys2e,xparse} +\ProvidesExplPackage +{dun19codepres} {2019/08/05} {1} {pour article dun19expl3} + +\RequirePackage{xspace} +\RequirePackage{hologo} +\RequirePackage[dvipsnames]{xcolor} + +%%%%% --------------------------------------------------------------------- +%%%%% outils +%%%%% --------------------------------------------------------------------- + +\def\makeunderlineletter{\catcode`\_=11\relax} + +\makeatletter + +\newcommand\TdSfrCP@CODE{\texttt} + +\let\CODE=\TdSfrCP@CODE + +\newcommand\TdSfrCP@ENCODE{\ttfamily} + +\newcommand\TdSfrCP@PRESENTATIONMETA{\TdSfrCP@ENCODE\itshape} + +\DeclareRobustCommand\0{\discretionary{}{}{}} + +\DeclareRobustCommand\1{\0\TdSfrCP@CODE{\_}\0} + +\DeclareRobustCommand\2{\TdSfrCP@CODE{:}\0} + +\DeclareRobustCommand\3{\discretionary{.}{}{.}} + +\DeclareRobustCommand\6{\0\TdSfrCP@CODE{@}\0} + +\DeclareRobustCommand\7{\0\TdSfrCP@CODE{/}\0} + +\DeclareRobustCommand\9{% + \hspace{0pt plus 1pt}\discretionary{}{}{}\hspace{0pt plus 1pt}} + +\DeclareRobustCommand\8{\0\TdSfrCP@CODE{-}\0} + +\newcommand{\Meta}[1]{% + \ensuremath{\langle}{\TdSfrCP@PRESENTATIONMETA #1\/}\ensuremath{\rangle}} + +\let\M=\Meta + +%%%%% --------------------------------------------------------------------- +%%%%% Présentation extensions, etc. +%%%%% --------------------------------------------------------------------- + +\newcommand{\Pkg}[1]{\texttt{#1}} + +\newcommand{\Mdl}[1]{\textsf{#1}} + +\newcommand*{\Expliii}{Expl3\xspace} + +\newcommand*{\TdS}{TdS\xspace} + +%%%%% --------------------------------------------------------------------- +%%%%% Présentation macros et arguments +%%%%% --------------------------------------------------------------------- + +\DeclareRobustCommand\Cs[1]{\TdSfrCP@CODE{\char`\\#1}} + +\newcommand\Accolades[1]{\TdSfrCP@CODE{\{\0#1\}}} + +\newcommand{\Crochets}[1]{\TdSfrCP@CODE{[\0#1]}} + +\newcommand{\Parentheses}[1]{\TdSfrCP@CODE{(\0#1)}} + +\newcommand{\Inegalites}[1]{\TdSfrCP@CODE{\string<\0#1\string>}} + +\DeclareRobustCommand\MargAux[1]{\TdSfrCP@CODE{\{\0\M{#1}\}}} +\DeclareRobustCommand\OargAux[1]{\TdSfrCP@CODE{[\0\M{#1}]}} +\DeclareRobustCommand\ParargAux[1]{\TdSfrCP@CODE{(\0\M{#1})}} +\DeclareRobustCommand\INEGargAux[1]{\TdSfrCP@CODE{\string<\0\M{#1}\string>}} + +\newcounter{codefragment}[section] + +\makeatother + +% ------------------------------------------------------------------------- +% Déclaration et présentation des macros et de leurs arguments +% ------------------------------------------------------------------------- + +\str_new:N \__CMD_vedette_str + +\NewDocumentCommand{\MacroPresentation}{ m }{ + \textcolor{MidnightBlue}{\Cs{#1}} +} + +\NewDocumentCommand{\FausseMacroPresentation}{ m }{ + \textcolor{RedOrange}{\Cs{#1}} +} + +\NewDocumentCommand{\Macro}{s o v}{ + \IfBooleanTF{#1} + {\FausseMacroPresentation{#3}} + { + \str_set:Nn \__CMD_vedette_str {#3} + \str_replace_all:Nnn \__CMD_vedette_str {:} {+} + \gls{\str_use:N \__CMD_vedette_str} + } +} + + +\NewDocumentCommand{\Code}{s t+ v}{ + \IfBooleanTF{#1} + { \Crochets{#3} } + { \IfBooleanTF{#2} + { \Parentheses{#3} } + { \Accolades{#3} } + } +} + +\NewDocumentCommand{\Marg}{ s }{ + \IfBooleanTF{#1} + { \Accolades } + { \MargAux } +} + +\NewDocumentCommand{\Oarg}{ s }{ + \IfBooleanTF{#1} + { \Crochets } + { \OargAux } +} + +\NewDocumentCommand{\Parg}{ s }{ + \IfBooleanTF{#1} + { \Parentheses } + { \ParargAux } +} + +\NewDocumentCommand{\Iarg}{ s }{ + \IfBooleanTF{#1} + { \Inegalites } + { \INEGargAux } +} + +\NewDocumentCommand{\SyntaxeMacro}{ s o }{ + \IfBooleanF{#1}{\par} + \IfNoValueTF{#2} + { \SyntaxeMacro_Package_Courant } + { \SyntaxeMacro_Autre_Package {#2} } +} + +\NewDocumentCommand{\SyntaxeMacro_Package_Courant}{ m m } +{ + \Macro{#1} \TraiterListeArguments{#2} +} + +\NewDocumentCommand{\SyntaxeMacro_Autre_Package}{ m m m } +{ + \Macro[#1]{#2} \TraiterListeArguments{#3} +} + +\NewDocumentCommand {\TraiterListeArguments} +{ > { \SplitList{ , } } m } { + \ProcessList {#1} { \Traiter_un_argument } +} + +\NewDocumentCommand {\Traiter_un_argument} { >{ \SplitArgument{1}{/} } m } +{ + \Traiter_un_argument_aux #1 +} + +\NewDocumentCommand {\Traiter_un_argument_aux} { m m }{ + \use:c {#1arg}{#2}\9 +} + +%%%%% --------------------------------------------------------------------- +%%%%% Termes techniques, etc. +%%%%% --------------------------------------------------------------------- + +\NewDocumentCommand{\VRAI}{ }{ \textsc{vrai}\xspace } + +\NewDocumentCommand{\FAUX}{ }{ \textsc{faux}\xspace } + +\NewDocumentCommand{\TANTQUE}{ }{ + \index{tant~que}\index{boucle}\index{boucle!tant~que} + \textsc{tant~que}\xspace +} + +\NewDocumentCommand{\JUSQUA}{}{ + \index{jusqu'à}\index{boucle}\index{boucle!jusqu'à} + \textsc{jusqu'à}\xspace +} + +\NewDocumentCommand{\POUR}{}{ + \index{pour}\index{boucle}\index{boucle!pour} + \textsc{pour}\xspace +} + +\NewDocumentCommand{\SIALORSSINON}{}{ + \index{si}\index{saut}\index{si!si~alors~sinon} + \textsc{si}\dots{}~\textsc{alors}\dots{}~\textsc{sinon}\xspace +} + +\NewDocumentCommand{\SIALORS}{}{ + \index{si}\index{saut}\index{si!si~alors} + \textsc{si}\dots{}~\textsc{alors}\xspace +} + +\NewDocumentCommand{\SISINON}{}{ + \index{si}\index{saut}\index{si!si~sinon} + \textsc{si}\dots{}~\textsc{sinon}\xspace +} + +\NewDocumentCommand{\Ligne}{m}{ + ligne\nobreakspace\(#1\) +} + +%%%%% --------------------------------------------------------------------- +%%%%% Traduction, francisation +%%%%% --------------------------------------------------------------------- + +%%% ----------------------------------------------------------------------- +%%% tirets ouvrant et fermant: +%%% ----------------------------------------------------------------------- + +\cs_new:Nn \TDS_tiret: { \textemdash } + +\cs_new:Nn \TDS_tiret_espace_int: { \ } + +\NewDocumentCommand {\TO} { } { + \TDS_tiret: \TDS_tiret_espace_int: \ignorespaces } + +\NewDocumentCommand {\TF} {t.} { + \IfBooleanTF {#1} { + \string.} { + \unskip \TDS_tiret_espace_int: \TDS_tiret:\xspace} +} + +%%% ----------------------------------------------------------------------- +%%% abbréviations: c'est-à-dire, par exemple, +%%% ----------------------------------------------------------------------- + +\cs_new:Nn \TDS_pex_abrev: { p.\nobreakspace ex.\xspace } + +\cs_new:Nn \TDS_Pex_abrev: { P.\nobreakspace ex.\xspace } + +\NewDocumentCommand {\PX} { s } { + \IfBooleanTF{#1}{\TDS_Pex_abrev:}{\TdS_PX_auxi} +} + +\NewDocumentCommand {\TdS_PX_auxi} { t. } { + \IfBooleanTF{#1}{\TDS_pex_abrev:}{\TdS_PX_auxii} +} + +\NewDocumentCommand {\TdS_PX_auxii} { t+ } { + \IfBooleanTF{#1}{par~exemple\xspace}{\TDS_pex_abrev:} +} + +\NewDocumentCommand {\CAD} { t+ } { + \IfBooleanTF{#1}{c'est-\`a-dire}{c.-\`a-d.}\xspace +} + +%%% ----------------------------------------------------------------------- +%%% traduction +%%% ----------------------------------------------------------------------- + +\NewDocumentCommand { \English } { m }{ + \emph{\foreignlanguage{english}{#1}} +} + +\NewDocumentCommand { \InEnglish } { m }{ + \emph{\foreignlanguage{english}{#1}} +} + +\NewDocumentCommand { \TdSTrad } { m m }{ + \emph{#1}~\TO anglais~\InEnglish{#2}\TF +} + +%%% ----------------------------------------------------------------------- +%%% notes et remarques +%%% ----------------------------------------------------------------------- + +\NewDocumentCommand { \NdT } { m }{ + \footnote{NdTdS~:~#1} +} + +\NewDocumentEnvironment { TdSrem } { } +{ + \par\sffamily\footnotesize +} +{ + \par\bigbreak +} + +\NewDocumentCommand{\Fragment}{O{\TdS{} \textemdash{} \emph{définitions}} m m m} +{ + \refstepcounter{codefragment} + \VerbatimInput[frame=lines, + framesep=0.75\baselineskip, + numbers=left, + firstline=#2, + lastline=#3, + label={[#1]fragment + \arabic{codefragment}}, + ]{#4.tex} +} + +% \NewDocumentCommand { \Macro } { s o v } { +% \IfBooleanTF{#1} +% {\textcolor{RedOrange}} +% {\textcolor{MidnightBlue}} +% {\CODE{#3}} +% } + +% \NewDocumentCommand{\Macro}{s o v}{ +% \IfBooleanTF{#1} +% {\FausseMacroPresentation{#3}} +% {\gls{#3}} +% } + diff --git a/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/glosaires/erato-supp-glo.tex b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/glosaires/erato-supp-glo.tex new file mode 100644 index 00000000000..b14e386180b --- /dev/null +++ b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/glosaires/erato-supp-glo.tex @@ -0,0 +1,75 @@ +% Time-stamp: <2019-08-24 17:31:03 administrateur> +% Création : 2019-08-24T16:24:29+0200 +\newglossaryentry{EcrireDiviseurs}{ + type=cs, + name={\MacroPresentation{Ecri\0re\0Di\0vi\0seurs}}, + description={PERSO} +} + +\newglossaryentry{int_do_until+nNnn}{ + type=cs, + name={\MacroPresentation{int\1do\1un\0til\2nNnn}}, + description={} +} + +\newglossaryentry{ERA_presenter_nieme+n}{ + type=cs, + name={\MacroPresentation{ERA\1pre\0sen\0ter\1nieme\2n}}, + description={PERSO} +} + +\newglossaryentry{ERA_marquer_de_a_par+nnn}{ + type=cs, + name={\MacroPresentation{ERA\1mar\0quer\1de\1a\1par\2nnn}}, + description={PERSO} +} + +\newglossaryentry{times}{ + type=cs, + name={\MacroPresentation{ti\0mes}}, + description={} +} + +\newglossaryentry{__ERA_qt_ia}{ + type=cs, + name={\MacroPresentation{\1\1ERA\1qt\1ia}}, + description={PERSO} +} + +\newglossaryentry{__ERA_dv_ia}{ + type=cs, + name={\MacroPresentation{\1\1ERA\1dv\1ia}}, + description={PERSO} +} + +\newglossaryentry{l_ERA_vx_dv_int}{ + type=cs, + name={\MacroPresentation{l\1ERA\1vx\1dv\1int}}, + description={PERSO} +} + +\newglossaryentry{eratosthene}{ + type=cs, + name={\MacroPresentation{era\0to\0sthe\0ne}}, + description={PERSO} +} + +\newglossaryentry{l_ERA_diviseur_max_int}{ + type=cs, + name={\MacroPresentation{l\1ERA\1di\0vi\0seur\1max\1int}}, + description={PERSO} +} + +\newglossaryentry{l_ERA_nv_qt_int}{ + type=cs, + name={\MacroPresentation{l\1ERA\1nv\1qt\1int}}, + description={PERSO} +} + +\newglossaryentry{l_ERA_nv_dv_int}{ + type=cs, + name={\MacroPresentation{l\1ERA\1nv\1dv\1int}}, + description={PERSO} +} + + diff --git a/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/glosaires/kaprekar-sup-glo.tex b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/glosaires/kaprekar-sup-glo.tex new file mode 100644 index 00000000000..9a053376bda --- /dev/null +++ b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/glosaires/kaprekar-sup-glo.tex @@ -0,0 +1,229 @@ +% Time-stamp: <2019-08-28 15:59:41 administrateur> +% Création : 2019-08-27T10:28:42+0200 +\newglossaryentry{seq_pop_right+NNT}{ + type=cs, + name={\MacroPresentation{seq\1pop\1right\2NNT}}, + description={e3} +} + +\newglossaryentry{cs_new_protected+Nn}{ + type=cs, + name={\MacroPresentation{cs\1new\1pro\0tec\0ted\2Nn}}, + description={e3} +} + +\newglossaryentry{seq_reverse+N}{ + type=cs, + name={\MacroPresentation{seq\1re\0ver\0se\2N}}, + description={e3} +} + +\newglossaryentry{l_tmpa_tl}{ + type=cs, + name={\MacroPresentation{l\1tmpa\1tl}}, + description={e3} +} + +\newglossaryentry{seq_set_eq+NN}{ + type=cs, + name={\MacroPresentation{seq\1set\1eq\2NN}}, + description={e3} +} + +\newglossaryentry{seq_map_inline+Nn}{ + type=cs, + name={\MacroPresentation{seq\1map\1in\0line\2Nn}}, + description={e3} +} + +\newglossaryentry{l_tmpc_int}{ + type=cs, + name={\MacroPresentation{l\1tmpc\1int}}, + description={PERSO} +} + +\newglossaryentry{l_tmpa_bool}{ + type=cs, + name={\MacroPresentation{l\1tmpa\1bool}}, + description={e3} +} + +\newglossaryentry{seq_if_in+NVT}{ + type=cs, + name={\MacroPresentation{seq\1if\1in\2NVT}}, + description={e3} +} + +\newglossaryentry{l_tmpd_int}{ + type=cs, + name={\MacroPresentation{l\1tmpd\1int}}, + description={PERSO} +} + +\newglossaryentry{seq_sort+Nn}{ + type=cs, + name={\MacroPresentation{seq\1sort\2Nn}}, + description={e3} +} + +\newglossaryentry{KAP_suivant+nNN}{ + type=cs, + name={\MacroPresentation{KAP\1sui\0vant\2nNN}}, + description={PERSO} +} + +\newglossaryentry{seq_new+N}{ + type=cs, + name={\MacroPresentation{seq\1new\2N}}, + description={e3} +} + +\newglossaryentry{bool_while_do+nn}{ + type=cs, + name={\MacroPresentation{bool\1whi\0le\1do\2nn}}, + description={e3} +} + +\newglossaryentry{sort_return_same+}{ + type=cs, + name={\MacroPresentation{sort\1re\0turn\1same\2}}, + description={e3} +} + +\newglossaryentry{KAP_seq_to_int+NN}{ + type=cs, + name={\MacroPresentation{KAP\1seq\1to\1int\2NN}}, + description={PERSO} +} + +\newglossaryentry{KAP_remplir_seq+Nn}{ + type=cs, + name={\MacroPresentation{KAP\1rem\0plir\1seq\2Nn}}, + description={PERSO} +} + +\newglossaryentry{Kaprekar}{ + type=cs, + name={\MacroPresentation{Ka\0pre\0kar}}, + description={PERSO} +} + +\newglossaryentry{seq_put_left+NV}{ + type=cs, + name={\MacroPresentation{seq\1put\1left\2NV}}, + description={e3} +} + +\newglossaryentry{KAP_ranger_seq+N}{ + type=cs, + name={\MacroPresentation{KAP\1ran\0ger\1seq\2N}}, + description={PERSO} +} + +\newglossaryentry{kaprdx_seq}{ + type=cs, + name={\MacroPresentation{kaprdx\1seq}}, + description={PERSO} +} + +\newglossaryentry{KAP_ecrire_tous_les_suivants+nn}{ + type=cs, + name={\MacroPresentation{KAP\1ecri\0re\1tous\1les\1sui\0vants\2nn}}, + description={PERSO} +} + +\newglossaryentry{int_div_truncate+nn}{ + type=cs, + name={\MacroPresentation{int\1div\1trun\0ca\0te\2nn}}, + description={e3} +} + +\newglossaryentry{kaprun_seq}{ + type=cs, + name={\MacroPresentation{kaprun\1seq}}, + description={PERSO} +} + +\newglossaryentry{seq_put_right+NV}{ + type=cs, + name={\MacroPresentation{seq\1put\1right\2NV}}, + description={e3} +} + +\newglossaryentry{seq_put_right+Nn}{ + type=cs, + name={\MacroPresentation{seq\1put\1right\2Nn}}, + description={e3} +} + +\newglossaryentry{seq_put_left+Nn}{ + type=cs, + name={\MacroPresentation{seq\1put\1left\2Nn}}, + description={e3} +} + +\newglossaryentry{seq_clear+N}{ + type=cs, + name={\MacroPresentation{seq\1clear\2N}}, + description={e3} +} + +\newglossaryentry{seq_if_empty_p+N}{ + type=cs, + name={\MacroPresentation{seq\1if\1em\0pty\1p\2N}}, + description={e3} +} + +\newglossaryentry{sort_return_swapped+}{ + type=cs, + name={\MacroPresentation{sort\1re\0turn\1swap\0ped\2}}, + description={e3} +} + +\newglossaryentry{int_decr+N}{ + type=cs, + name={\MacroPresentation{int\1decr\2N}}, + description={e3} +} + +\newglossaryentry{int_case+nnF}{ + type=cs, + name={\MacroPresentation{int\1case\2nnF}}, + description={e3} +} + +\newglossaryentry{seq_count+N}{ + type=cs, + name={\MacroPresentation{seq\1count\2N}}, + description={e3} +} + +\newglossaryentry{bool_do_until+nn}{ + type=cs, + name={\MacroPresentation{bool\1do\1un\0til\2nn}}, + description={e3} +} + +\newglossaryentry{kaprekar_seq}{ + type=cs, + name={\MacroPresentation{ka\0pre\0kar\1seq}}, + description={PERSO} +} + +\newglossaryentry{KAP_int_to_seq+NN}{ + type=cs, + name={\MacroPresentation{KAP\1int\1to\1seq\2NN}}, + description={PERSO} +} + +\newglossaryentry{seq_show+N}{ + type=cs, + name={\MacroPresentation{seq\1show\2N}}, + description={e3} +} + +\newglossaryentry{seq_use+Nnnn}{ + type=cs, + name={\MacroPresentation{seq\1use\2Nnnn}}, + description={e3} +} diff --git a/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/glosaires/les-macros.tex b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/glosaires/les-macros.tex new file mode 100644 index 00000000000..79a535ece11 --- /dev/null +++ b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/glosaires/les-macros.tex @@ -0,0 +1,511 @@ +% Time-stamp: <2019-08-27 20:15:00 administrateur> +% Création : 2019-08-06T09:32:09+0200 +\newglossaryentry{(}{ + type=cs, + name={\MacroPresentation{(}}, + description={l2e} +} + +\newglossaryentry{)}{ + type=cs, + name={\MacroPresentation{)}}, + description={l2e} +} + +\newglossaryentry{bool_do_while+Nn}{ + type=cs, + name={\MacroPresentation{bool\1do\1whi\0le\2Nn}}, + description={e3} +} + +\newglossaryentry{bool_do_until+Nn}{ + type=cs, + name={\MacroPresentation{bool\1do\1un\0til\2Nn}}, + description={e3} +} + +\newglossaryentry{bool_while_do+Nn}{ + type=cs, + name={\MacroPresentation{bool\1whi\0le\1do\2Nn}}, + description={e3} +} + +\newglossaryentry{bool_until_do+Nn}{ + type=cs, + name={\MacroPresentation{bool\1un\0til\1do\2Nn}}, + description={e3} +} + + +\newglossaryentry{bool_gset_false+N}{ + type=cs, + name={\MacroPresentation{bool\1gset\1fal\0se\2N}}, + description={e3} +} + +\newglossaryentry{bool_if+nT}{ + type=cs, + name={\MacroPresentation{bool\1if\2nT}}, + description={e3} +} + +\newglossaryentry{bool_if+nF}{ + type=cs, + name={\MacroPresentation{bool\1if\2nF}}, + description={e3} +} + +\newglossaryentry{bool_if+nTF}{ + type=cs, + name={\MacroPresentation{bool\1if\2nTF}}, + description={e3} +} + +\newglossaryentry{bool_set_false+N}{ + type=cs, + name={\MacroPresentation{bool\1set\1fal\0se\2N}}, + description={e3} +} + +\newglossaryentry{bool_set_true+N}{ + type=cs, + name={\MacroPresentation{bool\1set\1true\2N}}, + description={e3} +} + +\newglossaryentry{cs_new+Nn}{ + type=cs, + name={\MacroPresentation{cs\1new\2Nn}}, + description={e3} +} + +\newglossaryentry{cs_new+cn}{ + type=cs, + name={\MacroPresentation{cs\1new\2cn}}, + description={e3} +} + + +\newglossaryentry{cs_set+Nn}{ + type=cs, + name={\MacroPresentation{cs\1set\2Nn}}, + description={e3} +} + +\newglossaryentry{cs_undefine+N}{ + type=cs, + name={\MacroPresentation{cs\1un\0de\0fi\0ne\2N}}, + description={e3} +} + +\newglossaryentry{ExplSyntaxOff}{ + type=cs, + name={\MacroPresentation{Exp\0lSyn\0tax\0Off}}, + description={e3} +} + +\newglossaryentry{ExplSyntaxOn}{ + type=cs, + name={\MacroPresentation{Expl\0Syn\0tax\0On}}, + description={e3} +} + +\newglossaryentry{group_begin+}{ + type=cs, + name={\MacroPresentation{group\1be\0gin\2}}, + description={e3} +} + +\newglossaryentry{group_end+}{ + type=cs, + name={\MacroPresentation{group\1end\2}}, + description={e3} +} + +\newglossaryentry{int_add+Nn}{ + type=cs, + name={\MacroPresentation{int\1add\2Nn}}, + description={e3} +} + +\newglossaryentry{int_compare+nNnT}{ + type=cs, + name={\MacroPresentation{int\1com\0pa\0re\2nNnT}}, + description={e3} +} + +\newglossaryentry{int_compare+nNnTF}{ + type=cs, + name={\MacroPresentation{int\1com\0pa\0re\2nNnTF}}, + description={e3} +} + +\newglossaryentry{int_compare_p+nNn}{ + type=cs, + name={\MacroPresentation{int\1com\0pa\0re\1p\2nNn}}, + description={e3} +} + +\newglossaryentry{int_incr+N}{ + type=cs, + name={\MacroPresentation{int\1incr\2N}}, + description={e3} +} + +\newglossaryentry{int_mod+nn}{ + type=cs, + name={\MacroPresentation{int\1mod\2nn}}, + description={e3} +} + +\newglossaryentry{int_new+N}{ + type=cs, + name={\MacroPresentation{int\1new\2N}}, + description={e3} +} + +\newglossaryentry{int_set+Nn}{ + type=cs, + name={\MacroPresentation{int\1set\2Nn}}, + description={e3} +} + +\newglossaryentry{int_gset+Nn}{ + type=cs, + name={\MacroPresentation{int\1gset\2Nn}}, + description={e3} +} + + +\newglossaryentry{int_to_arabic+n}{ + type=cs, + name={\MacroPresentation{int\1to\1a\0ra\0bic\2n}}, + description={e3} +} + +\newglossaryentry{int_while_do+nNnn}{ + type=cs, + name={\MacroPresentation{int\1whi\0le\1do\2nNnn}}, + description={e3} +} + +\newglossaryentry{l_compteur_int}{ + type=cs, + name={\MacroPresentation{l\1comp\0teur\1int}}, + description={PERSO} +} + +\newglossaryentry{ListePremiers}{ + type=cs, + name={\MacroPresentation{ListePremiers}}, + description={PERSO} +} + +\newglossaryentry{l_nombre_requis}{ + type=cs, + name={\MacroPresentation{l\1nom\0bre\1re\0quis}}, + description={PERSO} +} + +\newglossaryentry{l_tmpa_int}{ + type=cs, + name={\MacroPresentation{l\1tmpa\1int}}, + description={e3} +} + +\newglossaryentry{l_tmpb_int}{ + type=cs, + name={\MacroPresentation{l\1tmpb\1int}}, + description={e3} +} + +\newglossaryentry{l_tmpb_int est le candidat à tester}{ + type=cs, + name={\MacroPresentation{l\1tmpb\1int est le candidat à tester}}, + description={PERSO} +} + +\newglossaryentry{NewDocumentCommand}{ + type=cs, + name={\MacroPresentation{New\0Do\0cu\0mentCom\0mand}}, + description={xparse} +} + +\newglossaryentry{np}{ + type=cs, + name={\MacroPresentation{np}}, + description={numprint} +} + +\newglossaryentry{yh_continue_bool}{ + type=cs, + name={\MacroPresentation{yh\1con\0ti\0nue\1bool}}, + description={PERSO} +} + +\newglossaryentry{__yh_ecrire_nombre+n}{ + type=cs, + name={\MacroPresentation{\1\1yh\1ecri\0re\1nom\0bre\2n}}, + description={PERSO} +} + +\newglossaryentry{yh_ecrire_separateur+n}{ + type=cs, + name={\MacroPresentation{yh\1ecrire\1se\0pa\0ra\0teur\2n}}, + description={PERSO} +} + +\newglossaryentry{yh_ecrire_si_premier+n}{ + type=cs, + name={\MacroPresentation{yh\1ecrire\1si\1pre\0mier\2n}}, + description={PERSO} +} + +\newglossaryentry{yh_est_premier_bool}{ + type=cs, + name={\MacroPresentation{yh\1est\1premier\1bool}}, + description={PERSO} +} + +\newglossaryentry{yh_impair_est_premier+nT}{ + type=cs, + name={\MacroPresentation{yh\1impair\1est\1pre\0mier\2nT}}, + description={PERSO} +} + +\newglossaryentry{newcommand}{ + type=cs, + name={\MacroPresentation{new\0com\0mand}}, + description={L2e} +} + +\newglossaryentry{gdef}{ + type=cs, + name={\MacroPresentation{gdef}}, + description={TK} +} + +\newglossaryentry{numexpr}{ + type=cs, + name={\MacroPresentation{num\0expr}}, + description={eTeX} +} + +%%%% macros supplémentaires de eratosthene + +\newglossaryentry{AppliquerCribleEratosthene}{ + type=cs, + name={\MacroPresentation{Ap\0pli\0quer\0Cri\0ble\0Era\0to\0sthene}}, + description={} +} + +\newglossaryentry{cs_generate_variant+Nn}{ + type=cs, + name={\MacroPresentation{cs\1ge\0ne\0ra\0te\1va\0riant\2Nn}}, + description={el3} +} + +\newglossaryentry{cs_gset_eq+cN}{ + type=cs, + name={\MacroPresentation{cs\1gset\1eq\2cN}}, + description={el3} +} + +\newglossaryentry{cs_set_eq+Nc}{ + type=cs, + name={\MacroPresentation{cs\1set\1eq\2Nc}}, + description={el3} +} + +\newglossaryentry{EcrireCribleEratosthene}{ + type=cs, + name={\MacroPresentation{Ecri\0re\0Cri\0ble\0Era\0to\0sthene}}, + description={} +} + +\newglossaryentry{__ERA_ia}{ + type=cs, + name={\MacroPresentation{\1\1ERA\1ia}}, + description={} +} + +\newglossaryentry{ERA_presenter_nieme+nn}{ + type=cs, + name={\MacroPresentation{ERA\1pre\0sen\0ter\1nieme\2nn}}, + description={} +} + +\newglossaryentry{fboxrule}{ + type=cs, + name={\MacroPresentation{fbox\0ru\0le}}, + description={} +} + +\newglossaryentry{footnotesize}{ + type=cs, + name={\MacroPresentation{foot\0no\0te\0si\0ze}}, + description={} +} + +\newglossaryentry{fp_to_int+n}{ + type=cs, + name={\MacroPresentation{fp\1to\1int\2n}}, + description={el3} +} + +\newglossaryentry{framebox}{ + type=cs, + name={\MacroPresentation{fra\0me\0box}}, + description={} +} + +\newglossaryentry{intarray_count+c}{ + type=cs, + name={\MacroPresentation{int\0ar\0ray\1count\2c}}, + description={el3} +} + +\newglossaryentry{intarray_count+N}{ + type=cs, + name={\MacroPresentation{int\0ar\0ray\1count\2N}}, + description={el3} +} + +\newglossaryentry{intarray_gset+Nnn}{ + type=cs, + name={\MacroPresentation{int\0ar\0ray\1gset\2Nnn}}, + description={el3} +} + +\newglossaryentry{intarray_item+cn}{ + type=cs, + name={\MacroPresentation{int\0ar\0ray\1item\2cn}}, + description={el3} +} + +\newglossaryentry{intarray_item+Nn}{ + type=cs, + name={\MacroPresentation{int\0ar\0ray\1item\2Nn}}, + description={el3} +} + +\newglossaryentry{intarray_new+cn}{ + type=cs, + name={\MacroPresentation{int\0ar\0ray\1new\2cn}}, + description={el3} +} + +\newglossaryentry{intarray_new+Nn}{ + type=cs, + name={\MacroPresentation{int\0ar\0ray\1new\2Nn}}, + description={el3} +} + +\newglossaryentry{int_compare+nNnF}{ + type=cs, + name={\MacroPresentation{int\1com\0pa\0re\2nNnF}}, + description={el3} +} + +\newglossaryentry{int_step_inline+nn}{ + type=cs, + name={\MacroPresentation{int\1step\1in\0line\2nn}}, + description={el3} +} + +\newglossaryentry{int_step_inline+nnnn}{ + type=cs, + name={\MacroPresentation{int\1step\1in\0line\2nnnn}}, + description={el3} +} + +\newglossaryentry{kern}{ + type=cs, + name={\MacroPresentation{kern}}, + description={} +} + +\newglossaryentry{langle}{ + type=cs, + name={\MacroPresentation{lan\0gle}}, + description={} +} + +\newglossaryentry{l_ERA_borne_int}{ + type=cs, + name={\MacroPresentation{l\1ERA\1bor\0ne\1int}}, + description={} +} + +\newglossaryentry{noindent}{ + type=cs, + name={\MacroPresentation{no\0in\0dent}}, + description={} +} + +\newglossaryentry{nointerlineskip}{ + type=cs, + name={\MacroPresentation{no\0in\0ter\0li\0ne\0skip}}, + description={} +} + +\newglossaryentry{par}{ + type=cs, + name={\MacroPresentation{par}}, + description={} +} + +\newglossaryentry{rangle}{ + type=cs, + name={\MacroPresentation{ran\0gle}}, + description={} +} + +\newglossaryentry{strut}{ + type=cs, + name={\MacroPresentation{strut}}, + description={} +} + +\newglossaryentry{textbf}{ + type=cs, + name={\MacroPresentation{text\0bf}}, + description={} +} + +\newglossaryentry{textcolor}{ + type=cs, + name={\MacroPresentation{text\0co\0lor}}, + description={} +} + +\newglossaryentry{IfBooleanF}{ + type=cs, + name={\MacroPresentation{If\0Boo\0leanF}}, + description={xparse} +} + +\newglossaryentry{IfBooleanT}{ + type=cs, + name={\MacroPresentation{If\0Boo\0leanT}}, + description={xparse} +} + +\newglossaryentry{IfBooleanTF}{ + type=cs, + name={\MacroPresentation{If\0Boo\0leanTF}}, + description={xparse} +} + +\newglossaryentry{nobreakspace}{ + type=cs, + name={\MacroPresentation{no\0break\0spa\0ce}}, + description={e3} +} + + + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "dun19expl3" +%%% End: diff --git a/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/glosaires/termes-techniques.tex b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/glosaires/termes-techniques.tex new file mode 100644 index 00000000000..c570a56e627 --- /dev/null +++ b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/glosaires/termes-techniques.tex @@ -0,0 +1,73 @@ +% Time-stamp: <2019-08-28 11:50:49 administrateur> +% Création : 2019-08-05T13:55:03+0200 +\newglossaryentry{signature}{% + name={signature}, + first={\emph{signature}}, + description={\InEnglish{signature}} +} + + +\newglossaryentry{module}{ + name={module}, + first={\emph{module}}, + description={\InEnglish{module}} +} + +\newglossaryentry{fonction}{ + name={fonction}, + first={\emph{fonction}}, + description={\InEnglish{function}} +} + +\newglossaryentry{extension}{ + name={extension}, + first={\emph{extension}}, + description={\InEnglish{package}} +} + +\newglossaryentry{entier}{ + name={entier}, + first={\emph{entier}}, + firstplural={\emph{entiers}}, + description={\CAD entier relatif, \InEnglish{integer}} +} + +\newglossaryentry{booleen}{ + name={booléen}, + first={\emph{booléen}}, + description={\InEnglish{boolean}} +} + +\newglossaryentry{variable}{ + name={variable}, + first={\emph{variable}}, + firstplural={\emph{variables}}, + description={\InEnglish{variable}} +} + +\newglossaryentry{flottant}{ + name={flottant}, + first={\emph{flottant} \TO pour \og nombre réel codé \emph{en virgule flottante}\fg\TF}, + description={\InEnglish{floating point number}, nombre \emph{réel} + représenté en \emph{virgule flottante}} +} + +\newglossaryentry{sequence}{% + name={\emph{sequence}}, + plural={\emph{sequences}}, + first={\emph{sequence}, en français \og suite\fg}, + description={\InEnglish{sequence}, en français \og suite\fg} +} + +\endinput +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "dun19expl3-macros" +%%% End: + + +\newglossaryentry{}{ + name={}, + first={\emph{}}, + description={\InEnglish{}} +} diff --git a/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/latexmkrc b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/latexmkrc new file mode 100644 index 00000000000..91e227978b8 --- /dev/null +++ b/Master/texmf-dist/doc/latex/expose-expl3-dunkerque-2019/latexmkrc @@ -0,0 +1,12 @@ +add_cus_dep('glo', 'gls', 0, 'run_makeglossaries'); +add_cus_dep('acn', 'acr', 0, 'run_makeglossaries'); +add_cus_dep('klo', 'kls', 0, 'run_makeglossaries'); + +sub run_makeglossaries { + if ( $silent ) { + system "makeglossaries -q '$_[0]'"; + } + else { + system "makeglossaries '$_[0]'"; + }; +}
\ No newline at end of file |