From 75d8dfa80524727ddb7d8ae217ed6463efba84cf Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Sun, 22 Mar 2020 03:00:48 +0000 Subject: CTAN sync 202003220300 --- info/expose-expl3-dunkerque-2019/LISEZMOI.md | 40 ++ info/expose-expl3-dunkerque-2019/Makefile | 134 ++++++ info/expose-expl3-dunkerque-2019/README.md | 45 ++ .../bibliographie/dun19expl3.bib | 56 +++ .../codes/erato-def.tex | 103 +++++ .../codes/henel-def.tex | 66 +++ .../codes/kaprekar-def.tex | 81 ++++ .../codes/knuth-def.tex | 20 + .../expose-expl3-dunkerque-2019/dk19ecrireprem.tex | 400 ++++++++++++++++ .../dk19eratosthene.tex | 234 ++++++++++ info/expose-expl3-dunkerque-2019/dk19intro.tex | 25 + info/expose-expl3-dunkerque-2019/dk19kaprekar.tex | 244 ++++++++++ info/expose-expl3-dunkerque-2019/dun19expl3.pdf | Bin 0 -> 309536 bytes info/expose-expl3-dunkerque-2019/dun19expl3.tex | 152 ++++++ .../extensions/dun19codepres.sty | 321 +++++++++++++ .../glosaires/erato-supp-glo.tex | 75 +++ .../glosaires/kaprekar-sup-glo.tex | 229 +++++++++ .../glosaires/les-macros.tex | 511 +++++++++++++++++++++ .../glosaires/termes-techniques.tex | 73 +++ info/expose-expl3-dunkerque-2019/latexmkrc | 12 + info/ptex-manual/LICENSE | 2 +- info/ptex-manual/README.md | 2 +- info/ptex-manual/eptexdoc.pdf | Bin 380603 -> 347556 bytes info/ptex-manual/eptexdoc.tex | 115 ++--- info/ptex-manual/fam256p.tex | 90 ++-- info/ptex-manual/jfm.pdf | Bin 157050 -> 164504 bytes info/ptex-manual/jfm.tex | 257 +++++++++-- info/ptex-manual/ptex-guide-en.pdf | Bin 99191 -> 98937 bytes info/ptex-manual/ptex-guide-en.tex | 28 +- info/ptex-manual/ptex-manual.pdf | Bin 381432 -> 329490 bytes info/ptex-manual/ptex-manual.tex | 212 ++++++--- 31 files changed, 3300 insertions(+), 227 deletions(-) create mode 100644 info/expose-expl3-dunkerque-2019/LISEZMOI.md create mode 100644 info/expose-expl3-dunkerque-2019/Makefile create mode 100644 info/expose-expl3-dunkerque-2019/README.md create mode 100644 info/expose-expl3-dunkerque-2019/bibliographie/dun19expl3.bib create mode 100644 info/expose-expl3-dunkerque-2019/codes/erato-def.tex create mode 100644 info/expose-expl3-dunkerque-2019/codes/henel-def.tex create mode 100644 info/expose-expl3-dunkerque-2019/codes/kaprekar-def.tex create mode 100644 info/expose-expl3-dunkerque-2019/codes/knuth-def.tex create mode 100644 info/expose-expl3-dunkerque-2019/dk19ecrireprem.tex create mode 100644 info/expose-expl3-dunkerque-2019/dk19eratosthene.tex create mode 100644 info/expose-expl3-dunkerque-2019/dk19intro.tex create mode 100644 info/expose-expl3-dunkerque-2019/dk19kaprekar.tex create mode 100644 info/expose-expl3-dunkerque-2019/dun19expl3.pdf create mode 100644 info/expose-expl3-dunkerque-2019/dun19expl3.tex create mode 100644 info/expose-expl3-dunkerque-2019/extensions/dun19codepres.sty create mode 100644 info/expose-expl3-dunkerque-2019/glosaires/erato-supp-glo.tex create mode 100644 info/expose-expl3-dunkerque-2019/glosaires/kaprekar-sup-glo.tex create mode 100644 info/expose-expl3-dunkerque-2019/glosaires/les-macros.tex create mode 100644 info/expose-expl3-dunkerque-2019/glosaires/termes-techniques.tex create mode 100644 info/expose-expl3-dunkerque-2019/latexmkrc (limited to 'info') diff --git a/info/expose-expl3-dunkerque-2019/LISEZMOI.md b/info/expose-expl3-dunkerque-2019/LISEZMOI.md new file mode 100644 index 0000000000..1f182be82a --- /dev/null +++ b/info/expose-expl3-dunkerque-2019/LISEZMOI.md @@ -0,0 +1,40 @@ + + + +# 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/info/expose-expl3-dunkerque-2019/Makefile b/info/expose-expl3-dunkerque-2019/Makefile new file mode 100644 index 0000000000..4e4fc1fb9d --- /dev/null +++ b/info/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/info/expose-expl3-dunkerque-2019/README.md b/info/expose-expl3-dunkerque-2019/README.md new file mode 100644 index 0000000000..b085718cb8 --- /dev/null +++ b/info/expose-expl3-dunkerque-2019/README.md @@ -0,0 +1,45 @@ + + + +# 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/info/expose-expl3-dunkerque-2019/bibliographie/dun19expl3.bib b/info/expose-expl3-dunkerque-2019/bibliographie/dun19expl3.bib new file mode 100644 index 0000000000..f6a803b3a8 --- /dev/null +++ b/info/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/info/expose-expl3-dunkerque-2019/codes/erato-def.tex b/info/expose-expl3-dunkerque-2019/codes/erato-def.tex new file mode 100644 index 0000000000..26e3d94f86 --- /dev/null +++ b/info/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/info/expose-expl3-dunkerque-2019/codes/henel-def.tex b/info/expose-expl3-dunkerque-2019/codes/henel-def.tex new file mode 100644 index 0000000000..0beae24a67 --- /dev/null +++ b/info/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/info/expose-expl3-dunkerque-2019/codes/kaprekar-def.tex b/info/expose-expl3-dunkerque-2019/codes/kaprekar-def.tex new file mode 100644 index 0000000000..097279d8fe --- /dev/null +++ b/info/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/info/expose-expl3-dunkerque-2019/codes/knuth-def.tex b/info/expose-expl3-dunkerque-2019/codes/knuth-def.tex new file mode 100644 index 0000000000..34c771501e --- /dev/null +++ b/info/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/info/expose-expl3-dunkerque-2019/dk19ecrireprem.tex b/info/expose-expl3-dunkerque-2019/dk19ecrireprem.tex new file mode 100644 index 0000000000..cff913ae23 --- /dev/null +++ b/info/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/info/expose-expl3-dunkerque-2019/dk19eratosthene.tex b/info/expose-expl3-dunkerque-2019/dk19eratosthene.tex new file mode 100644 index 0000000000..269efbcb46 --- /dev/null +++ b/info/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/info/expose-expl3-dunkerque-2019/dk19intro.tex b/info/expose-expl3-dunkerque-2019/dk19intro.tex new file mode 100644 index 0000000000..c9f84b41b5 --- /dev/null +++ b/info/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/info/expose-expl3-dunkerque-2019/dk19kaprekar.tex b/info/expose-expl3-dunkerque-2019/dk19kaprekar.tex new file mode 100644 index 0000000000..ad374490a4 --- /dev/null +++ b/info/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/info/expose-expl3-dunkerque-2019/dun19expl3.pdf b/info/expose-expl3-dunkerque-2019/dun19expl3.pdf new file mode 100644 index 0000000000..f8e8f8d91f Binary files /dev/null and b/info/expose-expl3-dunkerque-2019/dun19expl3.pdf differ diff --git a/info/expose-expl3-dunkerque-2019/dun19expl3.tex b/info/expose-expl3-dunkerque-2019/dun19expl3.tex new file mode 100644 index 0000000000..1a81dda907 --- /dev/null +++ b/info/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/info/expose-expl3-dunkerque-2019/extensions/dun19codepres.sty b/info/expose-expl3-dunkerque-2019/extensions/dun19codepres.sty new file mode 100644 index 0000000000..988999d60b --- /dev/null +++ b/info/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/info/expose-expl3-dunkerque-2019/glosaires/erato-supp-glo.tex b/info/expose-expl3-dunkerque-2019/glosaires/erato-supp-glo.tex new file mode 100644 index 0000000000..b14e386180 --- /dev/null +++ b/info/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/info/expose-expl3-dunkerque-2019/glosaires/kaprekar-sup-glo.tex b/info/expose-expl3-dunkerque-2019/glosaires/kaprekar-sup-glo.tex new file mode 100644 index 0000000000..9a053376bd --- /dev/null +++ b/info/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/info/expose-expl3-dunkerque-2019/glosaires/les-macros.tex b/info/expose-expl3-dunkerque-2019/glosaires/les-macros.tex new file mode 100644 index 0000000000..79a535ece1 --- /dev/null +++ b/info/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/info/expose-expl3-dunkerque-2019/glosaires/termes-techniques.tex b/info/expose-expl3-dunkerque-2019/glosaires/termes-techniques.tex new file mode 100644 index 0000000000..c570a56e62 --- /dev/null +++ b/info/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/info/expose-expl3-dunkerque-2019/latexmkrc b/info/expose-expl3-dunkerque-2019/latexmkrc new file mode 100644 index 0000000000..91e227978b --- /dev/null +++ b/info/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 diff --git a/info/ptex-manual/LICENSE b/info/ptex-manual/LICENSE index fb5ba97512..e10e83ffe8 100644 --- a/info/ptex-manual/LICENSE +++ b/info/ptex-manual/LICENSE @@ -1,4 +1,4 @@ -Copyright (C) 2017-2019 Japanese TeX Development Community +Copyright (C) 2017-2020 Japanese TeX Development Community All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/info/ptex-manual/README.md b/info/ptex-manual/README.md index 7a4f165607..37291ae17a 100644 --- a/info/ptex-manual/README.md +++ b/info/ptex-manual/README.md @@ -36,6 +36,6 @@ the 3-clause BSD license (see [LICENSE](./LICENSE)). ## Release Date -2019-11-26 +2020-03-21 Japanese TeX Development Community diff --git a/info/ptex-manual/eptexdoc.pdf b/info/ptex-manual/eptexdoc.pdf index 4836488c05..34de3a3c6d 100644 Binary files a/info/ptex-manual/eptexdoc.pdf and b/info/ptex-manual/eptexdoc.pdf differ diff --git a/info/ptex-manual/eptexdoc.tex b/info/ptex-manual/eptexdoc.tex index e4e7650324..9c22097875 100644 --- a/info/ptex-manual/eptexdoc.tex +++ b/info/ptex-manual/eptexdoc.tex @@ -1,17 +1,17 @@ %#!make eptexdoc.pdf \documentclass[a4paper,11pt,nomag]{jsarticle} \usepackage[bold,deluxe]{otf} + \input fam256p.tex \usepackage[textwidth=42zw,lines=40,truedimen,centering]{geometry} - %%%%%%%%%%%%%%%% % additional packages \usepackage{amsmath} \usepackage{mathtools,amssymb,comment} \usepackage[dvipdfmx]{graphicx} +\usepackage{lmodern} \usepackage[T1]{fontenc} \usepackage{booktabs,enumitem,multicol} -\usepackage{lmodern} \usepackage[dvipdfmx,hyperfootnotes=false]{hyperref} \usepackage{pxjahyper} \usepackage{hologo} @@ -242,11 +242,10 @@ tracing機能や条件判断文の強化などあるが,そこら辺はパッ \end{multilist}} \csitem[\.{currentiftype} (read-only integer)] -\ifnum\epTeXversion>190131 %%%%% TL2019-hack 条件判断文とそれを表す数字との対応は以下のようになっている (\epTeX~190709以降). 21,~22は\hologo{pdfTeX}由来の条件判断文(後述), - 23--30が,\pTeX 拡張で追加された条件判断文に対応する.\\ + 23--32が\pTeX 拡張で追加された条件判断文に対応する.\\ \parbox{.9\linewidth}{% \begin{multilist}{3}{\hfil\hskip1.5zw#:&\quad#\qquad\hfil} \item 1&\.{if}\cr\item 2&\.{ifcat}\cr\item 3&\.{ifnum}\cr\item 4&\.{ifdim}\cr @@ -259,46 +258,28 @@ tracing機能や条件判断文の強化などあるが,そこら辺はパッ \item \bf 23&\.{iftdir}\cr\item \bf 24&\.{ifydir}\cr \item \bf 25&\.{ifddir}\cr\item \bf 26&\.{ifmdir}\cr\item \bf 27&\.{iftbox}\cr \item \bf 28&\.{ifybox}\cr\item \bf 29&\.{ifdbox}\cr\item \bf 30&\.{ifmbox}\cr + \item \bf 31&\.{ifjfont}\cr\item \bf 32&\.{iftfont}\cr \end{multilist}} -\else %%%%% TL2019-hack - 条件判断文とそれを表す数字との対応は以下のようになっている - (\epTeX~190131まで;\epTeX~190709以降は\.{ifincsname}プリミティブ追加により変化するので注意). - 21--28が,\pTeX 拡張で追加された条件判断文に対応する. - 29の\.{ifpdfprimitive}は\hologo{pdfTeX}由来のプリミティブ(後述)である.\\ - \parbox{.9\linewidth}{% - \begin{multilist}{3}{\hfil\hskip1.5zw#:&\quad#\qquad\hfil} - \item 1&\.{if}\cr\item 2&\.{ifcat}\cr\item 3&\.{ifnum}\cr\item 4&\.{ifdim}\cr - \item 5&\.{ifodd}\cr\item 6&\.{ifvmode}\cr\item 7&\.{ifhmode}\cr - \item 8&\.{ifmmode}\cr\item 9&\.{ifinner}\cr\item 10&\.{ifvoid}\cr - \item 11&\.{ifhbox}\cr\item 12&\.{ifvbox}\cr\item 13&\.{ifx}\cr - \item 14&\.{ifeof}\cr\item 15&\.{iftrue}\cr\item 16&\.{iffalse}\cr - \item 17&\.{ifcase}\cr\item 18&\.{ifdefined}\cr\item 19&\.{ifcsname}\cr - \item 20&\.{iffontchar}\cr\item \bf 21&\.{iftdir}\cr\item \bf 22&\.{ifydir}\cr - \item \bf 23&\.{ifddir}\cr\item \bf 24&\.{ifmdir}\cr\item \bf 25&\.{iftbox}\cr - \item \bf 26&\.{ifybox}\cr\item \bf 27&\.{ifdbox}\cr\item \bf 28&\.{ifmbox}\cr - \item \bf 29&\.{ifpdfprimtive}\cr - \end{multilist}} -\fi %%%%% TL2019-hack -\ifnum\epTeXversion>190131 %%%%% TL2019-hack - \csitem[\.{fontcharwd}, \.{fontcharht}, \.{fontchardp}, \.{fontcharic}] + \csitem[\.{fontcharwd}, \.{fontcharht}, \.{fontchardp}, \.{fontcharic} (dimension)] + 基本的にフォント内の文字の寸法を内部長さとして返す命令であるが, 欧文フォントと和文フォントを判別し,それに応じて処理が分かれる. それに伴い,許容される引数範囲と意味が異なることに注意 (\epTeX~190709以降). 以下,|??|は|wd|, |ht|, |dp|, |ic|のいずれかを表す. \begin{itemize} - \item 和文フォントの場合: \.{fontchar??} \\ + \item 和文フォントの場合:\.{fontchar??} \\ を$f$,を$c$とおくと, \begin{itemize} \item $c \geq 0$の場合は,$c$を\emph{文字コード}とみなす. $c$が和文文字コードとして有効であれば, 和文フォント$f$における文字コード$c$の和文文字の寸法値を返す. - 和文文字コードとして無効であれば|0pt|を返す. + 和文文字コードとして無効であれば0\,ptを返す. \item $c < 0$の場合は,$-(c+1)$を\emph{文字タイプ}とみなす. 和文フォント$f$に文字タイプ$-(c+1)$が定義されていればその寸法値を返し, - 未定義であれば|0pt|を返す. + 未定義であれば0\,ptを返す. \end{itemize} - \item 欧文フォントの場合: \.{fontchar??} <8-bit number>\\ + \item 欧文フォントの場合:\.{fontchar??} <8-bit number>\\ オリジナルの\eTeX と同じ挙動である.すなわち, 引数に$c \geq 256$や$c < 0$を与えると \verb+! Bad character code (256).+ @@ -323,10 +304,8 @@ tracing機能や条件判断文の強化などあるが,そこら辺はパッ \verb+! Bad character code (256).+ のようにエラーが出る. \end{itemize} -\fi %%%%% TL2019-hack \end{cslist} -\ifnum\epTeXversion>190131 %%%%% TL2019-hack \begin{dangerous} 上記で「和文文字コードとして有効かどうか」は,関数|is_char_kanji|を参照. この関数は内部コードによって異なるため,マクロで実装するのは面倒であるが, @@ -334,7 +313,6 @@ tracing機能や条件判断文の強化などあるが,そこら辺はパッ なお,\upTeX では任意の非負の値が和文文字コードとして有効なため, |is_char_kanji|は非負かどうかの判定になっている. \end{dangerous} -\fi %%%%% TL2019-hack \section{\OMEGA 由来の機能(旧名称:\texttt{FAM256}パッチ)} \epTeX には,掲示板\TeX\ Q\ \&\ Aの山本氏の書き込み @@ -471,7 +449,15 @@ delimiter codeについても同様である. \end{cases} \] となっている.内部では\texttt{fi}レベルが1,\texttt{fil}レベルが2,……として - 処理している. + 処理している\footnote{% + \hologo{LuaTeX}にも無限のレベル\texttt{fi}が存在するが, + |\gluestretchorder|, |\glueshrinkorder|は\eTeX や\epTeX と異なり, + 有限/\texttt{fi}/\texttt{fil}/\texttt{fill}/\texttt{filll}で0/1/2/3/4である. + また,r52360で\eTeX 互換を意図した + |\eTeXgluestretchorder|, |\eTeXglueshrinkorder|も追加されており, + そちらは有限/\texttt{fil}/\texttt{fill}/\texttt{filll}で0/1/2/3とし, + \texttt{fi}は$-1$である. + }. \end{itemize} \paragraph{レジスタについて} @@ -494,7 +480,12 @@ delimiter codeについても同様である. が必要となっており,もはや純粋な\eTeX ですら \LaTeX 3を利用することはできない状況である (\cite{expl31,expl32,expl33}). その他にも,\hologo{pdfTeX}由来のいくつかのプリミティブ(\cite{pdftexman})の実装が -日本の\TeX ユーザからあり, +日本の\TeX ユーザ,および\LaTeX3~team% +\footnote{% + 現在ではさらに状況が動き, + 2021年以降は,\LaTeXe 自体が本節で述べた(\.{readpapersizespecial}以外の)プリミティブを + 要求する予定である(\cite{l2e31}). +}などからあり, ほとんど\hologo{pdfTeX}における実装をそのまま真似する形で実装している. 現在の\epTeX で利用できる\hologo{pdfTeX}由来のプリミティブの一覧を以下に示す. @@ -526,9 +517,10 @@ delimiter codeについても同様である. この2つの内部長さを設定するだけではdviに何の影響も与えない. 後で述べる\.{pdflastxpos}, \.{pdflastypos}による出力位置の取得 - の際の原点位置を設定するためだけに使われ,初期値は0である. + の際の原点位置を設定するためだけに使われ,初期値は0\,ptである + (\hologo{pdfTeX}のdviモードと同じ挙動). - \csitem[\.{readpapersizespecial} (integer)] + \csitem[\.{readpapersizespecial}(integer,\emph{\epTeX 独自拡張で,\hologo{pdfTeX}にはない})] \pTeX 系列では, 用紙サイズの指定には伝統的にpapersize specialが利用されてきた.それを考慮して, 本内部整数\.{readpapersizespecial}(既定値は1)が正の場合は @@ -562,7 +554,7 @@ delimiter codeについても同様である. 原点はページの(物理的な意味の)左下隅であり,$y$軸は(物理的な)上方向に向かって増加する. \begin{itemize} \item ページの物理的な幅と高さはすぐ上の\.{pdfpagewidth}, \.{pdfpageheight}で設定する. - これらの内部長さが0であった場合は,\.{shipout}されたボックスの寸法と + これらの内部長さが0\,ptであった場合は,\.{shipout}されたボックスの寸法と \.{hoffset}(または\.{voffset})の値から自動的に計算される. \item \pTeX では横組・縦組と組方向が複数あるので,\.{pdflastxpos}, \.{pdflastypos}の値の座標系を 「物理的な」向きとすべきか,それとも「組方向に応じた」向きとすべきかは悩みどころである. @@ -575,7 +567,7 @@ delimiter codeについても同様である. \end{itemize} \csitem[\.{pdfcreationdate}] - エンジン起動時の時刻を,\texttt{\pdfcreationdate}の形式で表した文字列に展開する. + エンジン起動時の時刻を\texttt{\pdfcreationdate}の形式で表した文字列に展開される. 末尾に|+09'00'|などと表示されるのはローカルのタイムゾーンであるが, 例えば|SOURCE_DATE_EPOCH=1000000000|のように環境変数を設定すると |D:20010909014640Z|のようにタイムゾーンは|Z|と表示される. @@ -590,13 +582,13 @@ delimiter codeについても同様である. \csitem[\.{pdffilemoddate} , \.{pdffilesize} ] それぞれの更新時刻(\.{pdfcreationdate}と同じ形式)と - ファイルサイズを表す文字列に展開する. + ファイルサイズを表す文字列に展開される. これらも\Pkg{standalone}パッケージのために\epTeX に実装されたプリミティブである. \csitem[\.{pdffiledump} \textrm{[}\texttt{offset} \textrm{]}% \ \texttt{length} ] で与えられたファイル名のバイト目(先頭は0)からバイトを読み込み, - 16進表記(大文字)したものに展開される. + 16進表記(大文字)した文字列に展開される. 本プリミティブはHeiko Oberdiek氏による\Pkg{bmpsize}パッケージを\epTeX でも使うために 角藤さんが実装したものである(2014/05/06). @@ -611,11 +603,17 @@ delimiter codeについても同様である. 本プリミティブは\TeX ユーザの集い2014でリクエストを受けて実装された(\cite{pdfse}). \csitem[\.{pdfmdfivesum} {[\texttt{file}]} ] - 引数のMD5ハッシュ値か,あるいは\texttt{file}が指定された場合は - ファイル名がのファイルのMD5ハッシュ値を計算する. + \texttt{file}が指定された場合は,ファイル名がのファイルのMD5ハッシュ値に展開される. + もしファイルが存在しなかった場合は何も返さない. - 前者の「引数のMD5ハッシュ値を計算する」場合には,\.{pdfstrcmp}と同じように - 和文文字をUTF-8で符号化してから計算する. + \texttt{file}が指定されなかった場合は,引数のMD5ハッシュ値に展開される. + その際,\.{pdfstrcmp}と同じように和文文字はUTF-8で符号化してから計算される. + 例えば +\begin{verbatim} +\pdfmdfivesum{あ} +\pdfmdfivesum{^^e3^^81^^82} +\end{verbatim} + の結果はいずれも\texttt{\pdfmdfivesum{あ}}である. このプリミティブは\cite{xe5}以降の議論を元に,角藤さんがリクエストしたもので, 2015/07/04に\epTeX に実装されている. @@ -635,11 +633,18 @@ delimiter codeについても同様である. 現在では\Pkg{expl3}パッケージではこれらのプリミティブは要求していない. \csitem[\.{pdfuniformdeviate} , \.{pdfnormaldeviate}] - \.{pdfuniformdeviate}は,0以上未満の一様分布に従う乱数(整数値)を生成する. - \.{pdfnormaldeviate}は,平均値0,標準偏差65536の正規分布に従う乱数(整数値)を生成する. + \.{pdfuniformdeviate}は,0以上未満の一様分布に従う乱数 + \footnote{% + 乱数とはいっても,例えば\texttt{\.{pdfuniformdeviate}~536870912}は常に偶数を生成することが知られている + (\cite{xe4}).しかしもともとの\hologo{pdfTeX}の実装がそうなっており,他のエンジンでも直されていないため + \epTeX でもこの症状には独自対処はしない. + }(整数値)を生成し, + それを10進表記した文字列に展開される. + \.{pdfnormaldeviate}は,平均値0,標準偏差65536の正規分布に従う乱数(整数値)を生成し, + それを10進表記した文字列に展開される. \csitem[\.{pdfrandomseed} (read-only integer), \.{pdfsetrandomseed} ] - 乱数生成の種の値は,\.{pdfrandomseed}で取得できる. + 乱数生成の種の値は,内部整数\.{pdfrandomseed}で取得できる. 種の初期化にはシステムのマイクロ秒単位での現在時刻情報が使われる.また,種の値を 設定するには\.{pdfsetrandomseed}に引数として渡せば良い. @@ -660,12 +665,10 @@ delimiter codeについても同様である. \hologo{pdfTeX}, \epTeX, \hologo{XeTeX}で一斉に実装された. \epTeX~180518以降で利用可能である. -\ifnum\epTeXversion>190131 %%%%% TL2019-hack \csitem[\.{ifincsname}] \texttt{\.{csname}~...~\.{endcsname}}内で評価されたちょうどその時に真となる. \LaTeX~2019-10-01で行われる変更(\cite{latex95,tjb83})で必要になったために \epTeX~190709で導入された. -\fi %%%%% TL2019 \end{cslist} @@ -912,7 +915,6 @@ abcfi\the\lastnodechar, abc\char"1C \the\lastnodechar % (\uccode, \lccode は参照しない) \end{cslist} -\ifnum\epTeXversion>190131 %%%%% TL2019-hack \section{\.{current[x]spacingmode}プリミティブ} もともと\pTeX 系列では,\.{kanjiskip},~\.{xkanjiskip}の挿入が有効になっているか 直接的に知る方法が\.{showmode}プリミティブしかなかった. @@ -939,9 +941,8 @@ abcfi\the\lastnodechar, abc\char"1C \the\lastnodechar \.{disablecjktoken}の状態ならば1, \.{forcecjktoken}の状態ならば2を返す. \end{cslist} -\fi %%%%% TL2019 -\ifnum\epTeXversion>190131 %%%%% TL2019-hack + \section{\.{Uchar}, \.{Ucharcat}プリミティブ} \hologo{XeTeX}, \hologo{LuaTeX}には,引数を文字コードとする \emph{文字トークン}に展開される「\.{Uchar} 」というプリミティブが存在する @@ -1025,7 +1026,6 @@ abcfi\the\lastnodechar, abc\char"1C \the\lastnodechar \verb+\Ucharcat\numexpr\jis"3441\relax 17 % エラー回避+ \end{quote} \end{dangerous} -\fi %%%%% TL2019 @@ -1131,6 +1131,9 @@ $3$\,sp)だが,どこか気になるところである. \bibitem{random} Joseph Wright, ``[tex-live] Random number primitives'', 2016/11/12,\\ \url{http://tug.org/pipermail/tex-live/2016-November/039436.html} + \bibitem{xe4} Bruno Le Floch, ``[XeTeX] Random number primitives'', + 2016/12/06,\\ + \url{http://tug.org/pipermail/pipermail/xetex/2016-December/026920.html} \bibitem{eptexinputenc} 阿部 紀行,「2016年2月2日」,2016/02/02.\\ \url{http://abenori.blogspot.jp/2016/02/e-ptexeptexinputencoding.html}. \bibitem{etexman} The \NTS\!\ Team. \textit{The \eTeX\ manual} (v2.0). \\ @@ -1163,7 +1166,6 @@ $3$\,sp)だが,どこか気になるところである. non-ASCII symbols in labels.'', 2018/12/03.\\ \url{https://github.com/latex3/latex2e/issues/95} -\ifnum\epTeXversion>190131 %%%%% TL2019-hack \bibitem{tjb81} 北川 弘典,「バイト列と和文文字トークンの区別」,2019/06/08.\\ \url{https://github.com/texjporg/tex-jp-build/issues/81}. \bibitem{tjb83} aminophen,「[e-pTeX] |\ifincsname|」,2019/07/09.\\ @@ -1173,7 +1175,10 @@ $3$\,sp)だが,どこか気になるところである. \url{https://github.com/texjporg/tex-jp-build/pull/94}. \bibitem{tjb95} 北川 弘典,「[eptex] |\Uchar| and |\Ucharcat|」,2019/10/30.\\ \url{https://github.com/texjporg/tex-jp-build/issues/95}. -\fi %%%%% TL2019 + \bibitem{l2e31} + The \LaTeX3 Project Team, \textit{\LaTeX\ News Issue 31}, 2020.\\ + |$TEXMFDIST/source/latex/base/ltnews31.tex|, \\ + \url{https://www.latex-project.org/news/latex2e-news/ltnews31.pdf}. \end{thebibliography} \newpage diff --git a/info/ptex-manual/fam256p.tex b/info/ptex-manual/fam256p.tex index d05847ab6d..6424224994 100644 --- a/info/ptex-manual/fam256p.tex +++ b/info/ptex-manual/fam256p.tex @@ -15,52 +15,52 @@ -\DeclareMathAlphabet{\mbfa}{OT1}{cmr}{m}{n} -\DeclareMathAlphabet{\mbfb}{OT1}{cmr}{bx}{n} -\DeclareMathAlphabet{\mbfc}{OT1}{cmr}{bx}{n} -\DeclareMathAlphabet{\mbfd}{OT1}{cmr}{bx}{n} -\DeclareMathAlphabet{\mbfe}{OT1}{cmr}{bx}{n} -\DeclareMathAlphabet{\mbff}{OT1}{cmr}{bx}{n} -\DeclareMathAlphabet{\mbfg}{OT1}{cmr}{bx}{n} -\DeclareMathAlphabet{\mbfh}{OT1}{cmr}{bx}{n} -\DeclareMathAlphabet{\mbfi}{OT1}{cmr}{bx}{n} -\DeclareMathAlphabet{\mbfj}{OT1}{cmr}{bx}{n} -\DeclareMathAlphabet{\mbfk}{OT1}{cmr}{bx}{n} -\DeclareMathAlphabet{\mbfl}{OT1}{cmr}{bx}{n}% ここで15番 +\DeclareMathAlphabet{\mbfa}{OT1}{lmr}{m}{n} +\DeclareMathAlphabet{\mbfb}{OT1}{lmr}{bx}{n} +\DeclareMathAlphabet{\mbfc}{OT1}{lmr}{bx}{n} +\DeclareMathAlphabet{\mbfd}{OT1}{lmr}{bx}{n} +\DeclareMathAlphabet{\mbfe}{OT1}{lmr}{bx}{n} +\DeclareMathAlphabet{\mbff}{OT1}{lmr}{bx}{n} +\DeclareMathAlphabet{\mbfg}{OT1}{lmr}{bx}{n} +\DeclareMathAlphabet{\mbfh}{OT1}{lmr}{bx}{n} +\DeclareMathAlphabet{\mbfi}{OT1}{lmr}{bx}{n} +\DeclareMathAlphabet{\mbfj}{OT1}{lmr}{bx}{n} +\DeclareMathAlphabet{\mbfk}{OT1}{lmr}{bx}{n} +\DeclareMathAlphabet{\mbfl}{OT1}{lmr}{bx}{n}% ここで15番 -\DeclareMathAlphabet{\mbfaa}{OT1}{cmtt}{m}{n} % 16 -\DeclareMathAlphabet{\mbfab}{OT1}{cmtt}{m}{n} -\DeclareMathAlphabet{\mbfac}{OT1}{cmtt}{m}{n} -\DeclareMathAlphabet{\mbfad}{OT1}{cmtt}{m}{n} -\DeclareMathAlphabet{\mbfae}{OT1}{cmtt}{m}{n} -\DeclareMathAlphabet{\mbfaf}{OT1}{cmtt}{m}{n} -\DeclareMathAlphabet{\mbfag}{OT1}{cmtt}{m}{n} -\DeclareMathAlphabet{\mbfah}{OT1}{cmtt}{m}{n} -\DeclareMathAlphabet{\mbfai}{OT1}{cmtt}{m}{n} -\DeclareMathAlphabet{\mbfaj}{OT1}{cmtt}{m}{n} -\DeclareMathAlphabet{\mbfak}{OT1}{cmtt}{m}{n} -\DeclareMathAlphabet{\mbfal}{OT1}{cmtt}{m}{n} -\DeclareMathAlphabet{\mbfam}{OT1}{cmtt}{m}{n} -\DeclareMathAlphabet{\mbfan}{OT1}{cmtt}{m}{n} -\DeclareMathAlphabet{\mbfao}{OT1}{cmtt}{m}{n} -\DeclareMathAlphabet{\mbfap}{OT1}{cmtt}{m}{n} +\DeclareMathAlphabet{\mbfaa}{OT1}{lmtt}{m}{n} % 16 +\DeclareMathAlphabet{\mbfab}{OT1}{lmtt}{m}{n} +\DeclareMathAlphabet{\mbfac}{OT1}{lmtt}{m}{n} +\DeclareMathAlphabet{\mbfad}{OT1}{lmtt}{m}{n} +\DeclareMathAlphabet{\mbfae}{OT1}{lmtt}{m}{n} +\DeclareMathAlphabet{\mbfaf}{OT1}{lmtt}{m}{n} +\DeclareMathAlphabet{\mbfag}{OT1}{lmtt}{m}{n} +\DeclareMathAlphabet{\mbfah}{OT1}{lmtt}{m}{n} +\DeclareMathAlphabet{\mbfai}{OT1}{lmtt}{m}{n} +\DeclareMathAlphabet{\mbfaj}{OT1}{lmtt}{m}{n} +\DeclareMathAlphabet{\mbfak}{OT1}{lmtt}{m}{n} +\DeclareMathAlphabet{\mbfal}{OT1}{lmtt}{m}{n} +\DeclareMathAlphabet{\mbfam}{OT1}{lmtt}{m}{n} +\DeclareMathAlphabet{\mbfan}{OT1}{lmtt}{m}{n} +\DeclareMathAlphabet{\mbfao}{OT1}{lmtt}{m}{n} +\DeclareMathAlphabet{\mbfap}{OT1}{lmtt}{m}{n} -\DeclareMathAlphabet{\mbfba}{OT1}{cmss}{m}{it} % 32 -\DeclareMathAlphabet{\mbfbb}{OT1}{cmss}{m}{it} -\DeclareMathAlphabet{\mbfbc}{OT1}{cmss}{m}{it} -\DeclareMathAlphabet{\mbfbd}{OT1}{cmss}{m}{it} -\DeclareMathAlphabet{\mbfbe}{OT1}{cmss}{m}{it} -\DeclareMathAlphabet{\mbfbf}{OT1}{cmss}{m}{it} -\DeclareMathAlphabet{\mbfbg}{OT1}{cmss}{m}{it} -\DeclareMathAlphabet{\mbfbh}{OT1}{cmss}{m}{it} -\DeclareMathAlphabet{\mbfbi}{OT1}{cmss}{m}{it} -\DeclareMathAlphabet{\mbfbj}{OT1}{cmss}{m}{it} -\DeclareMathAlphabet{\mbfbk}{OT1}{cmss}{m}{it} -\DeclareMathAlphabet{\mbfbl}{OT1}{cmss}{m}{it} -\DeclareMathAlphabet{\mbfbm}{OT1}{cmss}{m}{it} -\DeclareMathAlphabet{\mbfbn}{OT1}{cmss}{m}{it} -\DeclareMathAlphabet{\mbfbo}{OT1}{cmss}{m}{it} -\DeclareMathAlphabet{\mbfbp}{OT1}{cmss}{m}{it} +\DeclareMathAlphabet{\mbfba}{OT1}{lmss}{m}{it} % 32 +\DeclareMathAlphabet{\mbfbb}{OT1}{lmss}{m}{it} +\DeclareMathAlphabet{\mbfbc}{OT1}{lmss}{m}{it} +\DeclareMathAlphabet{\mbfbd}{OT1}{lmss}{m}{it} +\DeclareMathAlphabet{\mbfbe}{OT1}{lmss}{m}{it} +\DeclareMathAlphabet{\mbfbf}{OT1}{lmss}{m}{it} +\DeclareMathAlphabet{\mbfbg}{OT1}{lmss}{m}{it} +\DeclareMathAlphabet{\mbfbh}{OT1}{lmss}{m}{it} +\DeclareMathAlphabet{\mbfbi}{OT1}{lmss}{m}{it} +\DeclareMathAlphabet{\mbfbj}{OT1}{lmss}{m}{it} +\DeclareMathAlphabet{\mbfbk}{OT1}{lmss}{m}{it} +\DeclareMathAlphabet{\mbfbl}{OT1}{lmss}{m}{it} +\DeclareMathAlphabet{\mbfbm}{OT1}{lmss}{m}{it} +\DeclareMathAlphabet{\mbfbn}{OT1}{lmss}{m}{it} +\DeclareMathAlphabet{\mbfbo}{OT1}{lmss}{m}{it} +\DeclareMathAlphabet{\mbfbp}{OT1}{lmss}{m}{it} \DeclareMathAlphabet{\mbfca}{OT1}{ptm}{m}{n} % 48 \DeclareMathAlphabet{\mbfcb}{OT1}{ptm}{m}{n} @@ -77,7 +77,7 @@ \DeclareMathAlphabet{\mbfcm}{OT1}{ptm}{m}{n} \DeclareMathAlphabet{\mbfcn}{OT1}{ptm}{m}{n} \DeclareMathAlphabet{\mbfco}{OT1}{ptm}{m}{n} -\DeclareMathAlphabet{\mbfcp}{OT1}{cmr}{bx}{n} +\DeclareMathAlphabet{\mbfcp}{OT1}{lmr}{bx}{n} \DeclareMathAlphabet{\mbfda}{OT1}{phv}{m}{n} % 64 \DeclareMathAlphabet{\mbfdb}{OT1}{pcr}{m}{n} diff --git a/info/ptex-manual/jfm.pdf b/info/ptex-manual/jfm.pdf index 440180a3f3..3654a86ba3 100644 Binary files a/info/ptex-manual/jfm.pdf and b/info/ptex-manual/jfm.pdf differ diff --git a/info/ptex-manual/jfm.tex b/info/ptex-manual/jfm.tex index 128ba4399a..4aef0812e7 100644 --- a/info/ptex-manual/jfm.tex +++ b/info/ptex-manual/jfm.tex @@ -16,6 +16,7 @@ % logos \def\pTeX{p\kern-.10em\TeX}\def\upTeX{u\pTeX} +\def\OMEGA{$\Omega$} \title{\emph{JFMファイルフォーマット}} \author{ASCII Corporation \& Japanese \TeX\ Development Community} @@ -36,7 +37,10 @@ JFMフォーマットの仕様は全く同じであり,ただ JISコードを用いる(\pTeX の場合)か, UCS-4の下位3バイトを用いる(\upTeX の場合)かだけが異なる. -\section{JFMファイルの構成} +\tableofcontents +\clearpage + +\section{JFMファイルの構成}\label{jfm-format} JFMファイルのフォーマットは, 基本的にはTFMファイルのフォーマットに準拠しており, @@ -92,20 +96,10 @@ JFMファイルでもTFMファイルと同じく,拡張子は\code{.tfm}が用 このテーブルの各エントリーは1ワード(=4バイト)で構成され, 上位3バイトに文字コード(符合位置),下位1バイトに文字タイプを持つ -\footnote{これが日本語\TeX{}開発コミュニティによって2018年1月に導入された -新仕様である;オリジナルのアスキーによる仕様では,「上位半ワードに -文字コード,下位半ワードに文字タイプを持つ」というものであった. -\pTeX{}では内部処理にJISが用いられ,JFMで扱う文字コードは2バイトが -上限だったため十分であったが,\upTeX{}でBMP超えの3バイトの文字を -JFMで扱うことを目的に仕様拡張した.}. +\footnote{日本語\TeX{}開発コミュニティによる新仕様; +詳細は第\ref{jfm-new}節を参照.}. 文字コードは,それが16進数24bit(3バイト)で\code{0xABcdef}と表されるとき, -\node{char\_type}テーブルには\code{cd ef AB}として格納される -\footnote{オリジナルの仕様では,下位半ワードに文字タイプを -格納していたが,文字タイプの上限は255なので,実はその上位バイトは -常に\code{00}であった.このことを利用し,日本語\TeX{}開発コミュニティの -新仕様では「この\code{00}が実は文字コードの上位だった」ということに -して,3バイト(U+10000以上)の文字コードで不足する1バイトを確保した. -これにより,新仕様はオリジナルの仕様の上位互換であることが保証されている.}. +\node{char\_type}テーブルには\code{cd ef AB}として格納される. テーブル内にはコードの値の順番に収められていなければならない. またこのテーブルの先頭には,デフォルトのインデックスとして 文字コード及び文字タイプの項が0のものが, @@ -162,11 +156,8 @@ JFMでは$\size{bc}$は必ずゼロ\footnote{前節にある通り,文字コ である場合は,実際の\node{glue\_kern}プログラムが \node{glue\_kern}[$256\times\size{op\_byte}+\size{remainder}$]から 収められている(すなわち,再配置されている)ことを示す - \footnote{「再配置」は,サイズが256を超える大きな - \node{glue\_kern}テーブルを格納するための方策であり, - 欧文TFMの\node{lig\_kern}テーブルにおけるそれと同様である. - 2018年2月に日本語\TeX{}開発コミュニティによって, - \pTeX{}及びpPLtoTFで新たにサポートされた.}. + \footnote{日本語\TeX{}開発コミュニティによって新たにサポート; + 詳細は第\ref{jfm-new}節を参照.}. 最初のワードでない場合(すなわち,既に再配置先あるいは プログラムのステップを開始した後のワードである場合)は, その場でプログラムを終了する. @@ -175,13 +166,8 @@ JFMでは$\size{bc}$は必ずゼロ\footnote{前節にある通り,文字コ \item 128より小さいとき\\ このワードを実行した後,次のステップまでスキップする ワード数を示す - \footnote{「スキップ」(SKIP)は,元々アスキーの公式ページ - \texttt{http://ascii.asciimw.jp/pb/ptex/tfm/jfm.html}に文書化 - されてはいたが,実際には(p)PLtoTFの\node{glue\_kern}テーブル内で - SKIP命令を使用することができず,\pTeX{}もやはりSKIP命令を - サポートしていなかった. - 2018年2月の日本語\TeX{}開発コミュニティの改修により, - 新たにサポートが開始された.}. + \footnote{日本語\TeX{}開発コミュニティによって新たにサポート; + 詳細は第\ref{jfm-new}節を参照.}. \end{itemize} \item[第2バイト] (\node{char\_type}) \begin{itemize} @@ -238,6 +224,67 @@ JFMでは$\size{bc}$は必ずゼロ\footnote{前節にある通り,文字コ % 上下位置補正に \fontdimen5 の値が用いられるらしい.他には? \end{dangerous} +\subsection{日本語\TeX{}開発コミュニティによる新仕様}\label{jfm-new} +長らくJFMフォーマットは株式会社アスキーが開発した当初仕様のままであったが, +2018年1月から2月にかけ,日本語\TeX{}開発コミュニティは下記の3点につき +JFMフォーマットの仕様を拡張した. +\begin{enumerate} + \item \node{char\_type}テーブルへの3バイトの文字コード格納 + \item \node{glue\_kern}テーブルでのスキップ(SKIP)コマンド使用 + \item \node{glue\_kern}テーブルでの再配置(rearrangement) +\end{enumerate} +和文JFMでこれらの拡張機能が使われている場合は\pTeX~p3.8.0以上が必要である. + +\subsubsection{\node{char\_type}テーブルへの3バイトの文字コード格納} +\node{char\_type}テーブルの各エントリーは1ワード(=4バイト)で +構成されるが,オリジナルの仕様では +\begin{itemize} + \item 上位半ワードに文字コード(符合位置),下位半ワードに文字タイプを持つ +\end{itemize} +であった. +\pTeX{}では内部処理にJISが用いられ,JFMで扱う文字コードは2バイトが +上限だったため十分であったが,\upTeX{}でBMP超えの3バイトの文字を +JFMで扱うことができなかった.また,オリジナルの仕様では文字タイプ用に +下位半ワードが確保されている一方で,文字タイプの上限は255なので +実はその上位バイトは常に\code{00}であり,勿体なかった. + +そこで,日本語\TeX{}開発コミュニティの新仕様(2018年1月)では +\begin{itemize} + \item 上位3バイトに文字コード(符合位置),下位1バイトに文字タイプを持つ + \item 文字コードは,それが16進数24bit(3バイト)で\code{0xABcdef}と + 表されるとき,テーブルには\code{cd ef AB}として格納される +\end{itemize} +とした.オリジナルの仕様で常に\code{00}だったバイトが +「実は文字コードの上位だった」と解釈することにして, +3バイト(U+10000以上)の文字コードで不足する1バイトを確保したのである. +これにより,新仕様はオリジナルの仕様の上位互換であることが保証されている. + +\subsubsection{\node{glue\_kern}テーブルでのスキップ(SKIP)コマンド使用} +「スキップ」(\code{SKIP})は,元々アスキーの公式ページ +\footnote{\texttt{https://asciidwango.github.io/ptex/tfm/jfm.html}} +% 旧: http://ascii.asciimw.jp/pb/ptex/tfm/jfm.html +に文書化されてはいたが,実際には(p)PLtoTFは\code{GLUEKERN}プロパティ内で +\code{SKIP}命令を受け付けず,\pTeX{}もやはりJFMの\code{SKIP}命令を +サポートしていなかった.2018年2月の日本語\TeX{}開発コミュニティの改修により, +新たにサポートが開始された. + +\subsubsection{\node{glue\_kern}テーブルでの再配置(rearrangement)} +「再配置」は,サイズが256を超える大きな\node{glue\_kern}テーブルを +格納するための方策であり,欧文TFMの\node{lig\_kern}テーブルにおける +それと同様である.2018年2月に日本語\TeX{}開発コミュニティによって, +\pTeX{}及びpPLtoTFで新たにサポートされた. + + +\section{JPLファイル}\label{jpl-format} + +TFMはバイナリ形式であるが,これをプロパティ(特性)という概念を使って +テキスト形式で視覚化したものがPL (Property List)ファイルである. +同様に,JFMをテキスト形式で視覚化したものが +\emph{JPL (Japanese Property List)}ファイルである. +JPLファイルでもPLファイルと同じく,拡張子は\code{.pl}が用いられる. + + +% -- tables begin \DeleteShortVerb{|} \begin{table}[tbp]\small \caption{JFMファイルの構成\label{構成}} @@ -307,31 +354,151 @@ $\size{ng}$ & $\size{np}$ \\ \hline \end{minipage} \end{table} \MakeShortVerb*{|} +% -- tables end +\clearpage -\section{JPLファイル} - -TFMはバイナリ形式であるが,これをプロパティ(特性)という概念を使って -テキスト形式で視覚化したものがPL (Property List)ファイルである. -同様に,JFMをテキスト形式で視覚化したものが -\emph{JPL (Japanese Property List)}ファイルである. -JPLファイルでもPLファイルと同じく,拡張子は\code{.pl}が用いられる. - - -\section{JFMを扱うプログラム} +\section{JFMを扱うプログラム}\label{jfm-program} \pTeX と\upTeX ,あるいはそれらが生成したDVIを扱うプログラムが JFMを扱うのは当然であるが,ここではJFMおよび関連するフォントフォーマットを 扱うことに特化したプログラムの主なものを挙げる. -%\subsection{pPLtoTF, upPLtoTF} - -%\subsection{pTFtoPL, upTFtoPL} - -%\subsection{chkdvifont} - -%\subsection{jfmutil} - -%\subsection{makejvf} +\subsection{pPLtoTF, upPLtoTF} + +テキスト形式のJPLファイルをバイナリ形式のJFMファイルに変換する.いずれも +欧文\TeX 用の\code{pltotf}の上位互換であり,入力ファイルが欧文用のPLファイルで +あれば欧文用のTFMを生成し,和文用のJPLファイルであれば和文用のJFMを生成する. + +\code{ppltotf}と\code{uppltotf}の違いは,エンコーディングである. +\begin{itemize} + \item \code{ppltotf}: 常に\textbf{JIS}コードでエンコードされたJFMを生成するため, + \pTeX 用のJFM生成には多くの場合\code{ppltotf}コマンドが用いられる. + \item \code{uppltotf}: デフォルトでは\textbf{Unicode}(UCS-4の下位3バイト)で + エンコードされたJFMを生成するため,主に\upTeX 用のJFM生成に用いられる. +\end{itemize} + +\code{ppltotf}においては,\code{-kanji}オプションで +入力JPLファイルの文字コードを指定できる +(有効な値は\code{euc}, \code{jis}, \code{sjis}, \code{utf8}). +\code{uppltotf}でも\code{-kanji}オプションが同じく使えるが, +同時にJFMのエンコードもJISになる(従って\code{ppltotf}と同じ挙動を示す)ことに注意 +\footnote{\code{uppltotf}における規定値は\code{uptex}であり, +この場合はJFMがUnicodeでエンコードされる.}. + +\subsection{pTFtoPL, upTFtoPL} + +バイナリ形式のJFMファイルをテキスト形式のJPLファイルに変換する.いずれも +欧文\TeX 用の\code{tftopl}の上位互換であり,入力ファイルが欧文用のTFMであれば +欧文用のPLファイルを生成し,和文用のJFMであれば和文用のJPLファイルを生成する. + +\code{ptftopl}と\code{uptftopl}の違いは,やはりエンコーディングである. +\begin{itemize} + \item \code{ptftopl}: 入力JFMファイルを常に\textbf{JIS}コードで解釈するため, + \pTeX 用のJFMデコードには多くの場合\code{ptftopl}コマンドが用いられる. + \item \code{uptftopl}: 入力JFMファイルをデフォルトでは\textbf{Unicode}で解釈するため, + 主に\upTeX 用のJFMデコードに用いられる. +\end{itemize} + +\code{ptftopl}においては,\code{-kanji}オプションで +出力JPLファイルの文字コードを指定できる +(有効な値は\code{euc}, \code{jis}, \code{sjis}, \code{utf8}). +\code{uptftopl}でも\code{-kanji}オプションが同じく使えるが, +同時にJFMもJISコードで解釈される(従って\code{ptftopl}と同じ挙動を示す)ことに注意 +\footnote{\code{uptftopl}における規定値は\code{uptex}であり, +この場合はJFMがUnicodeで解釈される.}. + +\subsection{chkdvifont} + +\TeX\ Live 2019で追加された比較的新しいコマンドであり, +TFM/JFMファイルの簡単な情報を表示する機能を持つ(\OMEGA 用のOFMファイルにも対応). + +実行例を示す(注意:ファイル名の拡張子は省略不可.また,ファイルが +現在のディレクトリにない場合は,フルパスの指定が必要). + +\paragraph{欧文TFMの場合} +\begin{verbatim} +$ chkdvifont cmr10.tfm + "cmr10" is a tfm file : 0 -> 127 + checksum = 4BF16079 + design size = 10485760 2^{-20} points = 10 points +\end{verbatim} +一行目の表示から, +欧文TFMであることと$\size{bc}=0$,$\size{ec}=127$であることが読み取れる. + +\paragraph{和文横組用JFMの場合} +\begin{verbatim} +$ chkdvifont jis.tfm + "jis" is a jfm file : 0 -> 5 + checksum = 00000000 + design size = 10485760 2^{-20} points = 10 points +\end{verbatim} +和文(横組用)JFMであることと$\size{bc}=0$,$\size{ec}=5$であることが読み取れる. + +\paragraph{和文縦組用JFMの場合} +\begin{verbatim} +$ chkdvifont upjisr-v.tfm + "upjisr-v" is a jfm(tate) file : 0 -> 5 + checksum = 00000000 + design size = 10485760 2^{-20} points = 10 points +\end{verbatim} +和文縦組用JFMであることと$\size{bc}=0$,$\size{ec}=5$であることが読み取れる +\footnote{\code{upjisr-v.tfm}は\upTeX 用JFMであるが, +原理的に\pTeX 用と\upTeX 用のJFMは区別できない.}. + +\paragraph{和文JFMの拡張機能が使われている場合} +第\ref{jfm-new}節で述べたとおり,日本語\TeX 開発コミュニティによって +下記の3点につきJFMフォーマットの仕様が拡張されている. +\begin{enumerate} + \item \node{char\_type}テーブルへの3バイトの文字コード格納 + \item \node{glue\_kern}テーブルでのスキップ(SKIP)コマンド使用 + \item \node{glue\_kern}テーブルでの再配置(rearrangement) +\end{enumerate} +和文JFMでこれらの拡張機能が使われている場合は\pTeX~p3.8.0以上が必要であるが, +この情報も表示される(下の例は再配置あり): +\begin{verbatim} +$ chkdvifont upphiraminw3-h.tfm + "upphiraminw3-h" is a jfm file : 0 -> 146 + New features in pTeX p3.8.0 / JFM 2.0: + + rearrangement in glue_kern + checksum = 00000000 + design size = 10485760 2^{-20} points = 10 points +\end{verbatim} + +\subsection{makejvf} + +JFMファイルを基にして,VF (virtual font)を生成するプログラムである. +\code{makejvf}が生成する和文VFの目的は以下のとおりである: +\begin{itemize} + \item \pTeX や\upTeX で使われる多くのJFMでは,約物類(かっこ,句読点など)の文字幅を + 半角幅として定義し,見た目の空白をグルーやカーンの挿入によって実現している. + 例えば``(''のような左に空きがある括弧類は,左半分は文字の一部として扱わず, + 「グルーによる半角分の右シフト」と「半角幅の\inhibitglue (」として扱っている. + \item 一方,DVIからPostScriptやPDFへ変換時に使われる実際のフォントでは, + 約物類も全角幅でデザインされている.そのため,DVIに配置された + ``(''を実際のフォントの``(''に安直に置き換えると,想定よりも右にずれた + 位置に出力されてしまう. + \item この位置ずれを補正するため,欧文フォントの合成や置換に実用されている + VF(仮想フォント)という仕組みを和文フォントにも応用する. + 例えばVF中に「``(''は左に半角分ずらして置き換える」という記述を追加することで, + DVIドライバがそれを解釈して位置補正できるようにする. +\end{itemize} +詳細はマニュアル|makejvf.1|(英語版)を参照してほしい. + +\subsection{jfmutil} + +JFMおよび和文VFを操作する種々の機能を提供するPerlスクリプトである. +主な機能は以下のとおり: +\begin{itemize} + \item 和文の仮想フォント(VFとJFMの組)に対応する独自仕様の + テキスト形式(ZVP形式)と,仮想フォントとの間の相互変換. + 欧文の仮想フォント(VFとTFMの組)とテキスト形式(VPL形式)との間を + 相互変換する|vftovp|/|vptovf|の和文版に相当する. + \item 和文・欧文問わず,VFそれ単独に対応する独自仕様の + テキスト形式(ZVP0形式;ZVP形式のサブセット)と,VFとの間の相互変換. + \item 和文の仮想フォント(VFとJFMの組)を別の名前で複製する機能. + VF中に記録された参照先のJFM名も適切に変更される.多書体化などに有用. +\end{itemize} +詳細は公式ドキュメントを参照してほしい. \end{document} diff --git a/info/ptex-manual/ptex-guide-en.pdf b/info/ptex-manual/ptex-guide-en.pdf index 6228a3f4b5..eec4e67a3a 100644 Binary files a/info/ptex-manual/ptex-guide-en.pdf and b/info/ptex-manual/ptex-guide-en.pdf differ diff --git a/info/ptex-manual/ptex-guide-en.tex b/info/ptex-manual/ptex-guide-en.tex index 7e7eab90ba..66c651cc76 100644 --- a/info/ptex-manual/ptex-guide-en.tex +++ b/info/ptex-manual/ptex-guide-en.tex @@ -270,7 +270,10 @@ but may also apply to other countries: they do without driver options unless really needed. For example, the convention of having a global driver option does no harm even when no driver-dependent package is used, but - some users choose to omit a driver option to avoid a warning: + some users choose to omit a driver option to avoid a warning\footnote{% + Since \LaTeXe~2020-02-02, this warning is effectively gone. This is due + to preloading of \Pkg{expl3} into the format, and the driver-dependent + code of \Pkg{expl3} interprets the global driver option.}: \begin{verbatim} LaTeX Warning: Unused global option(s): [dvipdfmx]. @@ -332,19 +335,25 @@ both two drivers. A DVI file which is output by \pTeX\ can be converted directly to a PDF file using dvipdfmx. -% [TODO] Mention kanji-config-updmap for font setup +For Japanese fonts to be used in the output PDF, dvipdfmx refers to +|kanjix.map| generated by the command |updmap|. +You can use the script |kanji-config-updmap| to change font settings; +please refer to its help message or documentation. \subsubsection{Using \emph{dvips}} A DVI file which is output by \pTeX\ can be converted to a PostScript file using dvips. -% [TODO] Mention kanji-config-updmap again +For Japanese fonts to be used in the output PostScript, dvips refers to +\code{psfonts.map} generated by the command \code{updmap}. +You can use the script |kanji-config-updmap| to change font settings; +please refer to its help message or documentation. The resulting PostScript file can then be converted to a PDF file using Ghostscript (ps2pdf) or Adobe Distiller. When using Ghostscript, a proper setup of Japanese font must be done before converting PostScript into PDF. -An easy solution for the setup is a script |cjk-gs-integrate| +An easy solution for the setup is to run a script |cjk-gs-integrate| developed by Japanese \TeX\ Development Community. \section{Programming on \pTeX\ family} @@ -448,10 +457,12 @@ Knuthian \TeX; however, it is enabled in \pTeX\ family. \csitem[\.{euc}] \csitem[\.{ifdbox} \New{p3.2 (\TL2011)}] \csitem[\.{ifddir} \New{p3.2 (\TL2011)}] + \csitem[\.{ifjfont} \New{p3.8.3 (\TL2020)}] \csitem[\.{ifmbox} \New{p3.7.1 (\TL2017)}] \csitem[\.{ifmdir}] \csitem[\.{iftbox}] \csitem[\.{iftdir}] + \csitem[\.{iftfont} \New{p3.8.3 (\TL2020)}] \csitem[\.{ifybox}] \csitem[\.{ifydir}] \csitem[\.{inhibitglue}] @@ -754,7 +765,7 @@ is as follows: Short version: \begin{itemize} \item With \epTeX~191112 or later (\TL2020), - you can use expandable primitives \.{Uchar} and \.{Ucharcat} + you can use expandable primitives \.{Uchar} and \.{Ucharcat}. \item Otherwise, use the ``\.{kansuji} trick''. \end{itemize} @@ -803,10 +814,15 @@ the ``\.{kansuji} trick'' and the ``\.{lowercase} trick'' should be used complementarily. \paragraph{\.{Uchar}, \.{Ucharcat}} -The ``\.{kansuji} trick'' above include an assignment of \.{kansujichar} +The ``\.{kansuji} trick'' above includes an assignment of \.{kansujichar} which is unexpandable. \epTeX~191112 or later (\TL2020) provides expandable primitives \.{Uchar} and \.{Ucharcat}, which are derived from \hologo{XeTeX}. +Regardless of their names, and unlike \hologo{XeTeX} or \hologo{LuaTeX}, +these primitives do \emph{not} necessarily take +a Unicode value as an argument. +These primitives in \epTeX\ and \eupTeX\ take a valid character code +(see \ref{kanji-internal}) based on the internal kanji encoding. \begin{simplelist} \csitem[\.{Uchar} ] diff --git a/info/ptex-manual/ptex-manual.pdf b/info/ptex-manual/ptex-manual.pdf index 6c35fa4654..681ba5f40a 100644 Binary files a/info/ptex-manual/ptex-manual.pdf and b/info/ptex-manual/ptex-manual.pdf differ diff --git a/info/ptex-manual/ptex-manual.tex b/info/ptex-manual/ptex-manual.tex index f298c03870..1c69ab24a0 100644 --- a/info/ptex-manual/ptex-manual.tex +++ b/info/ptex-manual/ptex-manual.tex @@ -64,15 +64,31 @@ \date{version p\the\ptexversion.\the\ptexminorversion\ptexrevision,\today} \maketitle -本ドキュメントは,日本語\TeX 開発コミュニティ版の\pTeX% -~p\the\ptexversion.\the\ptexminorversion\ptexrevision -についてまとめたものである. -オリジナルのASCII~\pTeX\footnote{最新版はp3.1.11 (2009/08/17). - \url{https://asciidwango.github.io/ptex/}}とは +本ドキュメントは,日本語\TeX 開発コミュニティ版の +\pTeX~p\the\ptexversion.\the\ptexminorversion\ptexrevision +(以下,「コミュニティ版\pTeX 」)についてまとめたものである. +\pTeX はもともとアスキー株式会社によって開発された\footnote{最新版は +p3.1.11 (2009/08/17).\url{https://asciidwango.github.io/ptex/}}ので, +しばしば「ASCII \pTeX 」と呼ばれる. +コミュニティ版\pTeX は,ASCII \pTeX に幾つかの改良を加えた +「ptexenc版\pTeX\footnote{2004年から2011年まで開発されていた, +UNIX向け日本語\TeX ディストリビューションptetexや後継のptexliveの +一部であった.なお,バージョン番号はASCII~\pTeX と同じとされた.}」を +基にしている.そのため,オリジナルのASCII~\pTeX とは 動作が異なる点もあるので注意されたい. +\begin{itemize} + \item コミュニティ版\pTeX の開発元:\\ + \url{https://github.com/texjporg/tex-jp-build/} + \item 本ドキュメントの開発元:\\ + \url{https://github.com/texjporg/ptex-manual/} +\end{itemize} -\emph{\large 本ドキュメントはまだまだ未完成です.} +なお,本ドキュメントで述べる\pTeX のプリミティブや拡張機能は, +一般に「\pTeX 系列」と呼ばれる\epTeX, \upTeX, \eupTeX でも +そのまま利用可能である.\upTeX, \eupTeX については +文字コードや和文文字トークンの扱いが異なるので,簡単に注記してある. +\newpage \tableofcontents \newpage @@ -86,49 +102,70 @@ \section{\pTeX で利用可能な文字} \label{sec:ptexchar} -\TeX82で扱える文字コードの範囲は0--255であった. -\pTeX ではこれに加えてJIS X 0208の文字も利用可能であり, -以上の文字集合が欧文文字と和文文字に区別されて扱われる. +% このマニュアルを英語化する際は以下も参照. +% http://tutimura.ath.cx/ptexlive/?ptexenc%2FDetails +% http://ajt.ktug.org/assets/2008/5/1/0201tsuchimura_kuroki.pdf +% https://oku.edu.mie-u.ac.jp/tex/mod/forum/discuss.php?d=460 -[TODO] 欧文文字とは何か,和文文字とは何か +\TeX82で扱える文字コードの範囲は0--255であった. +\pTeX ではこれに加えてJIS~X~0208の文字も利用可能になっている. -% https://oku.edu.mie-u.ac.jp/tex/mod/forum/discuss.php?d=460#p2422 -% あたりによると,以下のようになるが,今も正しいのか? -% -% \pTeX への入力は,「7ビットASCII文字集合」に「ISO-2022-JP (jis),EUC-JP (euc), -% Shift-JIS (sjis)またはUTF-8 (utf8)のいずれかでエンコードされた -% JIS X 0208の文字集合」を加えたものとして解釈される. +\pTeX への入力は\emph{「7ビットASCII文字集合」に +「ISO-2022-JP (jis),EUC-JP (euc),Shift-JIS (sjis)または +UTF-8 (utf8)のいずれかでエンコードされたJIS~X~0208の文字集合」を +加えたもの}として解釈される. +なお,入出力ファイルの文字コードは,起動時のオプション|-kanji=|に +よって指定できる(可能なの値は|utf8|,|euc|,|sjis|,|jis|). -\pTeX は,入力をEUC-JPまたはShift-JISのいずれか(後述)の -内部コードに変換して取り扱う.和文文字の内部コードとして -許される整数は$256c_1+c_2$,但し$c_i\in C_i$であり,ここで -\begin{description} - \item[内部コードがEUC-JPのとき] +そして,以下の規則により欧文文字と和文文字に区別して取り扱われる. +なお,内部コードは|-kanji-internal=|によって変更できる +(可能な値は|euc|,|sjis|)が,こちらはini modeでのフォーマット作成時 +に限られ,virtual modeでは不可である(フォーマットの内部コードと実際の +処理の整合性をとるため,\pTeX\ p3.8.2以降の仕様). +\begin{itemize} + \item 7ビットASCII文字集合は欧文文字として扱われる. + \item 最上位ビットが1の場合,\pTeX はそのバイトで始まる列について + EUC-JPまたはShift-JISのいずれかの内部コードへの変換を試みる. + 和文文字の内部コードとして許される整数は + $256c_1+c_2$,但し$c_i\in C_i$であり,ここで + \begin{description} + \item[内部コードがEUC-JPのとき] $C_1=C_2=\{\hex{a1},\dots,\hex{fe}\}$. - \item[内部コードがShift-JISのとき] + \item[内部コードがShift-JISのとき] $C_1=\{\hex{81},\dots,\hex{9f}\}\cup\{\hex{e0},\dots,\hex{fc}\}$,\\ $C_2=\{\hex{40},\dots,\hex{7e}\}\cup\{\hex{80},\dots,\hex{fc}\}$. -\end{description} -である.この内部コードのパターンに合えば和文文字として扱われ, -合わなければ欧文文字として扱われる. + \end{description} + である.この内部コードのパターンに合えば和文文字として扱われ, + 合わなければ8ビット欧文文字のバイト列として扱われる.\footnote{例えば, + 入力ファイルの文字コードがUTF-8の場合,JIS~X~0208にない文字は + UTF-8のバイト列として読み込まれる.} +\end{itemize} % 参考:kanji.c の |is_char_kanji| の実装 -入力ファイルの文字コードがUTF-8の場合,JIS X 0208にない文字は -UTF-8のバイト列として読み込まれる. +% [TODO] 8ビット欧文文字の ^^ab 形式への変換について -% このマニュアルを英語化する際は以下も参照. -% http://tutimura.ath.cx/ptexlive/?ptexenc%2FDetails -% http://ajt.ktug.org/assets/2008/5/1/0201tsuchimura_kuroki.pdf -% https://oku.edu.mie-u.ac.jp/tex/mod/forum/discuss.php?d=460 +\begin{dangerous} + 以上で述べた「内部コードの範囲」はJIS~X~0213の漢字集合1面(Shift-JISの場合は2面も)を + まるまる含んでいるが,\emph{\pTeX はJIS~X~0213には対応していない.} -\pTeX の入力ファイルの文字コードは,起動時のオプション|-kanji|によって -変更できる(可能な値は|utf8|,|euc|,|sjis|,|jis|). -同様に,内部コードは|-kanji-internal|オプションによって変更できる -(可能な値は|euc|,|sjis|)が,こちらはini modeでのフォーマット作成時 -に限られ,virtual modeでは不可である(フォーマットの内部コードと実際の -処理の整合性をとるため,\pTeX\ p3.8.2以降の仕様). + JIS~X~0213で規定された「85区1点」の位置の文字を入力ファイル中に書いた場合, + \begin{description} + \item[文字コードがEUC,~Shift-JISの場合] DVIには29985~(\texttt{"7521})%" + 番の文字として出力される. + \item[文字コードがJISの場合] 「\verb+! Missing $ inserted.+」というエラーが発生する. + これは,\pTeX がJIS~X~0213の1面を指示するエスケープシーケンス + \texttt{1B 24 28 4F} (JIS2000), \texttt{1B 24 28 51} (JIS2004)を認識せず, + \texttt{24}~(\texttt{\$})を数式モード区切りと解釈してしまうためである. + \item[文字コードがUTF-8の場合] UTF-8のバイト列\texttt{E6 93 84}として読み込まれる. + \end{description} + なお,\.{char}により「\verb+\char\kuten"5521+」%" + のようにして区点コードを指定した場合は,DVIには29985~(\texttt{"7521})%" + 番の文字として出力される. + また,DVIに文字として出力されたからといって,それをPostScriptやPDFに変換したときに + 意図通りに出力されるかは全くの別問題である. +\end{dangerous} -\pTeX の入力ファイルの文字コードと内部コードは起動時のバナーから分かる. +\pTeX の入出力ファイルの文字コードと内部コードは起動時のバナーから分かる. 例えば \begin{verbatim} This is pTeX, Version 3.14159265-p3.8.0 (utf8.euc) (TeX Live 2018) @@ -136,15 +173,15 @@ This is pTeX, Version 3.14159265-p3.8.0 (utf8.euc) (TeX Live 2018) \end{verbatim} というバナーの場合は,|(utf8.euc)| から \begin{itemize} - \item 入力ファイルの(既定)文字コードはUTF-8(但し,JIS X 0208の範囲内) + \item 入出力ファイルの(既定)文字コードはUTF-8(但し,JIS~X~0208の範囲内) \item \pTeX の内部コードはEUC-JP \end{itemize} -という情報が見て取れる.入力ファイルの文字コードと内部コードが同じ場合は, +という情報が見て取れる.入出力ファイルの文字コードと内部コードが同じ場合は, \begin{verbatim} This is pTeX, Version 3.14159265-p3.8.0 (sjis) (TeX Live 2018) (preloaded format=ptex) \end{verbatim} -のように表示される(この例は,入力ファイルの文字コードと内部コードが +のように表示される(この例は,入出力ファイルの文字コードと内部コードが ともにShift-JISの場合). \begin{dangerous} @@ -162,31 +199,9 @@ virtual modeでは,起動直後にバナーを表示してから,フォー このようなウソは,\pTeX に限らず|(preloaded format=***)|でも見られる. \end{dangerous} -[TODO] \pTeX の内部コードはEUC-JPかShift-JISのいずれかであるが, -DVIファイル内の和文文字コードとしてはJISコードを出力する. +なお,\pTeX はDVIファイル内の和文文字コードとしてはJISコードを出力する. ただし,|\special|命令の文字列は内部コードで符号化されたバイト列として書き出される. -\begin{dangerous} - 以上で述べた「内部コードの範囲」はJIS~X~0213の漢字集合1面(Shift-JISの場合は2面も)を - まるまる含んでいるが,\emph{\pTeX はJIS~X~0213には対応していない.} - - JIS~X~0213で規定された「85区1点」の位置の文字を入力ファイル中に書いた場合, - \begin{description} - \item[文字コードがEUC,~Shift-JISの場合] DVIには29985~(\texttt{"7521})%" - 番の文字として出力される. - \item[文字コードがJISの場合] 「\verb+! Missing $ inserted.+」というエラーが発生する. - これは,\pTeX がJIS~X~0213の1面を指示するエスケープシーケンス - \texttt{1B 24 28 4F} (JIS2000), \texttt{1B 24 28 51} (JIS2004)を認識せず, - \texttt{24}~(\texttt{\$})を数式モード区切りと解釈してしまうためである. - \item[文字コードがUTF-8の場合] UTF-8のバイト列\texttt{E6 93 84}として読み込まれる. - \end{description} - なお,\.{char}により「\verb+\char\kuten"5521+」%" - のようにして区点コードを指定した場合は,DVIには29985~(\texttt{"7521})%" - 番の文字として出力される. - また,DVIに文字として出力されたからといって,それをPostScriptやPDFに変換したときに - 意図通りに出力されるかは全くの別問題である. -\end{dangerous} - \section{文字コードの取得と指定} \pTeX でも\TeX82と同様に, @@ -1016,8 +1031,9 @@ JFMファイルもTFMファイルと同様の情報を持つが, 用いる命令である. \begin{itemize} \item フォントを定義する際は,欧文フォント・和文の横組用フォント・ - 和文の縦組用のフォントのいずれも - |\font|, |\jfont|, |\tfont|のどれを用いても定義できる. + 和文の縦組用フォントのいずれも + |\font|, |\jfont|, |\tfont|のどれを用いても定義できる + (要求された実際のTFM/JFMに応じて,自動的にアサインされる). \item |\the|等で「現在のフォント」を取得する際には, |\jfont|で「和文の横組用フォント」を, |\tfont|で「和文の縦組用フォント」を返す. @@ -1042,6 +1058,43 @@ JFMファイルもTFMファイルと同様の情報を持つが, % https://twitter.com/zr_tex8r/status/1098594165573722112 \end{dangerous} +\begin{cslist} +\csitem[\.{ifjfont} <\,font>, \.{iftfont} <\,font>] + |\ifjfont|はが和文の横組用フォントかどうか, + |\iftfont|は和文の縦組用フォントかどうかを判定する. + 2020-02-05のコミット(r53681)で追加され, + \TeX~Live 2020の\pTeX~(p3.8.3)で利用可能である. + + これにより,例えば\.{HOGE}が和文フォントか否かは +\begin{verbatim} +\ifjfont\HOGE + (和文の横組用フォント) +\else\iftfont\HOGE + (和文の縦組用フォント) +\else + (欧文フォント) +\fi +\end{verbatim} + として判定できる. +\end{cslist} + +\begin{dangerous} + 上述のとおり,欧文フォント・和文の横組用フォント・ + 和文の縦組用フォントのいずれも|\font|一つで定義可能だが, + 定義したフォントが実際にどの種類だったかを知る手段は + バージョンp3.8.2までの\pTeX には存在しなかった. + % https://github.com/texjporg/tex-jp-build/pull/97 +\end{dangerous} + +\begin{dangerous} + ちなみに,\epTeX, \eupTeX には\.{iffontchar}プリミティブが存在する. + しかし,<\,font>が和文フォントか否かを判定するために + \texttt{\.{iffontchar}~<\,font>~256}などと第二引数に256以上の値を指定することはできない. + なぜなら,欧文フォントに対し第二引数に0--255以外の値を指定すると + 「\verb+! Bad character code (...).+」エラーが発生するからである. +\end{dangerous} + + \begin{cslist} \csitem[\.{jfam}=] 現在の和文数式フォントファミリの番号を格納する @@ -1087,7 +1140,7 @@ p3.1.2で復活したという経緯がある.}. \begin{dangerous} \ref{sec:ptexchar}節でも述べたように, - \emph{\pTeX はJIS X 0213には対応せず,JIS X 0208の範囲のみ扱える}. + \emph{\pTeX はJIS~X~0213には対応せず,JIS~X~0208の範囲のみ扱える}. [TODO] \.{kuten}, \.{jis}, \.{sjis}, \.{euc}が$-1$とならない範囲はどこ? \end{dangerous} @@ -1113,26 +1166,39 @@ p3.1.2で復活したという経緯がある.}. (ちょうど|\romannumeral|にゼロまたは負の値を与えた場合と同様). |\kansujichar|で指定できるのは「和文文字の内部コードとして有効な値」であり, - 無効な値(例えば\pTeX では,|`A|は欧文文字コードであり,和文文字コードではない) - を指定すると + 例えば\pTeX で|\kansujichar1=`A|のように無効な値(\pTeX において|`A|は + 欧文文字コードであり,和文文字コードではない)を指定すると \begin{verbatim} -! Invalid KANSUJI char ("41) +! Invalid KANSUJI char ("41). \end{verbatim} というエラーが発生する\footnote{\upTeX では0--127も含め, Unicodeの文字コードすべてが和文文字コードとして有効であり (|\kchar|で任意の文字コードを和文文字ノードに変換して出力できる), 基本的にこのエラーは発生しない.}. + また,|\kansujichar|の引数に許される値は0--9に限られ, + 例えば|\kansujichar10=`拾|とすると +\begin{verbatim} +! Invalid KANSUJI number (10). +\end{verbatim} + というエラーが発生する. + % エラーからのリカバリで,他の TeX82 プリミティブが + % I changed this one to zero. + % とするのに対し,\kansujichar では + % I'm skipping this control sequences. + % とスキップされ,値の代入は行われない. \end{cslist} \begin{dangerous} |\kansujichar|は整数値パラメータであるが,p3.8.2までは 「代入できるが取得はできない」という挙動であった (例えば|\count255=\kansujichar1|はエラー). -\iffalse %%%%% TL2019-hack \pTeX~p3.8.3で取得もできるように修正された(\cite{build93})が, 以前の\pTeX も考慮すると,値の取得は以下のようにするのが安全である: |\count255=\expandafter`\kansuji1| -\fi %%%%% TL2019-hack + % \count123=\kansujichar45 のように \kansujichar の引数が不正な場合は, + % ! Invalid KANSUJI number (45). + % のエラーを出し,リカバリは \kansujichar を無視した \count123=45 と同義になる. + % これは \kansujichar の代入時の挙動に合わせたものである. \end{dangerous} % luatexja.dtx より pTeX 用に移植 @@ -1377,11 +1443,9 @@ has been |\let| equal to a non-active character token. \bibitem{build36} aminophen, 「欧文文字の|\kansujichar|,|\inhibitxspcode|」, 2017/11/26,\\ \url{https://github.com/texjporg/tex-jp-build/issues/36} -\iffalse %%%%% TL2019-hack \bibitem{build93} aminophen, 「[ptex] reading |\kansujichar|」, 2019/10/14,\\ \url{https://github.com/texjporg/tex-jp-build/issues/93} -\fi %%%%% TL2019-hack \bibitem{build37} aminophen, 「和文のコントロールシンボル」, 2017/11/29,\\ \url{https://github.com/texjporg/tex-jp-build/issues/37} -- cgit v1.2.3