summaryrefslogtreecommitdiff
path: root/macros
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2023-04-12 03:01:14 +0000
committerNorbert Preining <norbert@preining.info>2023-04-12 03:01:14 +0000
commit45c7bac9080d91b53c686e776fc6217d7f139b86 (patch)
tree9dd0ad4713ddbc97580545398e8a3c84ac52bf49 /macros
parente6c62f5e4d4a4d5ab654dad1652e83a5a4a42891 (diff)
CTAN sync 202304120301
Diffstat (limited to 'macros')
-rw-r--r--macros/latex/contrib/photobook/photobook.cls85
-rw-r--r--macros/latex/contrib/photobook/photobook.pdfbin143035 -> 142873 bytes
-rw-r--r--macros/luatex/latex/piton/piton-french.pdf1370
-rw-r--r--macros/luatex/latex/piton/piton-french.tex3483
-rw-r--r--macros/luatex/latex/piton/piton.dtx10335
-rw-r--r--macros/luatex/latex/piton/piton.pdf6081
6 files changed, 10697 insertions, 10657 deletions
diff --git a/macros/latex/contrib/photobook/photobook.cls b/macros/latex/contrib/photobook/photobook.cls
index 74f8b8f5e1..8dfe501db3 100644
--- a/macros/latex/contrib/photobook/photobook.cls
+++ b/macros/latex/contrib/photobook/photobook.cls
@@ -1,10 +1,13 @@
%----------------------------------------------------------------------
%
+% photobook.cls
+% -------------
%
% This does the following:
% - sets up the document/pdf for viewing as a book
-% - adds support for page bleeds
-% - adds basic templates for image pages
+% - sets up page bleeds
+% - defines cells as basic template building blocks
+% - adds basic templates for image pages and spreads
%
%
% This file contains both the code and the reference, but in a slightly
@@ -22,7 +25,7 @@
% Docs are built by the Makefile, so reference it for more info.
%
% To make the reference use:
-
+%
% $ make pdf
%
%
@@ -33,32 +36,18 @@
% to edit it directly, edit the source instead.
%
%
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
%
-% XXX ASAP \bindingoffset should also affect fill/bleed images... (DONE)
-% ...shift the macros that optionally account for \bindingoffset to
-% account for \gutteroffset (DONE)
-% ...everything should respect \bindingoffset (DONE)
-% XXX ASAP add \gutteroffset and \gutterimageoffset to offset content
-% from the gutter
-% \gutterimageoffset is an additional offset added to bleed images...
-% ...currently \bindingoffset is used for both...
-% Q: should the gutter offsets be counted from the \bindingoffset???
-%
-% +-------------------------------=--
-% | . . . =
-% | . . . =
-% | . . <-> \bindingoffset
-% | . . . =
-% | . <--> = \gutteroffset
-% | . . . =
-% | <--> . = \gutterimageoffset
-% | . . . =
-% +-------------------------------=--
-%
-% XXX DOC...
-%
-%
+% XXX ASAP should cover/jacket/endpaper/spread templates/cells account
+% for \bindingoffset (likely no) and/or \gutteroffset ???
+% ...especially relevant to endpaper/spread...
+% XXX ASAP revise how bleeds are handled by cells...
%
+% XXX captions behave in an odd way...
+% the internal (macro) minipage for some reason does not affect text
+% justification while adding a minipage in the macro argument works
+% as expected -- some odd input mode???
+% XXX Q: should \blockwidth include \bindingoffset (current) or not???
% XXX revise \clearcaption / \captionclearpage...
% XXX unify API -- see CellContent env...
% XXX make this loadable both as a class and as a package...
@@ -68,7 +57,8 @@
% - general macros -- \usecell{..}
% - templates -- \ImagePage{..}
% XXX see where we need to \ignorespaces...
-% XXX might be a good idea to add a spine calculator...
+% XXX might be a good idea to add a spine calculator (auto)...
+% ...i.e. input paper and cover board thickness and auto-calc spine...
% XXX might be fun to add a 'box' layout to build book boxes...
% XXX add a grid cell / image cell (???)
% make it trivial to define AxB cell layouts and fill them (fully/partially)
@@ -80,17 +70,6 @@
% - pre-print
% - customizing
% - extending
-% XXX add basic page templates:
-% - acknowledgements
-% Fields
-% - \Title
-% - \Authors
-% - \Thanks
-% - \ISBN
-% - \Edition / \Issue
-% - \CopyrightNotice
-% - ...
-% - info
% XXX DOC add notes about external libs section:
% - textpos
% cell/cell* depend on absolute mode being set globally
@@ -100,8 +79,8 @@
%%% NOTE: \def\<module-name>@[A-Z]+ macros will be visible to both the
%%% code and the generated docs...
-\edef\photobook@FILEVERSION{v0.1.17}
-\edef\photobook@FILEDATE{2023-04-09}
+\edef\photobook@FILEVERSION{v0.1.18}
+\edef\photobook@FILEDATE{2023-04-11}
%% \documentclass{ltxdoc}
@@ -249,7 +228,6 @@
%% \DescribeMacro{blockheight=<len>}
%% \DescribeMacro{bindingoffset=<len>}
%% \DescribeMacro{gutteroffset=<len>}
-%%% \DescribeMacro{gutterimageoffset=<len>}
%% \DescribeMacro{bleed=<len>}
%
%% This is similar to what |geometry| does, but adds bleed support.
@@ -271,7 +249,7 @@
%% . | blockheight . . = . |
%% . | . | . . <--> bindingoffset |
%% . | | . . = . |
-%% . | . . . . . . | . <--> gutteroffset v
+%% . | . . . . . . | . <--> gutteroffset v
%% . | v . . = .
%% . +-----------------------------------------+----- ^ . . ---
%% . . . . | bleed
@@ -295,7 +273,6 @@
\DeclareStringOption{blockheight}
\DeclareStringOption[0pt]{bindingoffset}[0mm]
\DeclareStringOption[0pt]{gutteroffset}[0mm]
-\DeclareStringOption[0pt]{gutterimageoffset}[0mm]
\DeclareStringOption[5mm]{bleed}[5mm]
%% \DescribeMacro{flatfold=<len>}
@@ -332,6 +309,7 @@
%% \DescribeMacro{endpaper}
%% \DescribeMacro{cover}
%% \DescribeMacro{jacket}
+%%% \DescribeMacro{web}
%
%% Sat page layout mode.
%
@@ -821,7 +799,6 @@
\setlength\bindingoffset{\photobook@bindingoffset}
%% \DescribeMacro{\gutteroffset=<len>}
-%%% \DescribeMacro{\gutterimageoffset=<len>}
%
%% Gutter offsets
%%
@@ -830,8 +807,6 @@
%%
\newlength\gutteroffset
\setlength\gutteroffset{\photobook@gutteroffset}
-\newlength\gutterimageoffset
-\setlength\gutterimageoffset{\photobook@gutterimageoffset}
%% \DescribeMacro{\defaultfoldout=<fold-spec>}
%
@@ -992,7 +967,7 @@
\setlength\clearance{0pt}
-%% \DescribeMacro{\clearfoldoutbinding=<len>}
+%% \DescribeMacro{\clearfoldoutgutter=<len>}
%% \DescribeMacro{\clearfoldoutfold=<len>}
%% \DescribeMacro{\clearfoldoutedge=<len>}
%
@@ -1000,8 +975,8 @@
%%
%% For more info see \nameref{subsec:Foldout page cells} section.
%%
-\newlength\clearfoldoutbinding
-\setlength\clearfoldoutbinding{8mm}
+\newlength\clearfoldoutgutter
+\setlength\clearfoldoutgutter{8mm}
\newlength\clearfoldoutfold
\setlength\clearfoldoutfold{5mm}
\newlength\clearfoldoutedge
@@ -3132,7 +3107,7 @@
%% automatically calculated and missing folds are the same as the previous
%% fold or the default if no folds are specified.
%%
-%% If not |<fold-spec>| is given, then the value of |\defaultfoldout| is
+%% If no |<fold-spec>| is given, then the value of |\defaultfoldout| is
%% used (default: |2|).
%%
%% \begin{minipage}{\textwidth}
@@ -3224,7 +3199,7 @@
%% \end{minipage}
%%
%
-%% \DescribeMacro{\clearfoldoutbinding=<len>}
+%% \DescribeMacro{\clearfoldoutgutter=<len>}
%% \DescribeMacro{\clearfoldoutedge=<len>}
%% \DescribeMacro{\clearfoldoutfold=<len>}
%
@@ -3235,7 +3210,7 @@
%%
%% \clearfoldoutedge <->
%% \clearfoldoutfold <->
-%% <--> \clearfoldoutbinding
+%% <--> \clearfoldoutgutter
%% (3) /\ (2)
%% +---------------------------------+ / \
%% +------------------------------- | /
@@ -3256,7 +3231,7 @@
%% \begin{verbatim}
%%
%% \clearfoldoutedge <-> /
-%% <--> \clearfoldoutbinding (3) /
+%% <--> \clearfoldoutgutter (3) /
%% \
%% +---------------------------------- \ (2)
%% +---------------------------------+ /
@@ -3420,7 +3395,7 @@
\ifnum \thephotobook@foldoutpanel = 2%
\setlength\photobook@foldout@maxpanelwidth{%
\photobook@foldout@maxpanelwidth
- - \clearfoldoutbinding}\fi%
+ - \clearfoldoutgutter}\fi%
% calculate widths...
\ifdim #1 = 0pt%
% first two panels do not need fold compensation...
diff --git a/macros/latex/contrib/photobook/photobook.pdf b/macros/latex/contrib/photobook/photobook.pdf
index 82e080074f..a6f4a5d2d1 100644
--- a/macros/latex/contrib/photobook/photobook.pdf
+++ b/macros/latex/contrib/photobook/photobook.pdf
Binary files differ
diff --git a/macros/luatex/latex/piton/piton-french.pdf b/macros/luatex/latex/piton/piton-french.pdf
index 89aee2d64a..9d1a1b1c27 100644
--- a/macros/luatex/latex/piton/piton-french.pdf
+++ b/macros/luatex/latex/piton/piton-french.pdf
@@ -228,20 +228,21 @@ endobj
<< /S /GoTo /D [ 133 0 R /Fit ] >>
endobj
136 0 obj
-<< /Filter /FlateDecode /Length 3574 >>
+<< /Filter /FlateDecode /Length 3578 >>
stream
xڽ[;$ WTx c'`z}3ۛ/a'NoA1s=4f[")H(sˏd{]E9h|'EE-,?]NAJ!oKgH~/_L|#s 2-L
-ZLOk,05M+N`P QG!xZ_]Jm?k"M
-^Xw=?=SU-VJJE󷲉2ǪܚHӨJJ1OE^c/-KGSŽ4PUȰKHlVBJ#ߛ*F~+MKRNP둾4+TЊuMl0D:9$"ލG6ϑ|J}Ѣ07@;Zи:VDG%6^HおMj4Dh?`cT#k [E
-|Rj|,ed]Ө"Udjs0]xR
-ǴP Vt)^M)EXKȆuv!{󗘆liLGVdd\Fy٦X#XKD[IzI)2`g>#-wf^5W9"lE)/
-"ˬFw?,9wnA9_AX.;/d){ԟ
-S5C &1Hf~pέ84R{;\?%ĿKҞʼJ6ݩVhzT#/Y3ku+Kve,lPT?ǭl![nӝVi)OcMYޙ#(ޞQw|Ü[?a\2i5;vm/ x 1=ə`Z3vr[%EI-te(}[>c |L1kt{ `1*d3*ReZe|}xVS
-3.:Rh{%^4].Jc|G9S4c|S|4 2{G He|lF3z)цp\Qzϥ-v]ǝ3ÙޑkٙJ)%e%wJh\zUCVTx\bKvB(|8+f{!v|O^4P+@Z& J}]\P^l5K1
-$;MA/lolJOiwdMט7\w(Y3M8qKB"_TD$tEw7\a%qYi<zNotPQcY1h)~GЪj'hGl5n5޶%:>跫smѾqn[Q=.U|ݏyy?|Y}^Jo|gcL_FBCRq޿|SfLɂ|ΙB,&bPk$/v L(% Jc=bXCkq|z].rt5Dm(3WKQzٿlz4 "ixc`i`[},٩W+c` [[玷c1OMA
-![}U.nMw¾5sqfشS]o>FmƷjV fT34ߢ)2}C^@so{ Qe93M\C)뵥[ygv]n ݻ/ OۭDrl/[{Xr7bئjۭb/u۝;m<F@ͯTUںj|@LGcLw~ힶ<\~[
-0~|֍ս)40Ѿ5$ٓ8wBNƧ8^]%m
--eLuJM@RG]u
+ZLOk,05M+N`P QG!xZ_]Jm?k"M
+4p^D>-Z1{^xRCϨW<<>낚*iK֕f +$9oÝڷG"#܎٦Me$GB_p^V)*z$ٷ vGS]ߡo-h)'4߄.m Kl̥ Sǜ^^EQCW\#h5vxk,J9V >=2ͬ#kO
+v3^GFA.W0JyfpF(^:YUMؠ1)d/k闾ZlzV,>
+w,ѬEc#^WI{J {pV܊ԂG̟̓Z5.=21Qp
+)]I]OTU 7RAl"LƱ;o=4ҬyLSK`q/Mb?Tzs,2)<~fQ~ʆpER2?kE&2Tz+͊
+86ؕnt
+ W
+JK}9:BN(?[«SB+LLld#s҄>&siN׹FJas'ё+d^~suWYSWƹ;^
+mY~jŝ
+tM4dMp}ӊ7-4iv);sa;u?c.`Wrsޑ~:̗K<fvNS!;93L~4`Nn0T o+>g)fn>F\{TSSZPбrJaѥ[WJb|`ċ"FEbA(0guJ|z}Xf(ɼSԣ2~h&^O8%ڐN+*TﹸEnk3=vf83~3;r-;S;cl{n_ ͔}K7{Yjr̂c]lZ|zގ{YT5wzl6BԮ4/pc)ًj%\_|X$A)O]RKõfwiW4Fd)EqyWM)nS`R06kS0k>niBTp\sDݿ>$n0+TGw`Sϩ|**y65=-ZUPmƭv/Dvv7~ynߘM57m+ǥ1ޡ3W=KiO?L>@_y\*OW)Y093\(DwͰW߀8$Ѯ dA)tY khtm0/]K¥USqB& wv)JO WRҭYCnm ¬4x{km ~k~p,3kj RHx11t+ Z3wom9lm0kN,nĽ'|Kv[
+
+,wYSkU_.*몞̵xw1)Y$~'h5i26hy}h0%^jw~:/
endstream
endobj
133 0 obj
@@ -363,26 +364,21 @@ endobj
<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F15 147 0 R /F62 150 0 R /F63 151 0 R /F65 152 0 R /F55 149 0 R /F54 148 0 R /F67 175 0 R /F53 146 0 R /F68 176 0 R /F22 154 0 R /F16 177 0 R /F32 156 0 R /F61 159 0 R >> /ProcSet [ /PDF /Text ] >>
endobj
184 0 obj
-<< /Filter /FlateDecode /Length 4171 >>
-stream
-xڵˎ$>_Q?D
-Mm!
-ҩ_ROVW)R}~+ _˗/P6 nz =QX€_AJ[&,&8?&l&lXfC 0JNx/֞8㝬cCH37Hn*"> ~5o~h^:G
-er&'q 't[9BbIi]A(oDcf,2{ie|aX[.qR77mYz.e:͒C0R8Þ9W*rx-#TЍ;u,jDpv^! )nZ7ڵ_(x}FZ|^DT~]#^{ʮ$ WD=ͩӰ-텲;-k24:*KJR~HO
->z!%ڮ=A6ӝz3"xniz
-ݰt3I~'R+ My}(z aN+^֗+eeSKS<` գjtvN I#vꅨ;muk5 ZюL\B_\Zs',_GU5q^"|S?FuYs͔Cѵ)WBݎk9~e;%Ÿl&6cLq9\4LOC896j=@ibs`IaeIj6'YX[b5
-7 mq2&"1a岂[pe-UVh`^qHqA(4gyd4nbS򾋩!xm
-X+<VO}S NykJT6
-Ow҉(Ȳ1$;YD ҈>?!C᫳Pc&/xHANDV{1s!HY;2gc}fRv~]qE^
-%>N8;gǗ5IuMBY%h񯍾E ]| .-9<z/!h0D N5ׇe`$drvi)*| <5R>Yӭ P`Ѷ b6>r KҮ[W !Q&G0׆ H ԛ42t$[g;<v٨HS> .uX<"#YEQ@OTK TCFO+)LQ54 .zKb)>U<K
-PoT`xĝ]U^^Ypeg.'C}ŵEvoum@Ry.{itE?]=lσay{,³iG0RvиR.i%iEv؞*Aň\{~溾bTe`)suIxedE 58(9gR,+jbQ\P}{VM]30A?ЍLK_hNGP!OwtncJ`<vb9 <40%T\r}
-D@sܚL0ڔDZ-݁eÒ!U
-MVz`~Yj08oUܓmS;EnԈVqӚsDN uF֤:\ iHHakهBKx EL+ ˉ(P2h?~ێCt3]$YlCV0I%
-ͨу5);]4}O1`Y+dh'!`0:A" U CK}Q?.g
-1]UMU'2FaI'Ho
-Z(EP(<sPڥ_p'c88vuHaB`]U*nGp2^xnA8A>DŽ[
-i.V셛8wmat? 9yTs)9XSтl#H
-荑i*M u)Wu{vm^A3'3R՜8Hk#)gEҟe9TJ:=7bo7oOqrY6rQ ԧR"uC3QLo
+<< /Filter /FlateDecode /Length 4168 >>
+stream
+xڵˎ$>_Q?`0goOICC|DR׳XvWDw~_nmI$ݾ0l+!ھU*uy|)O]~ Wx 2Vhl$jח+$q
+8,?ѕ>e:-Cmv=qTZWtֲhѻy"W;p2~qZyE}w y=kg\5<^S%l i<ߘE9LQER "?!* 4Cʴ]9A6v "xny8
+$.ߧzF t\
+Lq;4@qi)Hqե+􍭼3 7:#Um8Dxc)n
+̧h>5OҼ ],XFޢy+z߶`&i<=LDlig8j 
+6od%VJDJL4
+O@c&(s͐kf~7ZI
+efB\H[|)fv^H&I+DVx[: 6999xI_]e/MBL8<LiS}. ujHBo,S/Dphg¥pqOЪv$V*՚;qɝ:jɐ#ʈ%2wsnhQg5l8T]k<OX5w\];K+ɮey,/،1Qp%Y2^? ب)v|O2'EX+ʒlV0OfE෤f.>o0 g҄e>LHbݶJ.Zq9>y!i y<FEM1<}S9abuN[;N-F8W6q\q1Qߑ(#g)wQ˯!w MyDNP,LGW.1;q^E\ȭs;E2abf?6G̳l>9;?L n"FYOu un yrnݠ2c ZkePW(+ߢ&՜4Ll~s 2R0@rk)>aR y?)Jm,ұmNLD1,nJoo^.&{\PΑ#ᣰlJKGBu#iKJhi!9g(E>#]&Gv6k^*
+9Usg=EE4t,^%1fm^Rܱa9}4ZD%vuqV:6͸2 cdbv^V aҳ0^)7k.]5
+{$W.LVPI󈚃|&Ų6E _2΀zY-w^DDB7A0-r
+`|iF-
+ LHBH̦Ɂ;;U#9pzE,<=k8Ͼ`s*VyC}fiP@,=
+̢YDG< )nEl2gX$P v•N{1{&_E6VBMK6ZU>e37{gG׎XhSMŖ-WX9=(礃rO^H,2λ`THL|.BzbB(Ϩ9 3_d9\`~glq}9Sn̑;<NWF)"I;ALQ6ƞŜrxz,oj)Ww˰nT "NJ v
endstream
endobj
183 0 obj
@@ -418,19 +414,31 @@ endobj
194 0 obj
<< /Filter /FlateDecode /Length 4605 >>
stream
-xڵˎ#>_,H@v{ 9e3͞lC=w(,s>?|'q_g`OV&?O4PL)s_>g D
-Gi|{bw'H br5ƵxVt>)/XP[`+f<n-^~9/\%0\!DPr=tTmC58:ix%VN\j>ပ L|-tI)#I<~0%LǪ4QMB88MI|lfZ됪W4<͸`oYc}J>-q[YT(~{^f1*v]8Ǽ`o Vda!_ 54qL S(~La9F @96!C+~)f
-Yі$uedy@X
-2ql5G}X:Dm \$4=ʎğ2F3/ዔ5}x }^5cWuw i-H$nP SAL%*kGU_{J .8[H]ѵdR+06:
-hfRBN+w N``h`Fnx#]CG@rLp]cw 1V0QkjMGXw٤\5"T%^7<|d oTPrBKIFvٌz.rӝkFyB@4nyV}k)Ci?a5j+2uF("BN%Rѽ2%W6oްJծRT*Sp.BRrώt87q>U!܍cuWsfyEU A Cv"ixEε90R玲Td D$W`2-5p``2@EOGF
-ܴQR=R͕s*#]<g1Һm_&63;)yP+Gi~Mqڕ{ڇO
-R~: mpe_`Z ~eDY%p1maZ,o(r`#Xwu1]4)r>jG~f,]CřFO-Ag{L/qzF[ܤOrc+F{F"!IxbT7WWmXEF B1d;$+yPx@X4b:ҪU |JtEjfh \ /q >G.#;n\ 3f"fDJwB[D$W|]pj(خu~Z5 $+ y&_nh #ĐKs9T?a7K-.;s 7nOgbѲF;Mh1hpbݢ iHCqDM΀K906<OI 5Rք<!eh'YYʦ#AN~V*ŸX jfȼg l+beUƿ##fR{T{(0z)M\ƙ)ki۽ (k9mV ̥zxыWqT$eIʉꨢ
-io76uHcͰ%!@ˍPm?']8tHirD`Wdhő'PjYffw7ƍ"Evľs ;zjdHO==53a||1F%a&Ү
-2@Vo.VQ9>5 Hz;-1,0Bm#;u$>1Bݩ5y6ok}:[W6@iҫnh0Fi"8}dU:I @tu P1%
-Fhm^)Qw0P~4VUmSS 
-txR6/+">4YB;^kC-SDIZiHGJ)bo#cC#[.IwK|
->!mfU/<ݔ3I54< PZD
-Ɖ7m}a[[Ǟ)^c_s7oAcӗAve+G>P h(2T,}A,6ߧnŭN<<{3.3OԎq 撦ʄA2#'mwSy}.IҬA2/
+xڵˎ#>_,
+6˾%QLvduPM +k,AZ@d`қdjnc6Y
+{>j -Ni {(0=+ "v]xς`oVda! 4j&A4:r Orl=@VtCi`m@[ Iٓe)8$ڡ3w+U- x#ƭ92mUal !OK
+K H?.c e_W+ {UY'UR1U20j}j ʒJMv%Q_ʜ .0[*J]dRk0D:
+bd*
+G)1< m<<sQKɣͳu!|6fp+
+ eL*LJa q޿hIx2&'dI|]u*ɵzA}gۧta{*7-z JJ>F*ȧXc$$;fTp1TƊ_[\bB,pI)t#.UM'jHW3+PLpW)c 'u nc%_d)y3ci,aʟQT_'~%t{dQE74+:' 8lR- Fz8@hrLxcwJBĭD9Y6U՞NcOe/rQ9PǺgxޢCh'
+RAJ…`L\]q7d3ځ8ʓ-;Nz{yhV4
+
+F?kP ZC:"հů$# ]G"ˆ(PkpAV R< ifiq^ٚ׫ZVEuʔ:7cUJ-Yg:ݩh47q>b} *V`7W^lủQD#PT)V,ډ|^w
+
+F"7,x!˷6G.nW`iÑjaKkxbqy)Fv u.rE7Xܺ+WtȞo1xHR=A 5@+J%-HRU6>!J*΂x@X4b:2W
+}JtEfhD St_yAz6\18+Ewݸ[fD(S:"ULQ _YLEPpoȮWhTv, jga*@/&,
+& r43$as1ש:ED!nם[t[.">GluĢu 7w.Ю`б iUqW҈Ցhɛu>sD0OM G5b=!mq'E0Eہʶ#BmN~V*ŸXL.IgW TŔ7|u;*.G< G̤3`5}w 7,eB5vSә)O!kiݥ۽7Prͯ*~HK4tTde *Ucvp;N5MvP]޽/;JQj}/0༕[ե}bd^ FwYuvWLہI(Aw=;)=G'CH6K)a]a~˸1ps+IP,
+۹̟fQ4_uF\<.!d2'ܞo*)5-\/ˡ
+$Ffo5egHҿQrp律,D1V^ܭ{aq9+@.*;I:nXUB謥Z.`8? !fw in0olܤ-jR)sۤO?)->
+bz8+ p%;Sijr14RbJ6o/WlQyE> 9!$X(:c}R欠Pwa]^dUMzbڇ= >42V0Mk+m Qǩo6lN:ZuFsho
+y' bUod
+젔E- NBw68xU嶾i'%SQ @9
+7V#-@rB~[`ONY#=y^Mf)9k^7ʹj
+x;uCMnƲ-NQ[;Nʙ{3.2;^ n>uu/k/WX
+ȝ&ݠ1BU㒞]]E<&6[e܍ SkWJ SK|\ tcr(m
+}z],Cim.VlIXNm2ZkRn#xt۶e8ZNUwM~V12u
+8jn]>Z75
+eIzrZa8ɷ O2Lok홟@!|D +[G8pB#(P8!Xj)݊[xny:ga/\gVhA M%M?d)'T, ΤAmV|WJ2$YKtZ=[7(|O [,R->?%Äv'́ >89|{
endstream
endobj
193 0 obj
@@ -666,17 +674,22 @@ endobj
<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F63 151 0 R /F62 150 0 R /F15 147 0 R /F54 148 0 R /F67 175 0 R /F53 146 0 R /F55 149 0 R /F16 177 0 R /F32 156 0 R /F61 159 0 R /F48 157 0 R >> /ProcSet [ /PDF /Text ] >>
endobj
231 0 obj
-<< /Filter /FlateDecode /Length 3056 >>
-stream
-x[9o,+&xjfudXb5~#}==Zia,X_qᗟ?݄84hy".14Z\>~\~rse9ׯsyysz-OJo4 h(<k~RA|/i,o5O`IW[gS"G*2}*Pq҆=:UVV䌆'6T!'5
-
- I)]Yf-*?
-AepSq>^"EI.Mv+q*
-Ҍ冟v3)8<z%3^>I3 w\WKa%v!ϻpBF:z;:`PLX75ׄ^nκ+$ڢ6ѺU%Gg)j:(J\!MKk1K{i ~G;m"~[6O%R8ܜ~d²յ}\63ϩm[B$23,bc Jbw9Μr.㴪xQRb/iQ;Dya0e O  Ji:sA%fnMʵCÍ%TA׷I`2<dLd)ÂaMWV`5tpS7
-wImES(B@=dRQ NҪ3ecBEp3bn֝ĥ@kl4^u,eCjd(jR|4I.!Iw~MM}ܚGcv5ZZ(jd(6wZ4 nsh˞ mH j&r3+D^ۍ~eo Jmȭ-ӿE,;ίb+FY99k4Y/%>X20O4CƪB9HYEhDA.OvQ(F=RiEݵ g5>^9;pV86mf4a[т\9=
-666rMZjӀoƳ=4I:8m3Džxt9GI꽦c Bp" bG"IKa$B[q'0fcL[7BI"3Q^@*,RN$`}]f}|c)Ӣ4#/HrGx1:"LZ#fĘwC-mɅDʺm)mzB"xd'K0S|Y:hl]-ZШQ(~mFkC-(RZUypؚz(K߁)VJ3Q3jf]M놟o>q|{3
-|C &y<>AƼ9^mKQY‰SۆC_8yA-@B9阤'}.cE(߈wE[T[R#vo(9JšqѺg玈 a%
-E+Ř Xr!G֢͏ҷ=Gjm7n"ݻ4~bTx-RϯAШ">[G&}%Au~w 7:^ (ЛjR;$INJk#'廅1=h8ZO>&ύ{0qc)a1ք`q\̘Wm5nMY1c7hZ#1S؀mtZi2v.ⓊA1v
+<< /Filter /FlateDecode /Length 3144 >>
+stream
+x[Ɏ$ W$
+`|2ܷưv|׈؇("1~Ow/9-5\E ~2Z\}r\9r+pWI*_(I&0VD{UҿVS"ґ&T\>qذ_ɴ,P|  !3NLT`4RT,$]BqS?V|-cnI/Y)A08r(iK9ڰ4)&J$p Eѯנ&ep$
+*AQ%%Mf8<
+AzPjiB-J~I!I7\. 2oTr^Bp[-R3ؓGǝ<C~=VZ9p*Ͻŋf(%&
+!PL3]Yj)],Qߑ()Vv4HͨT$vj_<Hp}X#]YfY-8?<B'QhpKq>^*
+]R: 冟pLJ*=/ 2/<J;9M^/ ',`$f3GˉŽp
+* U,حb H@g1}/ 3{gʼ ҭ%QYvf7
+%^k-{R|{.BVBY +S+/@hTq[5`o*Y|2QdJjv#N5;5I;AAvKσ
+=}s゘bb<_:>S3IzZ<^iE6ҔWښjvڱ`C!vCy 戸cMh`'Q =B]Ab7qR1qW(QHN^ƎY},W=,=,In'*P/}$ BP?yՍ~R^q" b/
+(Aa#o.e/IrEP_xg?CXy 揿By!(0xpіDBEe
+kp3Vg\{{xNz]nˉnv oR |WQ&Y
+['U^j=4GYG>{v<C;wpNx5ivߎ~RcH?GֹA`*śz/H gVehnq}37=6 !aH UM
+MeƼrVM
+:J-4,6hZh1N l@zm''|ۼm uP _IS9
endstream
endobj
230 0 obj
@@ -689,28 +702,34 @@ endobj
<< /D [ 230 0 R /XYZ 79.37 771.024 null ] >>
endobj
77 0 obj
-<< /D [ 230 0 R /XYZ 79.37 388.053 null ] >>
+<< /D [ 230 0 R /XYZ 79.37 340.415 null ] >>
endobj
229 0 obj
<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F16 177 0 R /F15 147 0 R /F54 148 0 R /F62 150 0 R /F55 149 0 R /F70 187 0 R /F67 175 0 R /F32 156 0 R /F61 159 0 R >> /ProcSet [ /PDF /Text ] >>
endobj
236 0 obj
-<< /Filter /FlateDecode /Length 3891 >>
-stream
-xڽ#1߯PhK>
-ZeDZLf( "2uklT=a?)^HzvQ֮hgiy3n1>ϬrSzfΡT9b9%FTAQIXB UttGx Xf\qGAA2;CB[%8G̒_3'U%ݲs 4GS'sA\1:Wd(O\Ud~E3q#™~K\!JxV+{@싊w ,2tn [^?i^ڛH"[/be5RqkڢExqT_BH0]k82z6LQ$PJ"kOY_ޣUTMLZs#мn/GE2ryQeV91hj^=bHaCÇha:-Ѻ?6,%A!u;O&oD=CZGKKoEۈ"\UlKFHa1%YĎyS20'Wc_'$1MPld(5kb-=R,ɣOJ(m;#UDo[2PLL9(qmp<Wx GoaN1Bt]oU3Uv
-`̉qO5= 'Ddqc
-l%vn%10YhKa$N `9$Iw2|!S)BL|d)U[Bskko[E|#uD@6+UE(wonnk/ lHEfъ!1pY"Y +!${GRHA+M(9% RdHVwY
-%" צSܢrv-Pn/1sXn
-.C2ȱ }ooeإ@ɧ9'@ys
-ҨX;[0FLSbifDb\-AHУV*R%W*4'=mEMbzjt/k&ȇVR*-1SdB)h}rTԡr NOW13Rufli] $9M粍%-n%\gV`:
-r(H "bLM$cWl:}"hw *Q=(P͚.Z͡[ UrD4р
-vD,yiy\kĸyQ5[bY7Pga?詌eƋrX~(i!ks_M5n~7F ͔i649tzrg(Y 5Xtn.,a! ܊~72O5KxŽe8!0_K_dY_G/4eRعҼ9d.6ڟMWz~eݢ N?k
- sXw ckp%gx3VpvC S/N\! q]7 i
-0fǶdh|LlKO8TGB|e
-ۧsϬӗ}녃,q޿/UJ^ ]GCz ⲾH/XQ_ܑf;*V :n
-kSnڝ7wqTaYGzǜQ=,
-^=ʥ*OW T@ _x~6 ñC
+<< /Filter /FlateDecode /Length 3429 >>
+stream
+xڽ$1߯D7XZ1 G/ٰ 8(Hv jd~Z
+{E}}%xQK .)!|vUJ'Ԁ\~`7RK}//Rx _6V
+%S1ϕ&U Ei |ݼ#I[(x2l/񹢙
+ 9}9 Ƿ~J<[J'o]"r-9UcUX[9k:hxAY_˚:GZۗ
+\Zaħ#Prp23
+dOdAH@ȸÎuaG9Q򕴈̄L>V7(!X`V [giM=ݕZ緓&2ӌ~wCH+_p{d|a=6+sNdLGLR &pFynvSCk͕.?Q3";xgx­"3'Ykn-Gk4ݑ:i7] \ZU4>r5*f6LAZ+s:38޳ɡXsOxd@7H"i=7NNP ~;l>L1鮃d~С:o~*"7D'rƐ ɣтzU@[E5CoY^_Iʊjۮa&-1Y h9p̢B[i~':⟱FppĤ@'<{#16?x6*́Лf7 udHVdiy]hS+7ۼFmn!5{$Ңױ3YEw8 Qxg(^YZ=Q!FI砓eD{H|bSHD7x=1 j"z:U
+fk7d`7)hp:_yFƓ7,QUK,KdU?3W2
+h̙–yjzl#&N|BDf<F(f1T*;/r'1N
+mWY"όmxhݶc,3 >vl%GZU7d ѩU"IySFR|s .lDH*dȏeL"dY!/aԸ ? I>zWP90c
+$D
+$N yZ JLKQ"^9nQ{w+4e SVZf27GZ{{BrDG'(X{yG9J`1]R%m5D~uZPFhiQsunXM֭YƮkx٠Fd0vu`/ODkSN3*pzOW 1][tfkZi>XIy@סq~oŠHBaITK"t_51Pp)k)Ӣc <Q
+vOs1j9ۙiB+N+k5ܹY6]1Ș.i)~H4=3~d$K(uP9y3aF^^E7.+8L޼w{{}likn]0LY\#0̷d8Tt^WR\_a2RA 멕ZH[52y
+(ݴg\E/,pmSb;=R.wP^xtaqlF{MeR
+R#! w J{{ lmbʚUs#an(Ƞ?(
+#L[w+^8sEÌa3{n(J[BmUNbK%.4ڤ;}LCCOHSM]Yu-Dc6,ލi@d~o]Tx}_0Vߑq2Z^,u3#ü~b\)A{
+"35g(<쏙Rֶp'6ynɓusok-sWErl*|NX 'ȭhqt!f[n[Y^![^cL@ޞ:E8ŻS ]]{j IuTxN6-,?i1a7q.r!z릾zsX+"ӎze,ƴN++lճ*\Zr)r8eT
+ʻڭ]  +u9?A}!34̐7x^ԩk5N0NN3<PS>*U΋'F9),kY*s2GVXRx⇆x.ի
+!
+&aj\ĥNaF:X1=" h"PP?cW+4')5JķRO%Y|[1v>jP"
+sTMvWPhRAjw*J=rOljzO%vgVQQc^IJ)ˉ+R͂b&]m^߾ykFN =*!}*YNH?1R}%aUMq[+RO[!w#VJ6e䬖1u)k!gA'VMc g~odK>AYBISԌ'N'xպ E)(?Wd
endstream
endobj
235 0 obj
@@ -720,43 +739,32 @@ endobj
<< /D [ 235 0 R /XYZ 78.37 808.885 null ] >>
endobj
81 0 obj
-<< /D [ 235 0 R /XYZ 79.37 492.794 null ] >>
+<< /D [ 235 0 R /XYZ 79.37 396.082 null ] >>
endobj
85 0 obj
-<< /D [ 235 0 R /XYZ 79.37 468.565 null ] >>
+<< /D [ 235 0 R /XYZ 79.37 371.853 null ] >>
endobj
89 0 obj
-<< /D [ 235 0 R /XYZ 79.37 286.317 null ] >>
+<< /D [ 235 0 R /XYZ 79.37 188.655 null ] >>
endobj
234 0 obj
-<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F16 177 0 R /F15 147 0 R /F62 150 0 R /F54 148 0 R /F53 146 0 R /F22 154 0 R /F67 175 0 R /F55 149 0 R /F32 156 0 R /F61 159 0 R /F48 157 0 R >> /ProcSet [ /PDF /Text ] >>
+<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F70 187 0 R /F16 177 0 R /F15 147 0 R /F62 150 0 R /F54 148 0 R /F53 146 0 R /F22 154 0 R /F67 175 0 R /F55 149 0 R /F32 156 0 R /F61 159 0 R /F48 157 0 R >> /ProcSet [ /PDF /Text ] >>
endobj
240 0 obj
-<< /Filter /FlateDecode /Length 4256 >>
-stream
-x5hg+⒏7 V pfa2Ñux<U]=#lUO:ӯWOyF^{y&<Y#7o_Ϛ//!9g&/dBc87_sX)`aRpduQixW |6{fὁ<bМyp!(p<q5$ 56kFRf?Ryն | ]mZ)'+k<? m }N3ǶEuZkOVy&!<YS;%̋٤G- ȥ2cI{/3 g.LFFnShlf*Ď:DF!QD4/*29D\*^#+vX9RݴY ia
-Pz/7r6q6PIr*rA 7a `S߰߁hna\"Z-l&gø i ۲G4S (
-e8\UNI|C<Jn~H$_|) )[%v-θ.2%xY
-iKBtΈiFp%A24Ec")Y 4Z0
-mEm QyJ8"dC~ |="_M)0ξɠ|kQ"ѹBaZd-C">Lt.LNp MMAvnL24#zJB }혘qhR$Ut3Y:ldP8upuMdUQ3y AFcs]O bV g:Y7i֢etGhYe̡扢e+ '-G"HZÅ#5foWh m
- HUq:Q?K{90~p}~O
-D<f5PL)s?O=4`
-~k V8aFއA^ø;qd
-?-TM|iAr+zn"уGHvp+˼00
-RIAU::&H
-ZG%"_+?2w֟~TNhP4R-=X=ܩA1#8Г@e"umR*&GYiTI$ih OQc,.E/zN#)C89'[ɮޢ
-`?–ۦ Da ɦZ91SYǼG'sRg{920L}L^a`<#fBM8z޷)e Q
-FeڕK2h7Իq"c sS\uek'~9 [Ofo{sL %J?)@dm;αa
-Z ;ogK$5KWJ^?6Ҷadz[ݦۭ/m
- [}M $Ci:6U׽ݪ4v얄UϨm~!
-QkؙLF-:FI~IjH3&IZ0QJڂUɯˢ1%A(R)XܞgD{PSo֦(٬RUu l<Uo6!;x
-.))}yFYQRMd`B 0~w}?Hw:ӛq*{-2a40#q(cCÁd|Ѿr'̡? O' D?j =] ]cgVY#gFMК2U˹XRi.
-
-&W@콭.h
-ZKMSOߠ'7(򈢌6Uu-ն3k o,@s-C54`Cb8Կ>ʭޖSui# 1PJ3aaƪ9:veT6ﺣ)ABA|9̷zTE:C,yXh@I- zJRLCIad*Б[y$!
-CDG>WT* -T]
-Fۣd2mݩ.U3Qa|%nMq{4)ތ(|HK`֩RJ,n\7wA?+# ]5u֛h5ڗxOBn[FԢ uWBAMY
-iix;1E 䃚1-ďׄf!=ÈQX7'\d=&[|l=NV cY=X-`Xnaֻ n֫K{sˆK*\s;طa&̹VƎ*)m#3x-F;x j3IcưGn*Gi2ds"{__]񣁸Ldbڰ:Ag RL[B1H|ƛZ1P}DYo^v]YR VUJU|{Mƥpd:L[Bh/]<(+XteXbt1+EVau9adgm%$ksBƀ=D2n__jM[_{ЎjJI}ڧVѢˤ&vVUskt~ksTWV!Ze$O݊ 3(Y=-aZ?U- p>ˆ
+<< /Filter /FlateDecode /Length 4443 >>
+stream
+xɎ+>_b /`rnANAR\,.j49󨻹^b?}{9*)`է�OSJ[q\φW~8&=Us =4yO5o|+ijNa, r8< a$x<᝾oV]mt~~@ZZ7WG<[ВVruFKġ)s#i삉-jD ]s%u}uS\3S:0m^QƷrAXʹV8 Ҫ<gOz緈iqe
+ߔ-z5K091rm8Xpg2q6L)_FÆD̀]Fo>^I=Ģo.TmQ~"=0c 0'j|ܨ+z8%!S5$Z(Σ(|AUeW+o_m,KFEW
+B%)b5'37iϋr*@.C\V'{LyĹ \Pn
+]
+I8cA:[#O[{[ڣHǒWTObWBu376yY`@w{3}mʮ#d$37.VR7IUQ|n}ҎcdwY﷗_ t̘p^3m響04(=_^_r1`~-e0Q`҇|Aէqo;>-$ucD=yGh/d=O#d?T%-:v88LoLz7q\?m{U&*7͂ ҳT[nWfFfgI2F!)"u18{ }9@8Ӳ +_~*]6򧟪b,`15h,nϞ+1l-.ĤHONqE$ˣ3McU}ĿRF!;tO6aବ<J/qg&v\Tvɧ<Z?mM&8͔W(+Ê&{` 28$@8玀vq!d>3HS j$-#lm
+l*SK\vDLK]m+_1~Lؼg^ nύJ"HpB],FBY 3[4< O
+7gza^ah}WٞF7DgZu8Mz#k}?6@Pٸc6Oh]SWKc4hnXXMY"COߣf~-M
+`{ZqJe(c+
+qQ?qƁERF k;Z{.QC\) `">u RUruQˈgIbm)ZDme]r@Ԧ-ۭPjY5Х7<p*aND :ԑAQm M.A {ag ˠ F-9U%JOtFD+n+6ZX#= ;ּ,acHzDƆLƽIQjXuai;8:ƍ=53vΣ#@tŚSN l5wZ0, #_+Y.!w)$Ab?+!wP`D9yu]WO=,]&[|mjA˙O?`--(tꈵL6SZK, |1ϒ.pOt1:v ejG }o:vdV0?,̓,L*@qnd41nÉ9GQrۈeN1
+q:zaf1
+]=[-
+ELO 4ԵaDC+vnxٟʭ&疠4߂usKf
endstream
endobj
239 0 obj
@@ -766,29 +774,26 @@ endobj
<< /D [ 239 0 R /XYZ 78.37 808.885 null ] >>
endobj
93 0 obj
-<< /D [ 239 0 R /XYZ 79.37 377.492 null ] >>
-endobj
-97 0 obj
-<< /D [ 239 0 R /XYZ 79.37 131.809 null ] >>
+<< /D [ 239 0 R /XYZ 79.37 294.653 null ] >>
endobj
238 0 obj
-<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F15 147 0 R /F62 150 0 R /F63 151 0 R /F65 152 0 R /F32 156 0 R /F22 154 0 R /F25 242 0 R /F53 146 0 R /F54 148 0 R >> /ProcSet [ /PDF /Text ] >>
+<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F15 147 0 R /F62 150 0 R /F54 148 0 R /F63 151 0 R /F65 152 0 R /F32 156 0 R /F22 154 0 R /F25 242 0 R /F53 146 0 R >> /ProcSet [ /PDF /Text ] >>
endobj
245 0 obj
-<< /Filter /FlateDecode /Length 2937 >>
-stream
-x[K ϯ?`E`
-}@=s)U%5~"Z]mJ 0}hsV_ڠ9/tyЦgU^f$(7JDkߠAhm ?P0ů~JlI 9y;Y<Y3d)!,H,s˧
-iy萴N<'#T5n#b\1Z=CgV:[se[++ކ4X-Q혟Z70+c!X3x)Otu[J͔9<UXU06 : :[3vk<QR)6g5%_GpBhyh%ߕf)p՘|_j-3.>Fł#.UWJ?*PvLz+'0[
-iǵ NrO|l˝(b(W oY߉̱Ryxf/5r'8#* nAR)YP^=K:`j3eG{)HeB|JHw&aR!# aP"&8٪ƤN3WwojZo8`Ӕ]׫P#g5t:>bAT,MT轶dz]FZT842il[.2 +oIiOTƖhͧb#Fl9n8ϩ9p
-ɮmj׉Fjhtc
-ࣝFDUZ#Tw{2Z,OkREn{!ul9
-iT[XBevDT
-~U
-Ou,,pdC5M>jZ VF!+xph
-l_! rX(X:d,. tSd{Q`WK%C݇]vqG<nLVpjU{a>5GyΘ;z?GFa<u*\vbBsYqb ؾrg8_5
-Vxνn{TLsHTh'wr}m
-%Y%rՁM=^7S~^R8uHЊS.pvθ ~ '`Ty_z}(nfmݞ{<j6.wqҋhgw>>3n 74pSj$5\լ׭ s&3Dz76f kd; IsWR[ZOGH~`uӚ98>^`MPնۧۧFI2Xu+57h?IFwҊCph~j<?Ka)^@֤ xgj8K9bI9zPUB/Rwk
+<< /Filter /FlateDecode /Length 3359 >>
+stream
+x\K ϯcrXE0HNY)lB=gUw]6fgJ(>>R,yrw/J`r/(z"/Ҫ˗.JKiOJJI HG)AMJpBc[xۗ?Ӛ\,n,!A*_iyx  ջǻ: [|kE]+F<7py?i 3N|4Zʣ"$lbc^7𯼃iM޷k?"g]sU])C|hκcw=}<TxH5K~Cd?`CdjP-)5L(']eTA.-04u?)ʕ|Uq#7lYђEAe![R\366=ae|aVed
+*ءc8v&w'Iz$Aݭ{PW<s5(d}Y^2S;Kz}KV
+iciiINIz`&ͻ" 4,D]GdȜ914`]F ty5uALIDvI)f;pLG)5ƃĔz2Jbfj[G >D<f/Igm;ʜ&`M-_ti)
+a|\T<k}KWGcbYhД^ND)#W ޅ²S6ڜRuDn_S5޲
+oͲmXrF[iWB<ezans@]aᵤ%pS7Eg&;[gCЦJUe$6 %iy<n+Ϗjc*p_&.WVψPY'{-ͽFS:f&+$E48<f*4P=(*Jϕ)shO?ԝd${:mxZƘ
+g[0g\yj/}m:M3¬?(؟9K*s7L ;&w\h@ wW\
+̜ n$qOˈj{Fw*ֺE
+z>]2xjspS#2`i֤@;ϗB)BR._Ꜽx:lW1FhJL $b[C5q}È1<'҉ȴi8a<<C#5&GSZ3"7ϳ\Mu/W#ŃDx#Dİ?YO~F?>vՂ@䄅!\)z/,rBB dWqq3S$*\}j9]^ -l!}kbSDv2I7P~_&+/¡?&7&#7eˬ;vC|fa2K{:PcRMJMh;)@WQ> ݋ő~lr2glV%d?C^bIS»p+D?3y4p%ލYcoLS^˯/0uXM$7`L
+Ii槽Xq^4?г[gO/@,nqͧ7Ѷ}9:bh<w FT<LJS5Mv~޴VF!cX?vF(&̣S81r%MZ!3KVp-Ec<grc8Lt=mO8\h\v<gޙ#v; B<Љ#=$\ז8b rg 'Iy:uuۤBe3gl"X9EHOjKb}i
+˧Y Nk<Yx`mO9{D;(G2OFY^.AZ~"+]OoLƷ"OE@H(y/hF GI
+pE#q_eZQM$?(SMjeU6A 'Au~CФ+{#RȰq˃d& "<Q ~S֞"[i>jS%H`5ZAȃ~] FuN kcnCkְߧ;y
+Zڇz8ȭW8!u=ߥG鵥*SD\}rgmXZZ4vjIO gUR qH`Ptav[t d*g=nn5yg?.'v 4pjD~z[sfcntWt_}ڙeNcDk{-<k/jUL5sq<}jvdQ*Y;܁ޱig1S ۜyYR{ b00 ]e@hwjB:9cc.kj^ ( NmRNM_7|B$wJy^]t6Vzى'K ]?-
endstream
endobj
244 0 obj
@@ -797,17 +802,20 @@ endobj
246 0 obj
<< /D [ 244 0 R /XYZ 78.37 808.885 null ] >>
endobj
+97 0 obj
+<< /D [ 244 0 R /XYZ 79.37 771.024 null ] >>
+endobj
101 0 obj
-<< /D [ 244 0 R /XYZ 79.37 682.839 null ] >>
+<< /D [ 244 0 R /XYZ 79.37 620.939 null ] >>
endobj
105 0 obj
-<< /D [ 244 0 R /XYZ 79.37 643.554 null ] >>
+<< /D [ 244 0 R /XYZ 79.37 581.653 null ] >>
endobj
109 0 obj
-<< /D [ 244 0 R /XYZ 79.37 303.165 null ] >>
+<< /D [ 244 0 R /XYZ 79.37 243.786 null ] >>
endobj
243 0 obj
-<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F15 147 0 R /F62 150 0 R /F53 146 0 R /F54 148 0 R /F70 187 0 R /F61 159 0 R /F63 151 0 R >> /ProcSet [ /PDF /Text ] >>
+<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F53 146 0 R /F15 147 0 R /F54 148 0 R /F22 154 0 R /F62 150 0 R /F70 187 0 R /F61 159 0 R /F63 151 0 R >> /ProcSet [ /PDF /Text ] >>
endobj
251 0 obj
<< /Filter /FlateDecode /Length 3274 >>
@@ -985,140 +993,140 @@ endobj
274 0 obj
<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F15 147 0 R /F62 150 0 R /F63 151 0 R /F54 148 0 R >> /ProcSet [ /PDF /Text ] >>
endobj
-286 0 obj
-<< /Filter /FlateDecode /Length 2139 >>
+283 0 obj
+<< /Filter /FlateDecode /Length 2181 >>
stream
-xZɎ#Wn@A@`|n9>#%ɔԶژ4L.XDo^~x9|D8Z>~}1ܡ/Y>.?i Wgkm>k.~9"XAAz'+2Vz] Evo2x/\P&ZyDia4AYr;VчnU[s/=EM=1ӰFF4L
-QbWt1uÈڹRcd^ a']ӵvn[<[Q|%s/{,$BiMLkڋ3H*P츗\mTz}4{.vU{4:;U#IP^$ݝ&FFmA\[gI^JozxQ(Mֶ,zm|
-nb+ [W1mNayVV$gI7f@E 07\[Зb7{ez^]r}2>rjTl/3*qF+oźx|.Ze5wؘ5Xs//kF _omL, hC^Ix͝+RFY;-8ZA׹׵@2ogE6#5~/u*鄊w|^svO}~Evb  - (4ߑ$nWv\ο/e.cuݱ6[ĺL F5mmՠhu<uGtK{,_keդH7hĨE^Z[덜>4-6.S5U=(8W8,=șq/^cF$9''0 .o|nXju">搏_>^aG8."a.}.%d! r
-}u1^+v
-xRE/itл:yDaK{M,*4N kGl&7wNFၗy0ڽD5 ,¹>xqΉ`v?
- <?, +ZEng} 2 |6^~i{ #* iX ޶ ze4yp~ B|Gj[R"<
->a3 {T=
+xZɎW" h4ХR 0>y`Ngc%%34.N.XH퇗˗7e /(\6gVm_n?JoR.RR}^'hC+Ǚd7G8쑼>R].w۸:i)YkP5d쎮d)*`׭S7۴ռSi&dFBcfLrq0vaj&e$HEi˗g{cJZmhʒb<QtɜK,I6_F>ИY`4˜3"Yddu^K}4{v¦T:;|}$({5}Hؒ;- N(S:$)
+r\i2o1"Vd*oVYiŪa NyL:=zJ^
+)_~}sȴB D UB("tV(/c_gh0SOTϟ gcd"ݷ_GF]njlx? ;iVtл5p80f=oe\tjywTj3:Bgk^"ș9Q轝DVj#HdI|pt+K pCz4 5'Fc^r>!1Qzߨl4(o',3rUh\gՏz=Pf-b;JzO
+O(wGk_F"s]I>@ۭQc<YF|`3}pxxJ)(hk?wLF gKpx4Zm,IF}]?R
endstream
endobj
-285 0 obj
-<< /Type /Page /Contents 286 0 R /Resources 284 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 233 0 R /Annots 288 0 R >>
+282 0 obj
+<< /Type /Page /Contents 283 0 R /Resources 281 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 233 0 R /Annots 285 0 R >>
endobj
-288 0 obj
-[ 278 0 R 279 0 R 280 0 R 281 0 R 282 0 R ]
+285 0 obj
+[ 278 0 R ]
endobj
278 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 78.374 160.62 158.683 169.686 ]/A << /S /GoTo /D (section.1) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 78.374 102.186 158.683 111.252 ]/A << /S /GoTo /D (section.1) >> >>
endobj
-279 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 78.374 138.652 220.7 147.668 ]/A << /S /GoTo /D (section.2) >> >>
-endobj
-280 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 124.754 233.98 135.823 ]/A << /S /GoTo /D (subsection.2.1) >> >>
+284 0 obj
+<< /D [ 282 0 R /XYZ 78.37 808.885 null ] >>
endobj
281 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 112.918 405.437 123.798 ]/A << /S /GoTo /D (subsection.2.2) >> >>
-endobj
-282 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 100.405 270.892 112.361 ]/A << /S /GoTo /D (subsection.2.3) >> >>
-endobj
-287 0 obj
-<< /D [ 285 0 R /XYZ 78.37 808.885 null ] >>
-endobj
-284 0 obj
-<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F15 147 0 R /F62 150 0 R /F55 149 0 R /F63 151 0 R /F53 146 0 R /F54 148 0 R /F16 177 0 R /F32 156 0 R /F61 159 0 R >> /ProcSet [ /PDF /Text ] >>
+<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F15 147 0 R /F62 150 0 R /F55 149 0 R /F63 151 0 R /F53 146 0 R /F54 148 0 R /F69 186 0 R /F70 187 0 R /F16 177 0 R /F32 156 0 R /F61 159 0 R >> /ProcSet [ /PDF /Text ] >>
endobj
317 0 obj
-<< /Filter /FlateDecode /Length 1335 >>
+<< /Filter /FlateDecode /Length 1454 >>
stream
-xZˎ&W@Q ]YO#eݻ(d߆&ȋmlpS|kïoY`% . wbЖI=h.Ǔ)9JpG W>x} ^dyl7DSGz#ȤAeS{@xXP~s;)4O~K+i;(N
-c2w*3\߄RT`,5Jlais"F0H8F i
-:ݕM89xBqڣŞB'--W SҜ934g=9%+cM'h2ôtWABh`"P@KJbBvN U ؠ@Nrҁ*P=\C\SAԢ.wH 2x
- j^mq0%_jJd+5=}
+x[M&x) HHfSUk;6ھ[<30C __Ə_'<~8agOUZ-*%B>mԕ) 6a.=89>ˆuoĎ* 9$!
+k䞋..huVI%gkτ#? ,xdBd%x\N8\2g_BKL1W*ͦP8kZ[|F %i|-җa\:9)iMږ[G;d>ubⷧ9<[{~m
+{5ݚ'+4z7oLF 瓝5ᑿ-Q
+#d>ڹX%͓
+XD$J۶Tͩl91WuGfWRoM
+ՍQ bc➨^ 6DLk= b2tِ-Pevy1v+>P.󴲢ʈ{뻌9w}&;",˒~!T mu0櫚._UTX>{#ACZ רL.tj9<g\\2*xy|n5W
+[-9I=@f/SU9
endstream
endobj
316 0 obj
<< /Type /Page /Contents 317 0 R /Resources 315 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 319 0 R /Annots 320 0 R >>
endobj
320 0 obj
-[ 283 0 R 289 0 R 290 0 R 291 0 R 292 0 R 293 0 R 294 0 R 295 0 R 296 0 R 297 0 R 298 0 R 299 0 R 300 0 R 301 0 R 302 0 R 303 0 R 304 0 R 305 0 R 306 0 R 307 0 R 308 0 R 309 0 R 310 0 R 311 0 R 312 0 R 313 0 R 314 0 R ]
+[ 279 0 R 280 0 R 286 0 R 287 0 R 288 0 R 289 0 R 290 0 R 291 0 R 292 0 R 293 0 R 294 0 R 295 0 R 296 0 R 297 0 R 298 0 R 299 0 R 300 0 R 301 0 R 302 0 R 303 0 R 304 0 R 305 0 R 306 0 R 307 0 R 308 0 R 309 0 R 310 0 R 311 0 R 312 0 R 313 0 R 314 0 R ]
endobj
-283 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 78.374 759.955 177.522 768.971 ]/A << /S /GoTo /D (section.3) >> >>
+279 0 obj
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 78.374 759.955 220.7 768.971 ]/A << /S /GoTo /D (section.2) >> >>
+endobj
+280 0 obj
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 746.057 233.98 757.126 ]/A << /S /GoTo /D (subsection.2.1) >> >>
+endobj
+286 0 obj
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 734.222 405.437 745.101 ]/A << /S /GoTo /D (subsection.2.2) >> >>
+endobj
+287 0 obj
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 721.708 270.892 733.664 ]/A << /S /GoTo /D (subsection.2.3) >> >>
+endobj
+288 0 obj
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 78.374 702.172 177.522 711.188 ]/A << /S /GoTo /D (section.3) >> >>
endobj
289 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 745.619 245.866 757.574 ]/A << /S /GoTo /D (subsection.3.1) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 687.835 245.866 699.791 ]/A << /S /GoTo /D (subsection.3.1) >> >>
endobj
290 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 734.112 160.018 745.061 ]/A << /S /GoTo /D (subsection.3.2) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 676.329 160.018 687.278 ]/A << /S /GoTo /D (subsection.3.2) >> >>
endobj
291 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 723.98 290.319 733.215 ]/A << /S /GoTo /D (subsection.3.3) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 666.197 290.319 675.432 ]/A << /S /GoTo /D (subsection.3.3) >> >>
endobj
292 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 78.374 702.172 217.522 711.288 ]/A << /S /GoTo /D (section.4) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 78.374 644.388 217.522 653.504 ]/A << /S /GoTo /D (section.4) >> >>
endobj
293 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 690.107 264.755 699.342 ]/A << /S /GoTo /D (subsection.4.1) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 632.324 264.755 641.559 ]/A << /S /GoTo /D (subsection.4.1) >> >>
endobj
294 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 676.438 250.11 687.317 ]/A << /S /GoTo /D (subsection.4.2) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 618.655 250.11 629.534 ]/A << /S /GoTo /D (subsection.4.2) >> >>
endobj
295 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 116.232 666.197 276.738 675.213 ]/A << /S /GoTo /D (subsubsection.4.2.1) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 116.232 608.413 276.738 617.43 ]/A << /S /GoTo /D (subsubsection.4.2.1) >> >>
endobj
296 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 116.232 654.241 265.45 663.407 ]/A << /S /GoTo /D (subsubsection.4.2.2) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 116.232 596.458 265.45 605.624 ]/A << /S /GoTo /D (subsubsection.4.2.2) >> >>
endobj
297 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 116.232 640.573 286.86 651.452 ]/A << /S /GoTo /D (subsubsection.4.2.3) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 116.232 582.789 286.86 593.669 ]/A << /S /GoTo /D (subsubsection.4.2.3) >> >>
endobj
298 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 628.618 282.1 639.566 ]/A << /S /GoTo /D (subsection.4.3) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 570.834 282.1 581.783 ]/A << /S /GoTo /D (subsection.4.3) >> >>
endobj
299 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 116.232 616.104 361.512 628.06 ]/A << /S /GoTo /D (subsubsection.4.3.1) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 116.232 558.321 361.512 570.276 ]/A << /S /GoTo /D (subsubsection.4.3.1) >> >>
endobj
300 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 116.232 604.149 443.664 616.104 ]/A << /S /GoTo /D (subsubsection.4.3.2) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 116.232 546.366 443.664 558.321 ]/A << /S /GoTo /D (subsubsection.4.3.2) >> >>
endobj
301 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 116.232 592.194 456.307 604.149 ]/A << /S /GoTo /D (subsubsection.4.3.3) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 116.232 534.411 456.307 546.366 ]/A << /S /GoTo /D (subsubsection.4.3.3) >> >>
endobj
302 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 580.677 256.267 591.746 ]/A << /S /GoTo /D (subsection.4.4) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 522.894 256.267 533.963 ]/A << /S /GoTo /D (subsection.4.4) >> >>
endobj
303 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 116.232 568.722 231.599 579.791 ]/A << /S /GoTo /D (subsubsection.4.4.1) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 116.232 510.939 231.599 522.007 ]/A << /S /GoTo /D (subsubsection.4.4.1) >> >>
endobj
304 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 116.232 556.767 232.157 567.835 ]/A << /S /GoTo /D (subsubsection.4.4.2) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 116.232 498.984 232.157 510.052 ]/A << /S /GoTo /D (subsubsection.4.4.2) >> >>
endobj
305 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 544.812 362.538 555.771 ]/A << /S /GoTo /D (subsection.4.5) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 487.029 362.538 497.987 ]/A << /S /GoTo /D (subsection.4.5) >> >>
endobj
306 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 534.69 169.492 543.816 ]/A << /S /GoTo /D (subsection.4.6) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 476.906 169.492 486.032 ]/A << /S /GoTo /D (subsection.4.6) >> >>
endobj
307 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 78.374 511.058 143.002 521.898 ]/A << /S /GoTo /D (section.5) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 78.374 453.275 143.002 464.114 ]/A << /S /GoTo /D (section.5) >> >>
endobj
308 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 498.984 223.799 509.982 ]/A << /S /GoTo /D (subsection.5.1) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 441.2 223.799 452.199 ]/A << /S /GoTo /D (subsection.5.1) >> >>
endobj
309 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 487.029 277.208 497.987 ]/A << /S /GoTo /D (subsection.5.2) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 429.245 277.208 440.204 ]/A << /S /GoTo /D (subsection.5.2) >> >>
endobj
310 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 475.073 214.513 486.032 ]/A << /S /GoTo /D (subsection.5.3) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 417.29 214.513 428.249 ]/A << /S /GoTo /D (subsection.5.3) >> >>
endobj
311 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 463.118 261.178 474.117 ]/A << /S /GoTo /D (subsection.5.4) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 405.335 261.178 416.334 ]/A << /S /GoTo /D (subsection.5.4) >> >>
endobj
312 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 78.374 441.26 219.843 452.159 ]/A << /S /GoTo /D (section.6) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 78.374 383.477 219.843 394.376 ]/A << /S /GoTo /D (section.6) >> >>
endobj
313 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 429.255 259.525 440.204 ]/A << /S /GoTo /D (subsection.6.1) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 371.472 259.525 382.421 ]/A << /S /GoTo /D (subsection.6.1) >> >>
endobj
314 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 416.852 364.391 428.807 ]/A << /S /GoTo /D (subsection.6.2) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 359.068 364.391 371.024 ]/A << /S /GoTo /D (subsection.6.2) >> >>
endobj
318 0 obj
<< /D [ 316 0 R /XYZ 78.37 808.885 null ] >>
@@ -1518,39 +1526,46 @@ endobj
<< /Type /Font /Subtype /CIDFontType0 /BaseFont /PRHOTU+LMMono9-Regular /FontDescriptor 354 0 R /W 353 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >>
endobj
359 0 obj
-[ 28 [ 613 ] 35 [ 580 ] 47 [ 624 ] 50 [ 558 ] 55 [ 536 ] 72 [ 513 ] 77 [ 613 ] 81 [ 636 553 ] 84 [ 558 ] 96 [ 602 ] 104 [ 786 ] 116 [ 613 ] ]
+[ 28 [ 613 ] 35 [ 580 ] 47 [ 624 ] 50 [ 558 ] 55 [ 536 ] 72 [ 513 ] 77 [ 613 ] 81 [ 636 553 ] 84 [ 558 ] 96 [ 602 ] 98 [ 458 ] 104 [ 786 ] 112 [ 613 ] 116 [ 613 ] ]
endobj
361 0 obj
<< /Filter /FlateDecode /Length 23 >>
stream
-xc```Td`h`hh
+xc```Td`h`X
+
endstream
endobj
362 0 obj
-<< /Subtype /CIDFontType0C /Filter /FlateDecode /Length 1791 >>
-stream
-x}UPnwpI`w%E8$-FA0 I9.wwx`sϕ- 9PdQ`@-4!E)qM3L ̣m'iowy}# I2ngVnNvm
-Ǧsi(:T,%P0) *ŸJ،/R9Gy~MN?W?SoT"#&5$K&?䔔g35ɧ<1d7ۓ]ƒrQn6+ߝ]nˌC_d~r_*ث*2wمr^
-f0*,23E|,%f'%l˜Ί ΪdPj8$8 e'!'()/73+0+Ydv-VG7d]8lf͹&iq%" D*C&DQF8rQ&ԡ*zaa"FQT*Q)|K-"`
-̇)lPmEy[=N[8?#VJbֱ躀 K`!굴(+0Ejo}Z l6AX*0w'>uYSd@Owi栧%U*fnp_[Z)+a:=!^`J_)#sEmfV#~/%+㮺 }@3S p ^Mhc \81kG٪7^+6_^%=hLЩU_MRY0;3 -Jn>@ȣWZ=&Vr=:$@42,yÇ0It5B-wLѫp[2-.!Í9~]z\O Rs[-iVϑ\rG2g4 )nNVjnKf*y+a}`@3"%0_-120Wz`
-w{/91 `m&AwM_j㠣]w"}'0e_j1 0 ff~ݒ ]oX- +wNtщs???Wh&]]n>54ԡ;
-U KGWQO
+<< /Subtype /CIDFontType0C /Filter /FlateDecode /Length 2095 >>
+stream
+x}V P] x +N
+H& ` |rwݻ;x b PL(J6̨1oͣm'iow'1D3ocb ΰ*evuIԇ%B1B&K&L`ɤ# :]<$g'HYB44qM," `XXBH(b #YSRR^eF.5%!ېmVThk 圲RmN$qyq{I[˔v/W~3zWךtI\AY+8WkJZř*Uj=g,SsvpYJ#[^4+9ΠVseFGFSiV_W1$k !Y[
+Vddg&k^Sr!{dV_IWi9*uX#{KRװll ێ`{b aFXqDcѡcMIeyRXx\e&r |/Jx
+~d<[*|˓M,J»6ntXl,Z=ʬ;PX'W܎m 1m5V`>tenSV<JxX-Q*AF~K3t]yI4'&bv mlF/P:ys]
+Ҫ /2(#FaoăE60ˉ2goɻo(٨/ĉϥ$!.DKmK0vm1)L_[Z"g~R`ڠr"J$WCsn
+LMNxHvzh)hûhgL;jY'kҙLvέ!#ʐZogL]$D; W_R_ |2뻖b<=pa(ôp&9s\rL6̘*PyH㖃s$/v3<D
+ª.1LN,!MC<KBl-SM[ DL:d A!lO}N { ;60F_â\x]eXEnxcvNY;yNKq5 0A~M5
+{T{ڬžG.L@he,n`m;8 nvt`ak]tJΦgu4KT0{_[QڑUuxS4lhstԱT:h2cs]8Z}9jWWAܟ%{KJx[ZZdy UA;h6*fzC%hcp>w`eKȄ:%OqqBb;/6D0=nji]no#յ
+ffPz^3x1nUb['9K>˾
+
+ȴ@,{vq{29xZ[=ق!D
endstream
endobj
360 0 obj
-<< /Type /FontDescriptor /FontName /GEIHLW+LMRomanCaps10-Regular /Flags 4 /FontBBox [ -496 -290 1501 1100 ] /Ascent 1100 /CapHeight 683 /Descent -290 /ItalicAngle 0 /StemV 106 /XHeight 514 /FontFile3 362 0 R /CIDSet 361 0 R >>
+<< /Type /FontDescriptor /FontName /EFEVND+LMRomanCaps10-Regular /Flags 4 /FontBBox [ -496 -290 1501 1100 ] /Ascent 1100 /CapHeight 683 /Descent -290 /ItalicAngle 0 /StemV 106 /XHeight 514 /FontFile3 362 0 R /CIDSet 361 0 R >>
endobj
363 0 obj
-<< /Filter /FlateDecode /Length 429 >>
+<< /Filter /FlateDecode /Length 437 >>
stream
-xڍj0µlPJ0ldI[GX2}_IPJƟo~n1n9l5OUF}{F(h{ֈ-v0.eUwĥ^ZG?$w/*?6tQ5m£ Se#Sw;oIB?h[e=$saeajpk29,IA*](<Esa]aĮj;{߰JJa|mP'MsB?p ;ߞ!nEUwjG ]mS >"[8;xrZ~s`xM!$* %+,=QJ&R)ќhhrGT-V њdo: 4fϨ攺/ʻ |[:O^zsјg;{zY
+xڍ_k0)BwZE8Vne&o{5'ɫQ&({gwoGFwp%Zoi{oF=t^TJފ+/I/:t~`Sn޷eZuE,y&`. Z %>;NjDƘQЍ#4 1NR 3vNnTHޏ䟼ι롩IՊzsߓ0RVV)HS'svUכ|-ss-kkVg +k骴WN@o 'D+^tZjEM2 RT"-<%1R!-=-
+5S!H%zS<-V_2KBdgcg9[^n9,|V.Mג U
endstream
endobj
186 0 obj
-<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /GEIHLW+LMRomanCaps10-Regular /DescendantFonts [ 364 0 R ] /ToUnicode 363 0 R >>
+<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /EFEVND+LMRomanCaps10-Regular /DescendantFonts [ 364 0 R ] /ToUnicode 363 0 R >>
endobj
364 0 obj
-<< /Type /Font /Subtype /CIDFontType0 /BaseFont /GEIHLW+LMRomanCaps10-Regular /FontDescriptor 360 0 R /W 359 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >>
+<< /Type /Font /Subtype /CIDFontType0 /BaseFont /EFEVND+LMRomanCaps10-Regular /FontDescriptor 360 0 R /W 359 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >>
endobj
365 0 obj
[ 28 [ 559 ] 34 [ 818 ] 36 [ 575 ] 38 [ 575 575 ] 42 [ 831 511 ] 47 [ 639 ] 49 [ 756 527 575 ] 54 [ 724 351 575 575 ] 59 [ 575 ] 63 [ 639 383 436 319 ] 71 [ 692 319 ] 75 [ 958 900 639 ] 81 [ 575 575 786 639 ] 88 [ 319 ] 91 [ 607 ] 95 [ 863 474 ] 98 [ 454 ] 100 [ 575 575 ] 104 [ 800 447 575 575 885 639 ] 112 [ 607 ] 114 [ 831 869 607 ] 118 [ 607 ] 168 [ 559 ] 251 [ 527 ] 319 [ 639 639 ] 499 [ 571 571 ] 502 [ 319 ] ]
@@ -2421,47 +2436,46 @@ endobj
<< /Type /Font /Subtype /CIDFontType0 /BaseFont /CKBVSC+LMMono12-Regular /FontDescriptor 476 0 R /W 475 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >>
endobj
481 0 obj
-[ 28 [ 490 ] 54 [ 639 ] 57 [ 490 ] 59 [ 490 ] 66 [ 272 ] 72 [ 272 ] 77 [ 544 ] 83 [ 666 ] 88 [ 272 ] 96 [ 381 ] 105 [ 381 490 490 ] 112 [ 517 ] 118 [ 517 ] 121 [ 490 ] 187 [ 489 ] ]
+[ 28 [ 490 ] 54 [ 639 ] 59 [ 490 ] 66 [ 272 ] 72 [ 272 ] 77 [ 544 ] 82 [ 490 666 ] 88 [ 272 ] 96 [ 381 ] 105 [ 381 490 490 ] 112 [ 517 ] 118 [ 517 ] 121 [ 490 ] 187 [ 489 ] ]
endobj
483 0 obj
<< /Filter /FlateDecode /Length 27 >>
stream
-xc`````
-Phhh(hr`
+xc`````Ph1hh(hr`
endstream
endobj
484 0 obj
-<< /Subtype /CIDFontType0C /Filter /FlateDecode /Length 2381 >>
-stream
-xuV TWI͘fصnPHcki} HJB#$<bTmkqC{<D=g̹3~<$4x3ekd7oX1YJ/\,WS `f!s<aH>CqaB'_ef Xskz28_x
-n
-{z 4|"
-AxL@~BCyxb.~9N[T(Ԣ/Tl$;KedeRt:ImTΚI425;ReP26J5BjER2e2YV˳y:jJS[Ȩu*ZK%f9AQRjFEiuHZh9i"ֽ$H6iHmPt653[?|lHRsRW6S[pcY@bFd مd"{,$#I>Pnq0H6Ą4?u)~g`ke;s-hb3C@cDrc'<qk4y=|dK~|!eW,[)V/>;$0ՇAu]vZ2/vϮYF
-ɶ;L Q$zĞܓth^y;CvVq]f %{i
-9/l?S'_z x[ :*I~m'q~@&>_BV"&<Fp
-eO(|ȧS+d, Iz\Va1&xMabħuiVӞsD8Es% vb3LґߵGTB K,ZWb!km!:7vnՄ|\)fjjm= r݌4
-Gty Sfvv6WLVF(DW (v{Xўk"\Sic`L_1v.&@wE:|pW'jaKѩqYAeqwky[]d̊JvٕS!(,,k@ qBxwxe;۾IB:-=R)oUiEwb!(
-N=v;Xơ vノ25NXQhJJAn>aK:wg)D"Vm.oc?ߩ*ys0~)_'^axh8+3^ 3e\I
-P eهH8o2dl`-)̕[
-76YIZ {oz:>ӆznG[BO`ik4-&BRhDخYi}yh$2R'ӯ&ÈZ˛J3ym&ciE5Qkm*̕ۋprm5nIMՅZ=khDzс7n:.g
-n&ֻFD,;* 650exVSUu9ljlæ1͸U׍
+<< /Subtype /CIDFontType0C /Filter /FlateDecode /Length 2377 >>
+stream
+xuV TWI+6cl3ckUCZkWTZT[˶*JH0<IIxK !b}HV\Z=nNs{Ϝ;s߽
+PD zҚ 'Ә"
+*M>Hv6>)`t(&|?,t%{Hs= G>
+{ dB"? GRhEFGd*:zQtr:6NHۙ6j24&NGIj#?I?fre*Vg)-^+hiF΋SZڨd[#WӴtZϤ5N)7oJשShtDMkrZ+"ETR=FE{=)%"ոIFttZCui*m,ׁ$&;M:]CjeF"+Xd=lB ۑLd $9. EN}ڐ2D^8  M
+m?-]^x
+rH&/b ;VpO.2(L=,vԂ؁sv>pס@O JL?D'7'cvX63&TP;6¾TkGAɠ @4 A
+{b{G֩uj}N[tz}"Z
+C!XþV>"(6QAKTj_p'
+/|w`>
+`f/YV儰]T
+A{j?Ml% r[ U^+@OM۟ObM #?q쑁!W+EV;p`kQ!˲_+F;ܩ5̋:ѲCukȘ#ړ7'N+F+ ̟ !yyJ"+
+(g5eybG}%Nj2x9"XO(tv\$k3G5Z,굻Ig?XҴd2IenZ`O; -RĦ86nOb7&bwIa:1MޒYVT[7̒ 9xp^Zͦ)ZpgL^AuOarF*<xa1dEb6%5ظ&dB**!6-4gzoM),wjք=¾;
endstream
endobj
482 0 obj
-<< /Type /FontDescriptor /FontName /TDTHQI+LMRoman12-Regular /Flags 4 /FontBBox [ -422 -280 1394 1127 ] /Ascent 1127 /CapHeight 683 /Descent -280 /ItalicAngle 0 /StemV 91 /XHeight 431 /FontFile3 484 0 R /CIDSet 483 0 R >>
+<< /Type /FontDescriptor /FontName /UONDLP+LMRoman12-Regular /Flags 4 /FontBBox [ -422 -280 1394 1127 ] /Ascent 1127 /CapHeight 683 /Descent -280 /ItalicAngle 0 /StemV 91 /XHeight 431 /FontFile3 484 0 R /CIDSet 483 0 R >>
endobj
485 0 obj
<< /Filter /FlateDecode /Length 449 >>
stream
-xڅMo0C@1ⶊjjĞd-8߯VZmH 杙cC0ތV@T4Y,6F-@}F`We4JUW5MgxٚIm81VQR4
-teHL1@<E~=C*>9Oi CX-n! {৯4|t>+
+xڅn0<!RzHB[EH i%6jĞd-8V 3=cF6Y=-7jhy_Vm`c4a\JvwV\*~E <I)qxmou]8 xϕ Kl?(V|?hZ1EBnm]B4X?J%- N@H]?ymwúTGٕeۙ}Dk#Hu-V Aֶ}ZU5B:P
+f+>!eMTܶ0W_⌲GB+^lqblҙɌhA$!z$z *D/L44eDr<e #ф虪D%%ev#YFURZo$r߷kLjxo?$~R9jt?8Zs
endstream
endobj
141 0 obj
-<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /TDTHQI+LMRoman12-Regular /DescendantFonts [ 486 0 R ] /ToUnicode 485 0 R >>
+<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /UONDLP+LMRoman12-Regular /DescendantFonts [ 486 0 R ] /ToUnicode 485 0 R >>
endobj
486 0 obj
-<< /Type /Font /Subtype /CIDFontType0 /BaseFont /TDTHQI+LMRoman12-Regular /FontDescriptor 482 0 R /W 481 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >>
+<< /Type /Font /Subtype /CIDFontType0 /BaseFont /UONDLP+LMRoman12-Regular /FontDescriptor 482 0 R /W 481 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >>
endobj
487 0 obj
[ 66 [ 223 ] 77 [ 484 ] 81 [ 470 ] 84 [ 484 ] 105 [ 340 ] ]
@@ -2707,7 +2721,7 @@ endobj
<< /Type /Pages /Parent 507 0 R /Count 10 /Kids [ 133 0 R 165 0 R 172 0 R 183 0 R 193 0 R 200 0 R 206 0 R 213 0 R 220 0 R 226 0 R ] >>
endobj
233 0 obj
-<< /Type /Pages /Parent 507 0 R /Count 10 /Kids [ 230 0 R 235 0 R 239 0 R 244 0 R 250 0 R 255 0 R 263 0 R 271 0 R 275 0 R 285 0 R ] >>
+<< /Type /Pages /Parent 507 0 R /Count 10 /Kids [ 230 0 R 235 0 R 239 0 R 244 0 R 250 0 R 255 0 R 263 0 R 271 0 R 275 0 R 282 0 R ] >>
endobj
319 0 obj
<< /Type /Pages /Parent 507 0 R /Count 1 /Kids [ 316 0 R ] >>
@@ -2815,7 +2829,7 @@ endobj
<< /Title 7 0 R /A 4 0 R /Parent 508 0 R /Next 10 0 R >>
endobj
509 0 obj
-<< /Names [ (Doc-Start) 138 0 R (page.1) 137 0 R (page.10) 228 0 R (page.11) 232 0 R (page.12) 237 0 R (page.13) 241 0 R (page.14) 246 0 R (page.15) 252 0 R (page.16) 257 0 R (page.17) 265 0 R (page.18) 273 0 R (page.19) 277 0 R (page.2) 167 0 R (page.20) 287 0 R (page.21) 318 0 R (page.3) 174 0 R (page.4) 185 0 R (page.5) 195 0 R (page.6) 202 0 R (page.7) 208 0 R (page.8) 215 0 R (page.9) 222 0 R (section.1) 5 0 R (section.2) 9 0 R (section.3) 25 0 R (section.4) 41 0 R (section.5) 101 0 R (section.6) 121 0 R (subsection.2.1) 13 0 R (subsection.2.2) 17 0 R (subsection.2.3) 21 0 R (subsection.3.1) 29 0 R ] /Limits [ (Doc-Start) (subsection.3.1) ] >>
+<< /Names [ (Doc-Start) 138 0 R (page.1) 137 0 R (page.10) 228 0 R (page.11) 232 0 R (page.12) 237 0 R (page.13) 241 0 R (page.14) 246 0 R (page.15) 252 0 R (page.16) 257 0 R (page.17) 265 0 R (page.18) 273 0 R (page.19) 277 0 R (page.2) 167 0 R (page.20) 284 0 R (page.21) 318 0 R (page.3) 174 0 R (page.4) 185 0 R (page.5) 195 0 R (page.6) 202 0 R (page.7) 208 0 R (page.8) 215 0 R (page.9) 222 0 R (section.1) 5 0 R (section.2) 9 0 R (section.3) 25 0 R (section.4) 41 0 R (section.5) 101 0 R (section.6) 121 0 R (subsection.2.1) 13 0 R (subsection.2.2) 17 0 R (subsection.2.3) 21 0 R (subsection.3.1) 29 0 R ] /Limits [ (Doc-Start) (subsection.3.1) ] >>
endobj
510 0 obj
<< /Names [ (subsection.3.2) 33 0 R (subsection.3.3) 37 0 R (subsection.4.1) 45 0 R (subsection.4.2) 49 0 R (subsection.4.3) 65 0 R (subsection.4.4) 81 0 R (subsection.4.5) 93 0 R (subsection.4.6) 97 0 R (subsection.5.1) 105 0 R (subsection.5.2) 109 0 R (subsection.5.3) 113 0 R (subsection.5.4) 117 0 R (subsection.6.1) 125 0 R (subsection.6.2) 129 0 R (subsubsection.4.2.1) 53 0 R (subsubsection.4.2.2) 57 0 R (subsubsection.4.2.3) 61 0 R (subsubsection.4.3.1) 69 0 R (subsubsection.4.3.2) 73 0 R (subsubsection.4.3.3) 77 0 R (subsubsection.4.4.1) 85 0 R (subsubsection.4.4.2) 89 0 R (table.caption.1) 198 0 R ] /Limits [ (subsection.3.2) (table.caption.1) ] >>
@@ -2830,527 +2844,527 @@ endobj
<< /Type /Catalog /Pages 507 0 R /Outlines 508 0 R /Names 512 0 R /PageMode/UseOutlines /OpenAction 132 0 R >>
endobj
514 0 obj
-<< /Author(\376\377\000F\000.\000\040\000P\000a\000n\000t\000i\000g\000n\000y)/Title(\376\377\000L\040\031\000e\000x\000t\000e\000n\000s\000i\000o\000n\000\040\000p\000i\000t\000o\000n)/Subject(\376\377\000U\000n\000e\000\040\000e\000x\000t\000e\000n\000s\000i\000o\000n\000\040\000L\000a\000T\000e\000X)/Creator(LaTeX with hyperref)/Keywords() /Producer (LuaTeX-1.16.0) /CreationDate (D:20230404180411+02'00') /ModDate (D:20230404180411+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.16.0 (MiKTeX 23.1)) >>
+<< /Author(\376\377\000F\000.\000\040\000P\000a\000n\000t\000i\000g\000n\000y)/Title(\376\377\000L\040\031\000e\000x\000t\000e\000n\000s\000i\000o\000n\000\040\000p\000i\000t\000o\000n)/Subject(\376\377\000U\000n\000e\000\040\000e\000x\000t\000e\000n\000s\000i\000o\000n\000\040\000L\000a\000T\000e\000X)/Creator(LaTeX with hyperref)/Keywords() /Producer (LuaTeX-1.16.0) /CreationDate (D:20230411101241+02'00') /ModDate (D:20230411101241+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.16.0 (MiKTeX 23.1)) >>
endobj
xref
0 515
0000000000 65535 f
-0000097843 00000 n
-0000097888 00000 n
-0000097908 00000 n
+0000098293 00000 n
+0000098338 00000 n
+0000098358 00000 n
0000000020 00000 n
-0000012032 00000 n
-0000296461 00000 n
+0000012036 00000 n
+0000297235 00000 n
0000000065 00000 n
0000000155 00000 n
-0000016827 00000 n
-0000296338 00000 n
+0000016831 00000 n
+0000297112 00000 n
0000000200 00000 n
0000000364 00000 n
-0000016887 00000 n
-0000296264 00000 n
+0000016891 00000 n
+0000297038 00000 n
0000000415 00000 n
0000000574 00000 n
-0000016948 00000 n
-0000296177 00000 n
+0000016952 00000 n
+0000296951 00000 n
0000000625 00000 n
0000001005 00000 n
-0000017009 00000 n
-0000296103 00000 n
+0000017013 00000 n
+0000296877 00000 n
0000001056 00000 n
0000001262 00000 n
-0000021872 00000 n
-0000295978 00000 n
+0000021876 00000 n
+0000296752 00000 n
0000001308 00000 n
0000001416 00000 n
-0000021933 00000 n
-0000295904 00000 n
+0000021937 00000 n
+0000296678 00000 n
0000001467 00000 n
0000001629 00000 n
-0000033461 00000 n
-0000295817 00000 n
+0000033462 00000 n
+0000296591 00000 n
0000001680 00000 n
0000001761 00000 n
-0000037481 00000 n
-0000295743 00000 n
+0000037482 00000 n
+0000296517 00000 n
0000001812 00000 n
0000002037 00000 n
-0000040725 00000 n
-0000295617 00000 n
+0000040726 00000 n
+0000296391 00000 n
0000002083 00000 n
0000002240 00000 n
-0000040786 00000 n
-0000295543 00000 n
+0000040787 00000 n
+0000296317 00000 n
0000002291 00000 n
0000002501 00000 n
-0000044856 00000 n
-0000295419 00000 n
+0000044857 00000 n
+0000296193 00000 n
0000002552 00000 n
0000002727 00000 n
-0000044917 00000 n
-0000295345 00000 n
+0000044918 00000 n
+0000296119 00000 n
0000002783 00000 n
0000002943 00000 n
-0000049381 00000 n
-0000295258 00000 n
+0000049382 00000 n
+0000296032 00000 n
0000002999 00000 n
0000003152 00000 n
-0000049442 00000 n
-0000295184 00000 n
+0000049443 00000 n
+0000295958 00000 n
0000003208 00000 n
0000003391 00000 n
-0000053332 00000 n
-0000295060 00000 n
+0000053333 00000 n
+0000295834 00000 n
0000003442 00000 n
0000003652 00000 n
-0000053393 00000 n
-0000294986 00000 n
+0000053394 00000 n
+0000295760 00000 n
0000003708 00000 n
0000004002 00000 n
-0000057029 00000 n
-0000294899 00000 n
+0000057118 00000 n
+0000295673 00000 n
0000004058 00000 n
0000004421 00000 n
-0000057090 00000 n
-0000294825 00000 n
+0000057179 00000 n
+0000295599 00000 n
0000004477 00000 n
0000004860 00000 n
-0000061535 00000 n
-0000294701 00000 n
+0000061162 00000 n
+0000295475 00000 n
0000004911 00000 n
0000005109 00000 n
-0000061596 00000 n
-0000294627 00000 n
+0000061223 00000 n
+0000295401 00000 n
0000005165 00000 n
0000005284 00000 n
-0000061657 00000 n
-0000294553 00000 n
+0000061284 00000 n
+0000295327 00000 n
0000005340 00000 n
0000005464 00000 n
-0000066493 00000 n
-0000294466 00000 n
+0000066320 00000 n
+0000295240 00000 n
0000005515 00000 n
0000005840 00000 n
-0000066554 00000 n
-0000294392 00000 n
+0000070233 00000 n
+0000295166 00000 n
0000005891 00000 n
0000005974 00000 n
-0000070045 00000 n
-0000294261 00000 n
+0000070294 00000 n
+0000295035 00000 n
0000006021 00000 n
0000006090 00000 n
-0000070107 00000 n
-0000294182 00000 n
+0000070356 00000 n
+0000294956 00000 n
0000006142 00000 n
0000006295 00000 n
-0000070169 00000 n
-0000294089 00000 n
+0000070418 00000 n
+0000294863 00000 n
0000006347 00000 n
0000006545 00000 n
-0000074343 00000 n
-0000293996 00000 n
+0000074605 00000 n
+0000294770 00000 n
0000006597 00000 n
0000006750 00000 n
-0000081880 00000 n
-0000293917 00000 n
+0000082142 00000 n
+0000294691 00000 n
0000006802 00000 n
0000007009 00000 n
-0000084981 00000 n
-0000293799 00000 n
+0000085243 00000 n
+0000294573 00000 n
0000007056 00000 n
0000007216 00000 n
-0000085043 00000 n
-0000293720 00000 n
+0000085305 00000 n
+0000294494 00000 n
0000007268 00000 n
0000007466 00000 n
-0000085105 00000 n
-0000293641 00000 n
+0000085367 00000 n
+0000294415 00000 n
0000007518 00000 n
0000007843 00000 n
-0000011551 00000 n
-0000011717 00000 n
-0000012092 00000 n
+0000011555 00000 n
+0000011721 00000 n
+0000012096 00000 n
0000007895 00000 n
-0000011908 00000 n
-0000011970 00000 n
-0000260846 00000 n
-0000257555 00000 n
-0000255451 00000 n
-0000251528 00000 n
-0000248194 00000 n
-0000245763 00000 n
-0000240642 00000 n
-0000238541 00000 n
-0000231659 00000 n
-0000221018 00000 n
-0000217668 00000 n
-0000214577 00000 n
-0000204575 00000 n
-0000201239 00000 n
-0000292676 00000 n
-0000292532 00000 n
-0000195578 00000 n
-0000193684 00000 n
-0000184867 00000 n
-0000181639 00000 n
-0000177887 00000 n
-0000293102 00000 n
-0000011688 00000 n
-0000016448 00000 n
-0000016607 00000 n
-0000017070 00000 n
-0000016274 00000 n
-0000012476 00000 n
-0000016765 00000 n
-0000016411 00000 n
-0000026733 00000 n
-0000026892 00000 n
-0000021994 00000 n
-0000021689 00000 n
-0000017285 00000 n
-0000021810 00000 n
-0000170673 00000 n
-0000164410 00000 n
-0000161610 00000 n
-0000027051 00000 n
-0000027209 00000 n
-0000027368 00000 n
-0000027529 00000 n
-0000027753 00000 n
-0000026527 00000 n
-0000022274 00000 n
-0000027691 00000 n
-0000154213 00000 n
-0000150941 00000 n
-0000026664 00000 n
-0000032902 00000 n
-0000033061 00000 n
-0000033220 00000 n
-0000033521 00000 n
-0000032720 00000 n
-0000028033 00000 n
-0000033399 00000 n
-0000143048 00000 n
-0000032857 00000 n
-0000037419 00000 n
-0000037542 00000 n
-0000037236 00000 n
-0000033840 00000 n
-0000037357 00000 n
-0000040345 00000 n
-0000040504 00000 n
-0000040847 00000 n
-0000040171 00000 n
-0000037731 00000 n
-0000040663 00000 n
-0000040308 00000 n
-0000044476 00000 n
-0000044635 00000 n
-0000044978 00000 n
-0000044302 00000 n
-0000041062 00000 n
-0000044794 00000 n
-0000044439 00000 n
-0000049001 00000 n
-0000049160 00000 n
-0000049503 00000 n
-0000048827 00000 n
-0000045167 00000 n
-0000049319 00000 n
-0000292818 00000 n
-0000048964 00000 n
-0000053454 00000 n
-0000053149 00000 n
-0000049783 00000 n
-0000053270 00000 n
-0000057151 00000 n
-0000056846 00000 n
-0000053708 00000 n
-0000056967 00000 n
-0000293254 00000 n
-0000061718 00000 n
-0000061352 00000 n
-0000057379 00000 n
-0000061473 00000 n
-0000066615 00000 n
-0000066310 00000 n
-0000061972 00000 n
-0000066431 00000 n
-0000292959 00000 n
-0000070231 00000 n
-0000069862 00000 n
-0000066843 00000 n
-0000069983 00000 n
-0000073963 00000 n
-0000074122 00000 n
-0000074405 00000 n
-0000073789 00000 n
-0000070433 00000 n
-0000074281 00000 n
-0000073926 00000 n
-0000077766 00000 n
-0000077583 00000 n
-0000074607 00000 n
-0000077704 00000 n
-0000139695 00000 n
-0000081324 00000 n
-0000081482 00000 n
-0000081640 00000 n
-0000081942 00000 n
-0000081142 00000 n
-0000077994 00000 n
-0000081818 00000 n
-0000137629 00000 n
-0000125468 00000 n
-0000110741 00000 n
-0000081279 00000 n
-0000085167 00000 n
-0000084798 00000 n
-0000082235 00000 n
-0000084919 00000 n
-0000087920 00000 n
-0000087737 00000 n
-0000085369 00000 n
-0000087858 00000 n
-0000090502 00000 n
-0000090654 00000 n
-0000090805 00000 n
-0000090962 00000 n
-0000091120 00000 n
-0000093359 00000 n
-0000091340 00000 n
-0000090304 00000 n
-0000088083 00000 n
-0000091278 00000 n
-0000090441 00000 n
-0000093512 00000 n
-0000093670 00000 n
-0000093828 00000 n
-0000093985 00000 n
-0000094138 00000 n
-0000094296 00000 n
-0000094453 00000 n
-0000094617 00000 n
-0000094780 00000 n
-0000094943 00000 n
-0000095099 00000 n
-0000095262 00000 n
-0000095426 00000 n
-0000095590 00000 n
-0000095748 00000 n
-0000095912 00000 n
-0000096076 00000 n
-0000096234 00000 n
-0000096391 00000 n
-0000096544 00000 n
-0000096702 00000 n
-0000096860 00000 n
-0000097018 00000 n
-0000097176 00000 n
-0000097328 00000 n
-0000097486 00000 n
-0000097706 00000 n
-0000092985 00000 n
-0000091568 00000 n
-0000097644 00000 n
-0000293406 00000 n
-0000093122 00000 n
-0000097961 00000 n
-0000109943 00000 n
-0000098188 00000 n
-0000098290 00000 n
-0000110182 00000 n
-0000110903 00000 n
-0000111134 00000 n
-0000124643 00000 n
-0000111456 00000 n
-0000111562 00000 n
-0000124874 00000 n
-0000125622 00000 n
-0000125845 00000 n
-0000136876 00000 n
-0000125991 00000 n
-0000126088 00000 n
-0000137113 00000 n
-0000137788 00000 n
-0000138016 00000 n
-0000139008 00000 n
-0000138059 00000 n
-0000138154 00000 n
-0000139248 00000 n
-0000139850 00000 n
-0000140051 00000 n
-0000140076 00000 n
-0000140102 00000 n
-0000142291 00000 n
-0000140270 00000 n
-0000140373 00000 n
-0000142536 00000 n
-0000143209 00000 n
-0000143416 00000 n
-0000149968 00000 n
-0000143896 00000 n
-0000144012 00000 n
-0000150205 00000 n
-0000151096 00000 n
-0000151297 00000 n
-0000153458 00000 n
-0000151456 00000 n
-0000151561 00000 n
-0000153702 00000 n
-0000154374 00000 n
-0000154581 00000 n
-0000160693 00000 n
-0000155017 00000 n
-0000155137 00000 n
-0000160930 00000 n
-0000161764 00000 n
-0000161964 00000 n
-0000163670 00000 n
-0000162087 00000 n
-0000162193 00000 n
-0000163916 00000 n
-0000164572 00000 n
-0000164780 00000 n
-0000169820 00000 n
-0000165148 00000 n
-0000165268 00000 n
-0000170061 00000 n
-0000170829 00000 n
-0000171031 00000 n
-0000176941 00000 n
-0000171466 00000 n
-0000171576 00000 n
-0000177178 00000 n
-0000178042 00000 n
-0000178243 00000 n
-0000180878 00000 n
-0000178435 00000 n
-0000178540 00000 n
-0000181118 00000 n
-0000181794 00000 n
-0000181995 00000 n
-0000184100 00000 n
-0000182229 00000 n
-0000182334 00000 n
-0000184337 00000 n
-0000185022 00000 n
-0000185223 00000 n
-0000192691 00000 n
-0000185768 00000 n
-0000185899 00000 n
-0000192929 00000 n
-0000193840 00000 n
-0000194042 00000 n
-0000194895 00000 n
-0000194075 00000 n
-0000194169 00000 n
-0000195134 00000 n
-0000195734 00000 n
-0000195936 00000 n
-0000196166 00000 n
-0000196254 00000 n
-0000200408 00000 n
-0000196584 00000 n
-0000196693 00000 n
-0000200647 00000 n
-0000201394 00000 n
-0000201595 00000 n
-0000203824 00000 n
-0000201783 00000 n
-0000201887 00000 n
-0000204061 00000 n
-0000204730 00000 n
-0000204931 00000 n
-0000213517 00000 n
-0000205408 00000 n
-0000205528 00000 n
-0000213755 00000 n
-0000214733 00000 n
-0000214935 00000 n
-0000216942 00000 n
-0000215048 00000 n
-0000215151 00000 n
-0000217181 00000 n
-0000217824 00000 n
-0000218026 00000 n
-0000220245 00000 n
-0000218250 00000 n
-0000218355 00000 n
-0000220483 00000 n
-0000221174 00000 n
-0000221376 00000 n
-0000230576 00000 n
-0000222005 00000 n
-0000222141 00000 n
-0000230815 00000 n
-0000231816 00000 n
-0000232019 00000 n
-0000237640 00000 n
-0000232436 00000 n
-0000232556 00000 n
-0000237877 00000 n
-0000238695 00000 n
-0000238895 00000 n
-0000239941 00000 n
-0000238972 00000 n
-0000239071 00000 n
-0000240178 00000 n
-0000240797 00000 n
-0000240998 00000 n
-0000244938 00000 n
-0000241326 00000 n
-0000241442 00000 n
-0000245176 00000 n
-0000245919 00000 n
-0000246121 00000 n
-0000247495 00000 n
-0000246199 00000 n
-0000246301 00000 n
-0000247731 00000 n
-0000248347 00000 n
-0000248546 00000 n
-0000250780 00000 n
-0000248724 00000 n
-0000248829 00000 n
-0000251018 00000 n
-0000251684 00000 n
-0000251886 00000 n
-0000254681 00000 n
-0000252085 00000 n
-0000252194 00000 n
-0000254920 00000 n
-0000255608 00000 n
-0000255811 00000 n
-0000256852 00000 n
-0000255888 00000 n
-0000255987 00000 n
-0000257090 00000 n
-0000257711 00000 n
-0000257913 00000 n
-0000260100 00000 n
-0000258055 00000 n
-0000258164 00000 n
-0000260339 00000 n
-0000261003 00000 n
-0000269006 00000 n
-0000261206 00000 n
-0000277730 00000 n
-0000269261 00000 n
-0000285016 00000 n
-0000278007 00000 n
-0000292299 00000 n
-0000285238 00000 n
-0000293485 00000 n
-0000293566 00000 n
-0000296533 00000 n
-0000297207 00000 n
-0000297888 00000 n
-0000297979 00000 n
-0000298017 00000 n
-0000298145 00000 n
+0000011912 00000 n
+0000011974 00000 n
+0000261620 00000 n
+0000258329 00000 n
+0000256225 00000 n
+0000252313 00000 n
+0000248979 00000 n
+0000246548 00000 n
+0000241427 00000 n
+0000239326 00000 n
+0000232444 00000 n
+0000221803 00000 n
+0000218453 00000 n
+0000215362 00000 n
+0000205360 00000 n
+0000202024 00000 n
+0000293450 00000 n
+0000293306 00000 n
+0000196363 00000 n
+0000194469 00000 n
+0000185652 00000 n
+0000182424 00000 n
+0000178672 00000 n
+0000293876 00000 n
+0000011692 00000 n
+0000016452 00000 n
+0000016611 00000 n
+0000017074 00000 n
+0000016278 00000 n
+0000012480 00000 n
+0000016769 00000 n
+0000016415 00000 n
+0000026734 00000 n
+0000026893 00000 n
+0000021998 00000 n
+0000021693 00000 n
+0000017289 00000 n
+0000021814 00000 n
+0000171458 00000 n
+0000165195 00000 n
+0000162395 00000 n
+0000027052 00000 n
+0000027210 00000 n
+0000027369 00000 n
+0000027530 00000 n
+0000027754 00000 n
+0000026528 00000 n
+0000022278 00000 n
+0000027692 00000 n
+0000154998 00000 n
+0000151391 00000 n
+0000026665 00000 n
+0000032903 00000 n
+0000033062 00000 n
+0000033221 00000 n
+0000033522 00000 n
+0000032721 00000 n
+0000028034 00000 n
+0000033400 00000 n
+0000143498 00000 n
+0000032858 00000 n
+0000037420 00000 n
+0000037543 00000 n
+0000037237 00000 n
+0000033841 00000 n
+0000037358 00000 n
+0000040346 00000 n
+0000040505 00000 n
+0000040848 00000 n
+0000040172 00000 n
+0000037732 00000 n
+0000040664 00000 n
+0000040309 00000 n
+0000044477 00000 n
+0000044636 00000 n
+0000044979 00000 n
+0000044303 00000 n
+0000041063 00000 n
+0000044795 00000 n
+0000044440 00000 n
+0000049002 00000 n
+0000049161 00000 n
+0000049504 00000 n
+0000048828 00000 n
+0000045168 00000 n
+0000049320 00000 n
+0000293592 00000 n
+0000048965 00000 n
+0000053455 00000 n
+0000053150 00000 n
+0000049784 00000 n
+0000053271 00000 n
+0000057240 00000 n
+0000056935 00000 n
+0000053709 00000 n
+0000057056 00000 n
+0000294028 00000 n
+0000061345 00000 n
+0000060979 00000 n
+0000057468 00000 n
+0000061100 00000 n
+0000066381 00000 n
+0000066137 00000 n
+0000061612 00000 n
+0000066258 00000 n
+0000293733 00000 n
+0000070480 00000 n
+0000070050 00000 n
+0000066609 00000 n
+0000070171 00000 n
+0000074225 00000 n
+0000074384 00000 n
+0000074667 00000 n
+0000074051 00000 n
+0000070695 00000 n
+0000074543 00000 n
+0000074188 00000 n
+0000078028 00000 n
+0000077845 00000 n
+0000074869 00000 n
+0000077966 00000 n
+0000140145 00000 n
+0000081586 00000 n
+0000081744 00000 n
+0000081902 00000 n
+0000082204 00000 n
+0000081404 00000 n
+0000078256 00000 n
+0000082080 00000 n
+0000138079 00000 n
+0000125918 00000 n
+0000111191 00000 n
+0000081541 00000 n
+0000085429 00000 n
+0000085060 00000 n
+0000082497 00000 n
+0000085181 00000 n
+0000088182 00000 n
+0000087999 00000 n
+0000085631 00000 n
+0000088120 00000 n
+0000090774 00000 n
+0000093185 00000 n
+0000093336 00000 n
+0000090989 00000 n
+0000090608 00000 n
+0000088345 00000 n
+0000090927 00000 n
+0000090745 00000 n
+0000093493 00000 n
+0000093651 00000 n
+0000093809 00000 n
+0000093962 00000 n
+0000094120 00000 n
+0000094278 00000 n
+0000094436 00000 n
+0000094589 00000 n
+0000094747 00000 n
+0000094904 00000 n
+0000095067 00000 n
+0000095230 00000 n
+0000095393 00000 n
+0000095549 00000 n
+0000095713 00000 n
+0000095877 00000 n
+0000096041 00000 n
+0000096199 00000 n
+0000096363 00000 n
+0000096527 00000 n
+0000096685 00000 n
+0000096843 00000 n
+0000096996 00000 n
+0000097152 00000 n
+0000097310 00000 n
+0000097467 00000 n
+0000097625 00000 n
+0000097778 00000 n
+0000097936 00000 n
+0000098156 00000 n
+0000092779 00000 n
+0000091243 00000 n
+0000098094 00000 n
+0000294180 00000 n
+0000092916 00000 n
+0000098411 00000 n
+0000110393 00000 n
+0000098638 00000 n
+0000098740 00000 n
+0000110632 00000 n
+0000111353 00000 n
+0000111584 00000 n
+0000125093 00000 n
+0000111906 00000 n
+0000112012 00000 n
+0000125324 00000 n
+0000126072 00000 n
+0000126295 00000 n
+0000137326 00000 n
+0000126441 00000 n
+0000126538 00000 n
+0000137563 00000 n
+0000138238 00000 n
+0000138466 00000 n
+0000139458 00000 n
+0000138509 00000 n
+0000138604 00000 n
+0000139698 00000 n
+0000140300 00000 n
+0000140501 00000 n
+0000140526 00000 n
+0000140552 00000 n
+0000142741 00000 n
+0000140720 00000 n
+0000140823 00000 n
+0000142986 00000 n
+0000143659 00000 n
+0000143866 00000 n
+0000150418 00000 n
+0000144346 00000 n
+0000144462 00000 n
+0000150655 00000 n
+0000151546 00000 n
+0000151747 00000 n
+0000154235 00000 n
+0000151929 00000 n
+0000152034 00000 n
+0000154479 00000 n
+0000155159 00000 n
+0000155366 00000 n
+0000161478 00000 n
+0000155802 00000 n
+0000155922 00000 n
+0000161715 00000 n
+0000162549 00000 n
+0000162749 00000 n
+0000164455 00000 n
+0000162872 00000 n
+0000162978 00000 n
+0000164701 00000 n
+0000165357 00000 n
+0000165565 00000 n
+0000170605 00000 n
+0000165933 00000 n
+0000166053 00000 n
+0000170846 00000 n
+0000171614 00000 n
+0000171816 00000 n
+0000177726 00000 n
+0000172251 00000 n
+0000172361 00000 n
+0000177963 00000 n
+0000178827 00000 n
+0000179028 00000 n
+0000181663 00000 n
+0000179220 00000 n
+0000179325 00000 n
+0000181903 00000 n
+0000182579 00000 n
+0000182780 00000 n
+0000184885 00000 n
+0000183014 00000 n
+0000183119 00000 n
+0000185122 00000 n
+0000185807 00000 n
+0000186008 00000 n
+0000193476 00000 n
+0000186553 00000 n
+0000186684 00000 n
+0000193714 00000 n
+0000194625 00000 n
+0000194827 00000 n
+0000195680 00000 n
+0000194860 00000 n
+0000194954 00000 n
+0000195919 00000 n
+0000196519 00000 n
+0000196721 00000 n
+0000196951 00000 n
+0000197039 00000 n
+0000201193 00000 n
+0000197369 00000 n
+0000197478 00000 n
+0000201432 00000 n
+0000202179 00000 n
+0000202380 00000 n
+0000204609 00000 n
+0000202568 00000 n
+0000202672 00000 n
+0000204846 00000 n
+0000205515 00000 n
+0000205716 00000 n
+0000214302 00000 n
+0000206193 00000 n
+0000206313 00000 n
+0000214540 00000 n
+0000215518 00000 n
+0000215720 00000 n
+0000217727 00000 n
+0000215833 00000 n
+0000215936 00000 n
+0000217966 00000 n
+0000218609 00000 n
+0000218811 00000 n
+0000221030 00000 n
+0000219035 00000 n
+0000219140 00000 n
+0000221268 00000 n
+0000221959 00000 n
+0000222161 00000 n
+0000231361 00000 n
+0000222790 00000 n
+0000222926 00000 n
+0000231600 00000 n
+0000232601 00000 n
+0000232804 00000 n
+0000238425 00000 n
+0000233221 00000 n
+0000233341 00000 n
+0000238662 00000 n
+0000239480 00000 n
+0000239680 00000 n
+0000240726 00000 n
+0000239757 00000 n
+0000239856 00000 n
+0000240963 00000 n
+0000241582 00000 n
+0000241783 00000 n
+0000245723 00000 n
+0000242111 00000 n
+0000242227 00000 n
+0000245961 00000 n
+0000246704 00000 n
+0000246906 00000 n
+0000248280 00000 n
+0000246984 00000 n
+0000247086 00000 n
+0000248516 00000 n
+0000249132 00000 n
+0000249331 00000 n
+0000251565 00000 n
+0000249509 00000 n
+0000249614 00000 n
+0000251803 00000 n
+0000252469 00000 n
+0000252671 00000 n
+0000255455 00000 n
+0000252863 00000 n
+0000252972 00000 n
+0000255694 00000 n
+0000256382 00000 n
+0000256585 00000 n
+0000257626 00000 n
+0000256662 00000 n
+0000256761 00000 n
+0000257864 00000 n
+0000258485 00000 n
+0000258687 00000 n
+0000260874 00000 n
+0000258829 00000 n
+0000258938 00000 n
+0000261113 00000 n
+0000261777 00000 n
+0000269780 00000 n
+0000261980 00000 n
+0000278504 00000 n
+0000270035 00000 n
+0000285790 00000 n
+0000278781 00000 n
+0000293073 00000 n
+0000286012 00000 n
+0000294259 00000 n
+0000294340 00000 n
+0000297307 00000 n
+0000297981 00000 n
+0000298662 00000 n
+0000298753 00000 n
+0000298791 00000 n
+0000298919 00000 n
trailer
-<< /Size 515 /Root 513 0 R /Info 514 0 R /ID [ <5D1DE3161FCB9626A289358A417330C7> <5D1DE3161FCB9626A289358A417330C7> ] >>
+<< /Size 515 /Root 513 0 R /Info 514 0 R /ID [ <68798E2E477CE3B48821B97DA5E2E1DD> <68798E2E477CE3B48821B97DA5E2E1DD> ] >>
startxref
-298693
+299467
%%EOF
diff --git a/macros/luatex/latex/piton/piton-french.tex b/macros/luatex/latex/piton/piton-french.tex
index 5c7debb147..bb193283a5 100644
--- a/macros/luatex/latex/piton/piton-french.tex
+++ b/macros/luatex/latex/piton/piton-french.tex
@@ -1,1735 +1,1750 @@
-% -*- coding: utf-8 ; -*-
-\documentclass[dvipsnames]{article}
-
-\usepackage{fontspec}
-
-\usepackage[french]{babel}
-\frenchsetup{og = « , fg = »}
-
-\usepackage[footnotehyper,escape-inside=$$,math-comments]{piton}
-
-\usepackage[executable=python.exe]{pyluatex}
-
-\usepackage{xcolor}
-
-\usepackage{geometry}
-\geometry{left=2.8cm,right=2.8cm,top=2.5cm,bottom=2.5cm,papersize={21cm,29.7cm}}
-
-\usepackage{enumitem}
-\usepackage{verbatim}
-\usepackage{amsmath}
-\usepackage{tabularx}
-\usepackage{booktabs}
-\usepackage{tcolorbox}
-\usepackage{luacolor,lua-ul}
-
-\usepackage{caption}
-
-% We use \MakeShortVerb of shortvrb and not \DefineShortVerb of fancyvrb
-% because we don't want the contents of short verbatim colored in gray
-\usepackage{shortvrb}
-\MakeShortVerb{\|}
-
-\usepackage{varwidth}
-
-\skip\footins = 2\bigskipamount
-
-\usepackage{fancyvrb}
-\fvset{commandchars=\~\#\@,formatcom=\color{gray}}
-\def\emphase{\bgroup\color{RoyalPurple}\let\next=}
-
-
-\usepackage{titlesec}
-\titlespacing*{\section}{0pt}{6.5ex plus 1ex minus .2ex}{4.3ex plus .2ex}
-\titlespacing*{\subsection}{0pt}{4.5ex plus 1ex minus .2ex}{2ex plus .2ex}
-
-\def\interitem{\vspace{7mm plus 2 mm minus 3mm}}
-
-
-\usepackage[hyperfootnotes = false]{hyperref}
-
-\hypersetup
- {
- pdfinfo =
- {
- Title = L’extension piton ,
- Subject = Une extension LaTeX ,
- Author = F. Pantigny
- }
- }
-
-
-
-
-\NewDocumentCommand {\pkg} {m} {\textsf{#1}}
-\NewDocumentCommand {\cls} {m} {\textsf{#1}}
-
-\setlength{\parindent}{0pt}
-
-
-\begin{document}
-
-\PitonOptions{splittable = 4}
-
-\VerbatimFootnotes
-
-
-\title{L'extension LaTeX \pkg{piton}\thanks{Ce document correspond à la
-version~\myfileversion\space de \pkg{piton}, à la date du~\myfiledate.}}
-\author{F. Pantigny \\ \texttt{fpantigny@wanadoo.fr}}
-
-\maketitle
-
-\begin{abstract}
-L'extension \pkg{piton} propose des outils pour composer du code Python avec une coloration syntaxique
-en utilisant la bibliothèque Lua LPEG. L'extension \pkg{piton} nécessite l'emploi de LuaLaTeX.
-\end{abstract}
-
-
-
-\section{Présentation}
-
-L'extension \pkg{piton} utilise la librairie Lua nommée LPEG\footnote{LPEG est une librairie de capture de motifs
- (\emph{pattern-matching} en anglais) pour Lua, écrite en C, fondée sur les PEG (\emph{parsing expression
- grammars}): \url{http://www.inf.puc-rio.br/~roberto/lpeg/}} pour «parser» le code Python et le composer avec un
-coloriage syntaxique. Comme elle utilise du code Lua, elle fonctionne uniquement avec |lualatex| (et ne va pas
-fonctionner avec les autres moteurs de compilation LaTeX, que ce soit |latex|, |pdflatex| ou |xelatex|). Elle
-n'utilise aucun programme extérieur et la compilation ne requiert donc pas |--shell-escape|. La compilation est
-très rapide puisque tout le travail du parseur est fait par la librairie LPEG, écrite en C.
-
-\bigskip
-Voici un exemple de code Python composé avec l'environnement |{Piton}| proposé par \pkg{piton}.
-
-
-\bigskip
-\begin{Piton}
-from math import pi
-
-def arctan(x,n=10):
- """Calcule la valeur mathématique de arctan(x)
-
- n est le nombre de termes de la somme
- """
- if x < 0:
- return -arctan(-x) # appel récursif
- elif x > 1:
- return pi/2 - arctan(1/x)
- #> (on a utilisé le fait que $\arctan(x)+\arctan(1/x)=\pi/2$ pour $x>0$)\footnote{Cet échappement vers LaTeX a été obtenu en débutant par \ttfamily\#>.}
- else:
- s = 0
- for k in range(n):
- s += (-1)**k/(2*k+1)*x**(2*k+1)
- return s
-\end{Piton}
-
-
-\bigskip
-
-L'extension LaTeX \pkg{piton} est entièrement contenue dans le fichier |piton.sty|. Ce
-fichier peut être placé dans le répertoire courant ou dans une arborescence |texmf|. Le mieux reste néanmoins
-d'installer \pkg{piton} avec une distribution TeX comme MiKTeX, TeX~Live ou MacTeX.
-
-
-\section{Utilisation de l'extension}
-
-\subsection{Chargement de l'extension}
-
-L'extension \pkg{piton} se charge simplement avec la commande |\usepackage| : |\usepackage{piton}|.
-
-On a cependant deux remarques à formuler :
-\begin{itemize}
-\item l'extension \pkg{piton} utilise l'extension \pkg{xcolor} (mais \pkg{piton} ne charge pas \pkg{xcolor} : si
-\pkg{xcolor} n'est pas chargée avant le |\begin{document}|, une erreur fatale sera levée) ;
-
-\item l'extension \pkg{piton} n'est utilisable qu'avec LuaLaTeX : si un autre moteur de compilation (comme |latex|,
-|pdflatex| ou |xelatex|) est utilisé, une erreur fatale sera levée.
-\end{itemize}
-
-\subsection{Les commandes et environnements à la disposition de l'utilisateur}
-
-L'extension \pkg{piton} fournit plusieurs outils pour composer du code Python: les commandes |\piton|,
-l'environnement |{Piton}| et la commande |\PitonInputFile|.
-
-\begin{itemize} \setlength{\fboxsep}{1pt}
-\item La commande \colorbox{gray!20}{\ttfamily \textbackslash piton} doit être utilisée pour composer de petits éléments de code à l'intérieur d'un
-paragraphe. Par exemple :
-
-{\color{gray}\verb|\piton{def carré(x): return x*x}|}\qquad
-\piton{def carré(x): return x*x}
-
-La syntaxe et les particularités de la commande sont détaillées ci-après.
-
-
-\item L'environnement \colorbox{gray!20}{\ttfamily \{Piton\}} doit être utilisé pour composer des codes de
-plusieurs lignes. Comme cet environnement prend son argument selon un mode verbatim, il ne peut pas être utilisé
-dans l'argument d'une commande LaTeX. Pour les besoins de personnalisation, il est possible de définir de nouveaux
-environnements similaires à |{Piton}| en utilisant la commande |\NewPitonEnvironment| : cf. partie
-\ref{NewPitonEnvironment} p.~\pageref{NewPitonEnvironment}.
-
-\item La commande \colorbox{gray!20}{\ttfamily \textbackslash PitonInputFile} doit être utilisée pour insérer et
-composer un fichier extérieur.
-
-Cette commande prend en argument optionnel entre crochets deux clés |first-line| et |last-line| qui permettent de
-n'insérer que la partie du fichier comprise entre les lignes correspondantes.
-\end{itemize}
-
-
-\subsection{La syntaxe de la commande \textbackslash piton}
-
-
-La commande |\piton| possède en fait une syntaxe double. Elle est peut être utilisée comme une commande standard de
-LaTeX prenant son argument entre accolades (|\piton{...}|), ou bien selon la syntaxe de la commande |\verb| où l'argument est
-délimité entre deux caractères identiques (par ex. : \verb!\piton|...|!). On détaille maintenant ces deux syntaxes.
-
-\bigskip
-\begin{itemize}
-\item {\color{blue} \textsf{Syntaxe} \verb|\piton{...}|}\par\nobreak
-
-Quant son argument est donné entre accolades, la commande |\piton| ne prend pas son argument en mode verbatim. Les
-points suivants doivent être remarqués :
-
-\begin{itemize}
-\item plusieurs espaces successives sont remplacées par une unique espace,
-
-{\color{cyan} mais la commande |\|␣ est fournie pour forcer l'insertion d'une espace} ;
-
-\item il n'est pas possible d'utiliser le caractère |%| à l'intérieur,
-
-{\color{cyan} mais la commande |\%| est fournie pour insérer un |%|} ;
-
-\item les accolades doivent apparaître par paires correctement imbriquées,
-
-{\color{cyan} mais les commandes |\{| et |\}| sont aussi fournies pour insérer des accolades individuelles} ;
-
-\item les commandes LaTeX\footnote{Cela s'applique aux commandes commençant par une contre-oblique |\| mais également aux caractères actifs.} sont
-complètement développées sans être exécutées
-
-{\color{cyan} et on peut donc utiliser |\\| pour insérer une contre-oblique}.
-\end{itemize}
-
-Les autres caractères (y compris |#|, |^|, |_|, |&|, |$| % $
-et |@|) doivent être insérés sans contre-oblique.
-
-\bigskip
-\begin{tabular}{>{\color{gray}}w{l}{75mm}@{\hspace*{1cm}}l}
-\omit Exemples : \hfil \\
-\noalign{\vskip1mm}
-\verb|\piton{ma_chaîne = '\\n'}| &
-\piton{ma_chaîne = '\\n' } \\
-\verb|\piton{def pair(n): return n\%2==0}| &
-\piton{def pair(n): return n\%2==0 } \\
-\verb|\piton{c="#" # une affectation }| &
-\piton{c="#" # une affectation } \\
-\verb|\piton{c="#" \ \ \ # une affectation }| &
-\piton{c="#" \ \ \ # une affectation } \\
-\verb|\piton{my_dict = {'a': 3, 'b': 4}}| &
-\piton{my_dict = {'a': 3, 'b': 4}}
-\end{tabular}
-
-\bigskip
-La commande |\piton| avec son argument entre accolades peut être utilisée dans les arguments des autres commandes LaTeX.\footnote{La commande
- |\piton| peut par exemple être
- utilisée dans une note de bas de page. Exemple : \piton{s = 'Une chaîne'}.}
-
-\bigskip
-\item {\color{blue} \textsf{Syntaxe} \verb!\piton|...|!}\par\nobreak
-
-Quand la commande |\piton| prend son argument entre deux caractères identiques, cet argument est pris \emph{en mode
- verbatim}. De ce fait, avec cette syntaxe, la commande |\piton| ne peut \emph{pas} être utilisée dans l'argument d'une
-autre fonction.
-
-\medskip
-\begin{tabular}{>{\color{gray}}w{l}{75mm}@{\hspace*{1cm}}l}
-\omit Exemples : \hfil \\
-\noalign{\vskip1mm}
-\verb!\piton|ma_chaîne = '\n'|! &
-\piton|ma_chaîne = '\n'| \\
-\verb|\piton!def pair(n): return n%2==0!| &
-\piton!def pair(n): return n%2==0! \\
-\verb|\piton+c="#" # une affectation +| &
-\piton+c="#" # une affectation + \\
-\verb|\piton?my_dict = {'a': 3, 'b': 4}?| &
-\piton!my_dict = {'a': 3, 'b': 4}!
-\end{tabular}
-
-\end{itemize}
-
-
-
-\section{Personnalisation}
-
-\subsection{La commande \textbackslash PitonOptions}
-
-\NewDocumentCommand{\Definition}{m}
- {{\setlength{\fboxsep}{1pt}\colorbox{gray!20}{\ttfamily \vphantom{gl}#1}}}
-
-
-La commande |\PitonOptions| prend en argument une liste de couples \textsl{clé=valeur}. La portée des réglages
-effectués par cette commande est le groupe TeX courant.\footnote{On rappelle que tout environnement LaTeX est, en particulier, un groupe.}
-
-\begin{itemize}
-\item La clé \Definition{gobble} prend comme valeur un entier positif $n$ : les $n$ premiers caractères de chaque
-ligne sont alors retirés (avant formatage du code) dans les environnements |{Piton}|. Ces $n$ caractères ne sont
-pas nécessairement des espaces.
-
-\item Quand la clé \Definition{auto-gobble} est activée, l'extension \pkg{piton} détermine la valeur minimale $n$
-du nombre d'espaces successifs débutant chaque ligne (non vide) de l'environnement |{Piton}| et applique |gobble|
-avec cette valeur de~$n$.
-
-\item Quand la clé \Definition{env-gobble} est activée, \pkg{piton} analyse la dernière ligne de l'environnement,
-c'est-à-dire celle qui contient le |\end{Piton}| et détermine si cette ligne ne comporte que des espaces suivis par
-|\end{Piton}|. Si c'est le cas, \pkg{piton} calcule le nombre $n$ de ces espaces et applique |gobble| avec cette
-valeur de~$n$. Le nom de cette clé vient de \emph{environment gobble}: le nombre d'espaces à retirer ne dépend que
-de la position des délimiteurs |\begin{Piton}| et |\end{Piton}| de l'environnement.
-
-\item Avec la clé \Definition{line-numbers}, les lignes \emph{non vides} (et toutes les lignes des
-\emph{docstrings}, y compris celles qui sont vides) sont numérotées dans les environnements \verb|{Piton}| et dans
-les listings produits par la commande |\PitonInputFile|.
-
-\item Avec la clé \Definition{all-line-numbers}, \emph{toutes} les lignes sont numérotées, y compris les lignes vides.
-
-\item \colorbox{yellow!50}{\textbf{Nouveau 1.5}}\par\nobreak
-
-La clé \Definition{numbers-sep} est la distance horizontale entre les numéros de lignes (insérés par |line-numbers|
-ou |all-line-numbers|) et les lignes du code informatique. La valeur initiale est 0.7~em.
-
-\item La clé \Definition{left-margin} fixe une marge sur la gauche. Cette clé peut être utile, en particulier, en
-conjonction avec l'une des clés |line-numbers| et |all-line-numbers| si on ne souhaite pas que les numéros de ligne
-soient dans une position en débordement sur la gauche.
-
-Il est possible de donner à la clé |left-margin| la valeur spéciale~|auto|. Avec cette valeur, une marge est
-insérée automatiquement pour les numéros de ligne quand l'une des clés |line-numbers| ou |all-line-numbers| est
-utilisée. Voir un exemple à la partie \ref{example-numbering} p.~\pageref{example-numbering}.
-
-\item Avec la clé \Definition{resume}, le compteur de lignes n'est pas remis à zéro comme il l'est normalement au
-début d'un environnement |{Piton}| ou bien au début d'un listing produit par |\PitonInputFile|. Cela permet de
-poursuivre la numérotation d'un environnement à l'autre.
-
-\item La clé \Definition{background-color} fixe la couleur de fond des environnements |{Piton}| et des listings
-produits par |\PitonInputFile| (ce fond a une largeur égale à la valeur courante de |\linewidth|). La clé
-|background-color| accepte une couleur définie «à la volée», c'est-à-dire que l'on peut écrire par exemple
-|background-color = [cmyk]{0.1,0.05,0,0}|
-
-\smallskip
-\colorbox{yellow!50}{\textbf{Nouveau 1.4}}\enskip La clé |background-color| accepte aussi en argument une
-\emph{liste} de couleurs. Les lignes sont alors coloriées de manière cyclique avec ces couleurs.
-
-\emph{Exemple} : |\PitonOptions{background-color = {gray!5,white}}|
-
-\item Avec la clé \Definition{prompt-background-color}, \pkg{piton} ajoute un fond coloré aux lignes débutant par
-le prompt «|>>>|» (et sa continuation «|...|») caractéristique des consoles Python avec boucle \textsc{repl}
-(\emph{read-only-eval loop}). Pour un exemple d'utilisation de cette clé, voir la partie \ref{pythonrepl}
-p.~\pageref{pythonrepl}.
-
-\item En activant la clé \Definition{show-spaces-in-strings}, les espaces dans les chaînes courtes (c'est-à-dire
-celles délimitées par |'| ou |"|) sont matérialisés par le caractère ␣ (U+2423 : \textsc{open box}). Bien sûr, le
-caractère U+2423 doit être présent dans la fonte mono-chasse utilisée.\footnote{L'extension \pkg{piton} utilise
- simplement la fonte mono-chasse courante. Pour la changer, le mieux est d'utiliser |\setmonofont| de
- \pkg{fontspec}.}\par\nobreak
-%
-\begingroup
-\PitonOptions{show-spaces-in-strings}
-Exemple : \piton{my_string = 'Très bonne réponse'}
-\endgroup
-
-\smallskip
-Avec la clé \Definition{show-spaces}, tous les espaces sont matérialisés (et aucune coupure de ligne ne peut plus
-intervenir sur ces espaces matérialisés, même si la clé |break-lines|\footnote{cf. \ref{line-breaks} p.~\pageref{line-breaks}.} est active).
-\end{itemize}
-
-\bigskip
-
-\begingroup
-\fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
-\begin{Verbatim}
-~emphase&\PitonOptions{line-numbers,auto-gobble,background-color = gray!15}@
-\begin{Piton}
- from math import pi
-
- def arctan(x,n=10):
- """Calcule la valeur mathématique de arctan(x)
-
- n est le nombre de termes de la somme
- """
- if x < 0:
- return -arctan(-x) # appel récursif
- elif x > 1:
- return pi/2 - arctan(1/x)
- #> (on a utilisé le fait que $\arctan(x)+\arctan(1/x)=\pi/2$ pour $x>0$)
- else:
- s = 0
- for k in range(n):
- s += (-1)**k/(2*k+1)*x**(2*k+1)
- return s
-\end{Piton}
-\end{Verbatim}
-\endgroup
-
-
-\begingroup
-\PitonOptions{line-numbers,auto-gobble,background-color = gray!15}
-\begin{Piton}
- from math import pi
-
- def arctan(x,n=10):
- """Compute the value of arctan(x)
-
- n is the number of terms in the sum
- """
- if x < 0:
- return -arctan(-x) # appel récursif
- elif x > 1:
- return pi/2 - arctan(1/x)
- #> (on a utilisé le fait que $\arctan(x)+\arctan(1/x)=\pi/2$ pour $x>0$)
- else:
- s = 0
- for k in range(n):
- s += (-1)**k/(2*k+1)*x**(2*k+1)
- return s
-\end{Piton}
-\endgroup
-
-
-
-\bigskip
-La commande |\PitonOptions| propose d'autres clés qui seront décrites plus loin (voir en particulier la coupure des
-pages et des lignes p.~\pageref{breakable}).
-
-
-\subsection{Les styles}
-
-\label{styles}
-
-L'extension \pkg{piton} fournit la commande |\SetPitonStyle| pour personnaliser les différents styles utilisés pour
-formater les éléments syntaxiques des listings Python. Ces personnalisations ont une portée qui correspond au
-groupe TeX courant.\footnote{On rappelle que tout environnement LaTeX est, en particulier, un groupe.}
-
-\bigskip
-La commande |\SetPitonStyle| prend en argument une liste de couples \textsl{clé=valeur}. Les clés sont les noms des
-styles et les valeurs sont les instructions LaTeX de formatage correspondantes.
-
-\bigskip
-Ces instructions LaTeX doivent être des instructions de formatage du type de |\bfseries|, |\slshape|,
-|\color{...}|, etc. (les commandes de ce type sont parfois qualifiées de \emph{semi-globales}). Il est aussi
-possible de mettre, \emph{à la fin de la liste d'instructions}, une commande LaTeX prenant exactement un argument.
-
-\bigskip
-Voici un exemple qui change le style utilisé pour le nom d'une fonction Python, au moment de sa définition
-(c'est-à-dire après le mot-clé |def|). Elle utilise la commande |\highLight| de \pkg{lua-ul} (qui nécessite
-lui-même le chargement de \pkg{luacolor}).
-
-\begin{Verbatim}
-\SetPitonStyle
- { Name.Function = \bfseries \hightLight[red!50] }
-\end{Verbatim}
-
-Ici, |\highLight[red!50]| doit être considéré comme le nom d'une fonction LaTeX qui prend exactement un argument,
-puisque, habituellement, elle est utilisée avec |\highLight[red!50]{|\texttt{\slshape text}|}|.
-
-\medskip
-\begingroup
-\SetPitonStyle
- { Name.Function = \bfseries \highLight[red!50] }
-Avec ce réglage, on obtient : \piton{def cube(x) : return x * x * x }
-\endgroup
-
-
-\bigskip
-Les différents styles sont décrits dans la table \ref{Semantic}. Les réglages initiaux effectués par \pkg{piton}
-dans |piton.sty| sont inspirés par le style \pkg{manni} de Pygments.\footnote{Voir
- \url{https://pygments.org/styles/}. À remarquer que, par défaut, Pygments propose pour le style \pkg{manni} un
- fond coloré dont la couleur est la couleur HTML |#F0F3F3|. Il est possible d'avoir la même couleur dans |{Piton}|
- avec l'instruction : |\PitonOptions{background-color = [HTML]{F0F3F3}}|}
-
-\begin{table}[htb]
-\centering
-\caption{Les styles proposés par \pkg{piton}}
-\label{Semantic}
-\begin{tabularx}{0.9\textwidth}{@{}>{\ttfamily}l>{\raggedright\arraybackslash}X@{}}
-\toprule
-\normalfont Style & Usage \\
-\midrule
-Number & les nombres \\
-String.Short & les chaînes de caractères courtes (entre \texttt{'} ou \texttt{"}) \\
-String.Long & les chaînes de caractères longues (entre \texttt{'''} ou \texttt{"""}) sauf les chaînes de
- documentation \\
-String & cette clé fixe à la fois |String.Short| et |String.Long| \\
-String.Doc & les chaînes de documentation (seulement entre |"""| suivant PEP~257) \\
-String.Interpol & les éléments syntaxiques des champs des f-strings (c'est-à-dire les caractères \texttt{\{}et \texttt{\}}) \\
-Operator & les opérateurs suivants : \texttt{!= == << >> - \~{} + / * \% = < > \& .} \verb+|+ \verb|@| \\
-Operator.Word & les opérateurs suivants : |in|, |is|, |and|, |or| et |not| \\
-Name.Builtin & la plupart des fonctions prédéfinies par Python \\
-Name.Function & le nom des fonctions définies par l'utilisateur \emph{au moment de leur définition}, c'est-à-dire
- après le mot-clé \verb|def| \\
-Name.Decorator & les décorateurs (instructions débutant par \verb|@|) \\
-Name.Namespace & le nom des modules (= bibliothèques extérieures) \\
-Name.Class & le nom des classes au moment de leur définition, c'est-à-dire après le mot-clé \verb|class| \\
-Exception & le nom des exceptions prédéfinies (ex.: SyntaxError) \\
-Comment & les commentaires commençant par \texttt{\#} \\
-Comment.LaTeX & les commentaires commençant par \texttt{\#>} qui sont composés en LaTeX par \pkg{piton} (et
- appelés simplement «commentaires LaTeX» dans ce document) \\
-Keyword.Constant & |True|, |False| et |None| \\
-Keyword & les mots-clés suivants :
- \ttfamily assert, break, case, continue, del,
- elif, else, except, exec, finally, for, from,
- global, if, import, lambda, non local,
- pass, raise, return, try, while,
- with, yield, yield from.\\
-\bottomrule
-\end{tabularx}
-\end{table}
-
-\bigskip
-\colorbox{yellow!50}{\textbf{Nouveau 1.4}}\enskip La commande |\PitonStyle| prend en argument le nom d'un style
-et permet de récupérer la valeur (en tant que liste d'instructions LaTeX) de ce style.
-
-\smallskip
-Par exemple, on peut écrire, dans le texte courant, |{\PitonStyle{Keyword}{function}}| et on aura
-le mot {\PitonStyle{Keyword}{function}} formaté comme un mot-clé.
-
-\smallskip
-La syntaxe |{\PitonStyle{|\textsl{\texttt{style}}|}{...}}| est nécessaire pour pouvoir tenir compte à la fois des commandes
-semi-globales et des commandes à argument présentes dans la valeur courante du style \texttt{\textsl{style}}.
-
-
-\subsection{Définition de nouveaux environnements}
-
-\label{NewPitonEnvironment}
-
-Comme l'environnement |{Piton}| a besoin d'absorber son contenu d'une manière spéciale (à peu près comme du texte
-verbatim), il n'est pas possible de définir de nouveaux environnements directement au-dessus de l'environnement
-|{Piton}| avec les commandes classiques |\newenvironment| et |\NewDocumentEnvironment|.
-
-C'est pourquoi \pkg{piton} propose une commande |\NewPitonEnvironment|. Cette commande a la même syntaxe que la
-commande classique |\NewDocumentEnvironment|.
-
-\bigskip
-Par exemple, avec l'instruction suivante, un nouvel environnement |{Python}| sera défini avec le même comportement
-que l'environnement |{Piton}|:
-
-{\color{gray}\verb|\NewPitonEnvironment{Python}{}{}{}|}
-
-
-\bigskip
-Si on souhaite un environnement |{Python}| qui prenne en argument optionnel entre crochets les clés de
-|\PitonOptions|, on peut écrire :
-
-{\color{gray}\verb|\NewPitonEnvironment{Python}{O{}}{\PitonOptions{#1}}{}|}
-
-\bigskip
-Si on souhaite un environnement |{Python}| qui compose le code inclus dans une boîte de \pkg{tcolorbox}, on peut
-écrire (à condition, bien entendu, d'avoir chargé l'extension \pkg{tcolorbox}):
-
-\begin{Verbatim}
-\NewPitonEnvironment{Python}{}
- {\begin{tcolorbox}}
- {\end{tcolorbox}}
-\end{Verbatim}
-
-\bigskip
-Avec ce nouvel environnement |{Python}|, on peut écrire :
-
-\begin{Verbatim}
-~emphase#\begin{Python}@
-def carré(x):
- """Calcule le carré d'un nombre"""
- return x*x
-~emphase#\end{Python}@
-\end{Verbatim}
-
-\NewPitonEnvironment{Python}{}
- {\begin{tcolorbox}}
- {\end{tcolorbox}}
-
-\begin{Python}
-def carré(x):
- """Calcule le carré d'un nombre"""
- return x*x
-\end{Python}
-
-
-\section{Fonctionnalités avancées}
-
-
-\subsection{Mise en évidence d'identificateurs}
-
-\colorbox{yellow!50}{\textbf{Nouveau 1.4}}
-
-On peut demander le changement de formatage de certains identificateurs avec la clé |identifiers| de
-|\PitonOptions|.
-
-\smallskip
-Cette clé prend en argument une valeur au format suivant :
-
-\quad |{ names = |\textsl{\ttfamily noms}|, style = |\textsl{\ttfamily instructions}| }|
-
-\begin{itemize}
-\item \textsl{\ttfamily noms} est une liste de noms d'identificateurs (séparés par des virgules) ;
-
-\item \textsl{\ttfamily instructions} est une liste d'instructions LaTeX de formatage du même type que pour les
-styles précédemment définis (cf.~\ref{styles} p.~\pageref{styles}).
-\end{itemize}
-
-\emph{Attention} : Seuls les identifiants peuvent voir leur formatage affecté. Les mots-clés et les noms de
-fonctions prédéfinies ne seront pas affectés, même s'ils figurent dans la liste \textsl{\ttfamily noms}.
-
-\begin{Verbatim}
-\PitonOptions
- {
- ~emphase#identifiers@ =
- {
- ~emphase#names@ = { l1 , l2 } ,
- ~emphase#style@ = \color{red}
- }
- }
-
-\begin{Piton}
-def tri(l):
- """Tri par segmentation"""
- if len(l) <= 1:
- return l
- else:
- a = l[0]
- l1 = [ x for x in l[1:] if x < a ]
- l2 = [ x for x in l[1:] if x >= a ]
- return tri(l1) + [a] + tri(l2)
-\end{Piton}
-\end{Verbatim}
-
-
-\bigskip
-
-\begingroup
-
-\PitonOptions
- {
- identifiers =
- {
- names = { l1 , l2 } ,
- style = \color{red}
- }
- }
-
-\begin{Piton}
-def tri(l):
- """Tri par segmentation"""
- if len(l) <= 1:
- return l
- else:
- a = l[0]
- l1 = [ x for x in l[1:] if x < a ]
- l2 = [ x for x in l[1:] if x >= a ]
- return tri(l1) + [a] + tri(l2)
-\end{Piton}
-
-\endgroup
-
-\bigskip
-En utilisant la clé |identifiers|, on peut ajouter de nouvelles fonctions prédéfinies (ou de nouveaux mots-clés,
-etc.) qui seront détectées par \pkg{piton}.
-
-
-\begin{Verbatim}
-\PitonOptions
- {
- ~emphase#identifiers@ =
- {
- names = { cos, sin, tan, floor, ceil, trunc, pow, exp, ln, factorial } ,
- style = \PitonStyle{Name.Builtin}
- }
- }
-
-\begin{Piton}
-from math import *
-cos(pi/2)
-factorial(5)
-ceil(-2.3)
-floor(5.4)
-\end{Piton}
-\end{Verbatim}
-
-\begingroup
-
-\PitonOptions
- {
- identifiers =
- {
- names = { cos, sin, tan, floor, ceil, trunc, pow, exp, ln, factorial } ,
- style = \PitonStyle{Name.Builtin}
- }
- }
-
-\begin{Piton}
-from math import *
-cos(pi/2)
-factorial(5)
-ceil(-2.3)
-floor(5.4)
-\end{Piton}
-
-
-\endgroup
-
-\subsection{Les échappements vers LaTeX}
-
-L'extension \pkg{piton} propose plusieurs mécanismes d'échappement vers LaTeX :
-\begin{itemize}
-\item Il est possible d'avoir des commentaires entièrement composés en LaTeX.
-\item Il est possible d'avoir, dans les commentaires Python, les éléments entre \texttt{\$} composés en mode
-mathématique de LaTeX.
-\item Il est possible d'insérer du code LaTeX à n'importe quel endroit d'un listing Python.
-\end{itemize}
-Ces mécanismes vont être détaillés dans les sous-parties de cette partie.
-
-\smallskip
-À remarquer également que, dans le cas où \pkg{piton} est utilisée dans la classe \cls{beamer}, \pkg{piton} détecte
-la plupart des commandes et environnements de Beamer : voir la sous-section \ref{beamer}, p.~\pageref{beamer}.
-
-
-\subsubsection{Les «commentaires LaTeX»}
-
-Dans ce document, on appelle «commentaire LaTeX» des commentaires qui débutent par |#>|. Tout ce qui suit ces deux
-caractères, et jusqu'à la fin de la ligne, sera composé comme du code LaTeX standard.
-
-Il y a deux outils pour personnaliser ces commentaires.
-
-\begin{itemize}
-\item Il est possible de changer le marquage syntaxique utilisé (qui vaut initialement~|#>|). Pour ce faire, il
-existe une clé |comment-latex|, disponible seulement au chargement de \pkg{piton} (c'est-à-dire au moment du
-|\usepackage|), qui permet de choisir les caractères qui (précédés par~|#|) serviront de marqueur syntaxique.
-
-Par exemple, avec le chargement suivant :
-
-\quad \verb|\usepackage[comment-latex = LaTeX]{piton}|
-
-les commentaires LaTeX commenceront par~|#LaTeX|.
-
-Si on donne la valeur nulle à la clé |comment-latex|, tous les commentaires Python (débutant par~|#|) seront en
-fait des «commentaires LaTeX».
-
-\smallskip
-\item Il est possible de changer le formatage du commentaire LaTeX lui-même en changeant le style \pkg{piton}
-|Comment.LaTeX|.
-
-Par exemple, avec |\SetPitonStyle{Comment.LaTeX = \normalfont\color{blue}}|, les commentaires LaTeX seront composés
-en bleu.
-
-Si on souhaite qu'un croisillon (|#|) soit affiché en début de commentaire dans le \textsc{pdf}, on peut régler
-|Comment.LaTeX| de la manière suivante :
-
-\begin{Verbatim}
-\SetPitonStyle{Comment.LaTeX = \color{gray}\~#\normalfont\space }
-\end{Verbatim}
-
-Pour d'autres exemples de personnalisation des commentaires LaTeX, voir la partie \ref{example-comments}
-p.~\pageref{example-comments}.
-\end{itemize}
-
-
-\bigskip
-Si l'utilisateur a demandé l'affichage des numéros de ligne (avec |line-numbers| ou |all-line-numbers|), il est
-possible de faire référence à ce numéro de ligne avec la commande |\label| placée dans un commentaire
-LaTeX.\footnote{Cette fonctionnalité est implémentée en redéfinissant, dans les environnements |{Piton}|, la
- commande |\label|. Il peut donc y avoir des incompatibilités avec les extensions qui redéfinissent (globalement)
- cette commande |\label| (comme \pkg{varioref}, \pkg{refcheck}, \pkg{showlabels}, etc.)}
-
-
-
-
-\subsubsection{La clé «math-comments»}
-
-Il est possible de demander que, dans les commentaires Python normaux, c'est-à-dire débutant par~|#| (et non par
-|#>|), les éléments placés entre symboles \texttt{\$} soient composés en mode mathématique de LaTeX (le reste du
-commentaire restant composé en verbatim).
-
-La clé |math-comments|, qui n'est disponible qu'au chargement de \pkg{piton} (c'est-à-dire au moment du
-|\usepackage|), active ce comportement.
-
-\bigskip
-Dans l'exemple suivant, on suppose que la clé |math-comments| a été utilisée au chargement de \pkg{piton}.
-
-\begin{Verbatim}
-\begin{Piton}
-def carré(x):
- return x*x ~# renvoie $x^2$
-\end{Piton}
-\end{Verbatim}
-
-\begin{Piton}
-def carré(x):
- return x*x # renvoie $x^2$
-\end{Piton}
-
-
-\subsubsection{Le mécanisme «espace-inside»}
-
-Il est aussi possible de surcharger les listings Python pour y insérer du code LaTeX à peu près n'importe où (mais
-entre deux lexèmes, bien entendu). Cette fonctionnalité n'est pas activée par défaut par \pkg{piton}. Pour
-l'utiliser, il faut spécifier les deux caractères marquant l'échappement (le premier le commençant et le deuxième
-le terminant) en utilisant la clé |escape-inside| au chargement de \pkg{piton} (c'est-à-dire au moment du
-|\usepackage|). Les deux caractères peuvent être identiques.
-
-
-\bigskip
-Dans l'exemple suivant, on suppose que l'extension \pkg{piton} a été chargée de la manière suivante :
-
-\begin{Verbatim}
-\usepackage[~emphase#escape-inside=$$@]{piton}
-\end{Verbatim}
-
-\medskip
-Dans le code suivant, qui est une programmation récursive de la factorielle, on décide de surligner en jaune
-l'instruction qui contient l'appel récursif. Cet exemple utilise la commande |\highLight| de \pkg{lua-ul} (cette
-extension requiert aussi l'extension \pkg{luacolor}).
-\begin{Verbatim}
-\begin{Piton}
-def fact(n):
- if n==0:
- return 1
- else:
- ~emphase#$\highLight{$@return n*fact(n-1)~emphase#$}$@
-\end{Piton}
-\end{Verbatim}
-
-\begin{Piton}
-def fact(n):
- if n==0:
- return 1
- else:
- $\highLight{$return n*fact(n-1)$}$
-\end{Piton}
-
-\bigskip
-En fait, dans le cas présent, il serait sans doute plus habile d'utiliser la commande |\@highLight| de
-\pkg{lua-ul}: cette commande bascule vers un fond jaune jusqu'à la fin du groupe TeX courant. Comme le nom de cette
-commande contient le caractère |@|, il convient de lui donner un synonyme sans caractère |@| pour pouvoir
-l'utiliser directement dans |{Piton}|.
-
-\begingroup
-\fvset{commandchars=\~\#\+,formatcom=\color{gray}}
-\begin{Verbatim}
-\makeatletter
-~emphase#\let\Jaune\@highLight+
-\makeatother
-\end{Verbatim}
-\endgroup
-
-\begin{Verbatim}
-\begin{Piton}
-def fact(n):
- if n==0:
- return 1
- else:
- ~emphase#$\Jaune$@return n*fact(n-1)
-\end{Piton}
-\end{Verbatim}
-
-\makeatletter
-\let\Jaune\@highLight
-\makeatother
-
-
-\begin{Piton}
-def fact(n):
- if n==0:
- return 1
- else:
- $\Jaune$return n*fact(n-1)
-\end{Piton}
-
-
-
-\bigskip
-\emph{Attention} : L'échappement vers LaTeX permis par les caractères de |escape-inside| n'est pas actif dans les
-chaînes de caractères ni dans les commentaires (pour avoir un commentaire entièrement en échappement vers LaTeX,
-c'est-à-dire ce qui est
-appelé dans ce document «commentaire LaTeX», il suffit de le faire débuter par |#>|).
-
-
-
-
-\subsection{Comportement dans la classe Beamer}
-
-\label{beamer}
-
-\emph{Première remarque}\par\nobreak
-Remarquons que, comme l'environnement |{Piton}| prend son argument selon un mode verbatim, il convient, ce qui
-n'est pas surprenant, de l'utiliser dans des environnements |{frame}| de Beamer protégés par la clé |fragile|.\footnote{On
- rappelle que pour un environnement |{frame}| de Beamer qui utilise la clé |fragile|, l'instruction |\end{frame}|
- doit être seule sur une ligne (à l'exception d'éventuels espaces en début de ligne).}
-
-
-\medskip
-Quand l'extension \pkg{piton} est utilisée dans la classe \cls{beamer}\footnote{L'extension \pkg{piton} détecte la
- classe \cls{beamer} mais il est aussi possible, si le besoin s'en faisait sentir, d'activer ce comportement avec
- la clé |beamer| au chargement de \pkg{piton} : |\usepackage[beamer]{piton}|}, le comportement de \pkg{piton} est
-légèrement modifié, comme décrit maintenant.
-
-\subsubsection{\{Piton\} et \textbackslash PitonInputFile sont ``overlay-aware''}
-
-Quand \pkg{piton} est utilisé avec Beamer, l'environnement |{Piton}| et la commande |\PitonInputFile| acceptent
-l'argument optionnel |<...>| de Beamer pour indiquer les «\emph{overlays}» concernés.
-
-On peut par exemple écrire :
-
-\begin{Verbatim}
-\begin{Piton}~emphase#<2-5>@
-...
-\end{Piton}
-\end{Verbatim}
-
-ou aussi
-
-\begin{Verbatim}
-\PitonInputFile~emphase#<2-5>@{mon_fichier.py}
-\end{Verbatim}
-
-
-\subsubsection{Commandes de Beamer reconnues dans \{Piton\} et \textbackslash PitonInputFile}
-
-Quand \pkg{piton} est utilisé dans la classe \cls{beamer}, les commandes suivantes de \cls{beamer} (classées selon
-leur nombre d'arguments obligatoires) sont directement reconnues dans les environnements |{Piton}| (ainsi que dans
-les listings composés par la commande |\PitonInputFile|, même si c'est sans doute moins utile).
-%
-\begin{itemize}
-\item aucun argument obligatoire : |\pause|\footnote{On remarquera que, bien sûr, on peut aussi utiliser |\pause|
- dans un «commentaire LaTeX», c'est-à-dire en écrivant |#> \pause|. Ainsi, si le code Python est copié, il est
- interprétable par Python.} ;
-\item un argument obligatoire : |\action|, |\alert|, |\invisible|, |\only|, |\uncover| et |\visible| ;
-\item deux arguments obligatoire : |\alt| ;
-\item trois arguments obligatoires : |\temporal|.
-\end{itemize}
-
-\medskip
-Les accolades dans les arguments obligatoires de ces commandes doivent être équilibrées (cependant, les accolades
-présentes dans des chaînes courtes\footnote{Les chaînes courtes de Python sont les chaînes (string) délimitées par
- les caractères \texttt{'} ou \texttt{"} non triplés. En Python, les chaînes de caractères courtes ne peuvent pas
- s'étendre sur plusieurs lignes de code.} de Python ne sont pas prises en compte).
-
-
-\medskip
-Voici un exemple complet de fichier :
-
-\begin{Verbatim}[formatcom = \small\color{gray}]
-\documentclass{beamer}
-\usepackage{piton}
-\begin{document}
-\begin{frame}[fragile]
-\begin{Piton}
-def string_of_list(l):
- """Convertit une liste de nombres en chaîne"""
-~emphase# \only<2->{s = "{" + str(l[0])}@
-~emphase# \only<3->{for x in l[1:]: s = s + "," + str(x)}@
-~emphase# \only<4->{s = s + "}"}@
- return s
-\end{Piton}
-\end{frame}
-\end{document}
-\end{Verbatim}
-
-Dans l'exemple précédent, les accolades des deux chaînes de caractères Python |"{"| et |"}"| sont correctement
-interprétées (sans aucun caractère d'échappement).
-
-
-
-\bigskip
-\subsubsection{Environnements de Beamer reconnus dans \{Piton\} et \textbackslash PitonInputFile}
-
-Quand \pkg{piton} est utilisé dans la classe \pkg{beamer}, les environnements suivants de Beamer sont directement
-reconnus dans les environnements |{Piton}| (ainsi que dans les listings composés par la commande |\PitonInputFile|
-même si c'est sans doute moins utile) : |{actionenv}|, |{alertenv}|, |{invisibleenv}|, |{onlyenv}|, |{uncoverenv}|
-et |{visibleenv}|.
-
-
-\medskip
-Il y a néanmoins une restriction : ces environnements doivent englober des \emph{lignes entières de code Python}.
-
-
-\medskip
-On peut par exemple écrire :
-
-\begin{Verbatim}[formatcom = \small\color{gray}]
-\documentclass{beamer}
-\usepackage{piton}
-\begin{document}
-\begin{frame}[fragile]
-\begin{Piton}
-def carré(x):
- """Calcule le carré de l'argument"""
- ~emphase#\begin{uncoverenv}<2>@
- return x*x
- ~emphase#\end{uncoverenv}@
-\end{Piton}
-\end{frame}
-\end{document}
-\end{Verbatim}
-
-
-
-\vspace{1cm}
-\textbf{Remarque à propos de la commande \textbackslash alert et de l'environnement \{alertenv\} de Beamer}\par\nobreak
-
-\smallskip
-Beamer propose un moyen aisé de changer la couleur utilisée par l'environnement |{alertenv}| (et par la commande
-|\alert| qui s'appuie dessus). Par exemple, on peut écrire:
-
-\begin{Verbatim}
-\setbeamercolor{~emphase#alerted text@}{fg=blue}
-\end{Verbatim}
-
-Néanmoins, dans le cas d'une utilisation à l'intérieur d'un environnement |{Piton}| un tel réglage n'est sans doute
-pas pertinent, puisque, justement, \pkg{piton} va (le plus souvent) changer la couleur des élements selon leur
-valeur lexicale. On préfèrera sans doute un environnement |{alertenv}| qui change la couleur de fond des
-éléments à mettre en évidence.
-
-\smallskip
-Voici un code qui effectuera ce travail en mettant un fond jaune. Ce code utilise la commande |\@highLight| de
-l'extension \pkg{lua-ul} (cette extension nécessite elle-même l'extension \pkg{luacolor}).
-
-\begingroup
-\fvset{commandchars=\~\#\+,formatcom=\color{gray}}
-\begin{Verbatim}
-\setbeamercolor{alerted text}{bg=yellow!50}
-\makeatletter
-\AddToHook{env/Piton/begin}
- {\renewenvironment<>{alertenv}{\only~#1{~emphase#\@highLight+[alerted text.bg]}}{}}
-\makeatother
-\end{Verbatim}
-\endgroup
-
-Ce code redéfinit localement l'environnement |{alertenv}| à l'intérieur de l'environnement |{Piton}| (on rappelle
-que la commande |\alert| s'appuie sur cet environnement |{alertenv}|).
-
-
-
-\bigskip
-\subsection{Coupure des pages et des lignes}
-
-\label{breakable}
-
-\subsubsection{Coupure des pages}
-
-Par défaut les listings produits par l'environnement |{Piton}| et par la commande |\PitonInputFile| sont
-insécables.
-
-Néanmoins, la commande |\PitonOptions| propose la clé |splittable| pour autoriser de telles coupures.
-
-\begin{itemize}
-\item Si la clé |splittable| est utilisée sans valeur, les listings sont sécables n'importe où.
-
-\item Si la clé |splittable| est utilisée avec une valeur numérique $n$ (qui doit être un entier naturel non nul),
-alors les listings seront sécables mais aucune coupure ne pourra avoir lieu entre les $n$~premières lignes, ni
-entre les $n$~dernières. De ce fait, |splittable=1| est équivalent à |splittable|.
-\end{itemize}
-
-\medskip
-\emph{Remarque}\par\nobreak
-
-Même avec une couleur de fond (fixée avec |background-color|), les sauts de page sont possibles, à partir du moment
-où la clé |splittable| est utilisée.\footnote{Avec la clé |splittable|, un environnement |{Piton}| est sécable même dans un environnement de
- \pkg{tcolorbox} (à partir du moment où la clé |breakable| de \pkg{tcolorbox} est utilisée). On précise cela parce
- que, en revanche, un environnement de \pkg{tcolorbox} inclus dans un autre environnement de \pkg{tcolorbox} n'est
- pas sécable, même quand les deux utilisent la clé |breakable|.}
-
-\subsubsection{Coupure des lignes}
-
-\label{line-breaks}
-
-Par défaut, les éléments produits par \pkg{piton} ne peuvent pas être coupés par une fin de ligne. Il existe
-néanmoins des clés pour autoriser de telles coupures (les points de coupure possibles sont les espaces, y compris
-les espaces dans les chaînes Python).
-\begin{itemize}
-\item Avec la clé |break-lines-in-piton|, les coupures de ligne sont autorisées dans la commande |\piton{...}|
-(mais pas dans la commande \verb+\piton|...|+, c'est-à-dire avec la syntaxe verbatim).
-
-\item Avec la clé |break-lines-in-Piton|, les coupures de ligne sont autorisées dans l'environnement |{Piton}|
-(d'où la lettre |P| capitale dans le nom) et dans les listings produits par |\PitonInputFile|.
-
-\item La clé |break-lines| est la conjonction des deux clés précédentes.
-\end{itemize}
-
-\medskip
-L'extension \pkg{piton} fournit aussi plusieurs clés pour contrôler l'apparence des coupures de ligne autorisées par |break-lines-in-Piton|.
-
-\begin{itemize}
-\item Avec la clé |indent-broken-lines|, l'indentation de la ligne coupée est respectée à chaque retour à la ligne.
-
-\item La clé |end-of-broken-line| correspond au symbole placé à la fin d'une ligne coupée. Sa valeur initiale est :
-|\hspace*{0.5em}\textbackslash|.
-
-\item La clé |continuation-symbol| correspond au symbole placé à chaque retour de ligne dans la marge gauche. Sa
-valeur initiale est : |+\;|.
-
-\item La clé |continuation-symbol-on-indentation| correspond au symbole placé à chaque retour de ligne au niveau de
-l'indentation (uniquement dans le cas où la clé |indent-broken-lines| est active). Sa valeur initiale est :
-|$\hookrightarrow\;$|.
-\end{itemize}
-
-\bigskip
-Le code suivant a été composé dans une |{minipage}| standard de LaTeX de largeur 12~cm avec le réglage suivant :
-
-\begin{Verbatim}
-\PitonOptions{break-lines,indent-broken-lines,background-color=gray!15}
-\end{Verbatim}
-
-\begin{center}
-\PitonOptions{break-lines,indent-broken-lines,background-color=gray!15}
-\begin{minipage}{12cm}
-\begin{Piton}
-def dict_of_liste(liste):
- """Convertit une liste de subrs et de descriptions de glyphes en dictionnaire"""
- dict = {}
- for liste_lettre in liste:
- if (liste_lettre[0][0:3] == 'dup'): # si c'est un subr
- nom = liste_lettre[0][4:-3]
- print("On traite le subr de numéro " + nom)
- else:
- nom = liste_lettre[0][1:-3] # si c'est un glyphe
- print("On traite le glyphe du caractère " + nom)
- dict[nom] = [traite_ligne_Postscript(k) for k in liste_lettre[1:-1]]
- return dict
-\end{Piton}
-\end{minipage}
-\end{center}
-
-
-
-\bigskip
-\subsection{Notes de pied de page dans les environnements de piton}
-
-\label{footnote}
-
-Si vous voulez mettre des notes de pied de page dans un environnement de \pkg{piton} (ou bien dans un listing
-produit par |\PitonInputFile|, bien que cela paraisse moins pertinent dans ce cas-là) vous pouvez utiliser une
-paire |\footnotemark|--|\footnotetext|.
-
-\smallskip
-Néanmoins, il est également possible d'extraire les notes de pieds de page avec l'extension \pkg{footnote} ou bien
-l'extension \pkg{footnotehyper}.
-
-\smallskip
-Si \pkg{piton} est chargée avec l'option |footnote| (avec |\usepackage[footnote]{piton}|) l'extension
-\pkg{footnote} est chargée (si elle ne l'est pas déjà) et elle est utilisée pour extraire les notes de pied de
-page.
-
-\smallskip
-Si \pkg{piton} est chargée avec l'option |footnotehyper|, l'extension \pkg{footnotehyper} est chargée (si
-elle ne l'est pas déjà) et elle est utilisée pour extraire les notes de pied de page.
-
-\smallskip
-Attention : Les extensions \pkg{footnote} et \pkg{footnotehyper} sont incompatibles.
-L'extension \pkg{footnotehyper} est le successeur de l'extension \pkg{footnote}
-et devrait être utilisée préférentiellement. L'extension \pkg{footnote} a quelques défauts ;
-en particulier, elle doit être chargée après l'extension \pkg{xcolor} et elle n'est pas parfaitement
-compatible avec \pkg{hyperref}.
-
-\medskip
-Dans ce document, l'extension \pkg{piton} a été chargée avec l'option |footnotehyper| et c'est pourquoi des notes
-peuvent être mises dans les environnements |{Piton}| : voir un exemple sur la première page de ce document.
-
-\subsection{Tabulations}
-
-\smallskip
-Même s'il est recommandé d'indenter les listings Python avec des espaces (cf. PEP~8), \pkg{piton} accepte les
-caractères de tabulations (U+0009) en début de ligne. Chaque caractère U+0009 est remplacé par $n$ espaces. La
-valeur initiale de~$n$ est~4 mais on peut la changer avec la clé |tab-size| de |\PitonOptions|.
-
-\smallskip
-Il existe aussi une clé |tabs-auto-gobble| qui détermine le nombre minimal de caractères U+0009 débutant chaque
-ligne (non vide) de l'environnement |{Piton}| et applique |gobble| avec cette valeur (avant le remplacement des
-caractères U+0009 par des espaces, bien entendu). Cette clé est donc similaire à la clé |auto-gobble| mais agit sur
-des caractères U+0009 au lieu de caractères U+0020 (espaces).
-
-\section{Exemples}
-
-
-\subsection{Numérotation des lignes}
-
-\label{example-numbering}
-
-On rappelle que l'on peut demander la numérotation des lignes des listings avec la clé |line-numbers| ou la clé |all-line-numbers|.
-
-Par défaut, les numéros de ligne sont composés par \pkg{piton} en débordement à gauche (en utilisant en interne la commande |\llap| de LaTeX).
-
-Si on ne veut pas de débordement, on peut utiliser l'option |left-margin=auto| qui va insérer une marge adaptée aux
-numéros qui seront insérés (elle est plus large quand les numéros dépassent 10).
-
-
-\begingroup
-\fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
-\begin{Verbatim}
-~emphase&\PitonOptions{background-color=gray!10, left-margin = auto, line-numbers}@
-\begin{Piton}
-def arctan(x,n=10):
- if x < 0:
- return -arctan(-x) #> (appel récursif)
- elif x > 1:
- return pi/2 - arctan(1/x) #> (autre appel récursif)
- else:
- return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-\end{Piton}
-\end{Verbatim}
-\endgroup
-
-
-
-\begingroup
-\PitonOptions{background-color=gray!10,left-margin = auto, line-numbers}
-\begin{Piton}
-def arctan(x,n=10):
- if x < 0:
- return -arctan(-x) #> (appel récursif)
- elif x > 1:
- return pi/2 - arctan(1/x) #> (autre appel récursif)
- else:
- return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-\end{Piton}
-\endgroup
-
-
-\bigskip
-
-\subsection{Formatage des commentaires LaTeX}
-
-\label{example-comments}
-
-On peut modifier le style |Comment.LaTeX| (avec |\SetPitonStyle|) pour faire afficher les commentaires
-LaTeX (qui débutent par |#>|) en butée à droite.
-
-\begingroup
-\fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
-\begin{Verbatim}
-\PitonOptions{background-color=gray!10}
-~emphase&\SetPitonStyle{Comment.LaTeX = \hfill \normalfont\color{gray}}@
-\begin{Piton}
-def arctan(x,n=10):
- if x < 0:
- return -arctan(-x) #> appel récursif
- elif x > 1:
- return pi/2 - arctan(1/x) #> autre appel récursif
- else:
- return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-\end{Piton}
-\end{Verbatim}
-\endgroup
-
-\begingroup
-\PitonOptions{background-color=gray!10}
-\SetPitonStyle{Comment.LaTeX = \hfill \normalfont\color{gray}}
-\begin{Piton}
-def arctan(x,n=10):
- if x < 0:
- return -arctan(-x) #> appel récursif
- elif x > 1:
- return pi/2 - arctan(1/x) #> autre appel récursif
- else:
- return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-\end{Piton}
-\endgroup
-
-
-\vspace{1cm}
-On peut aussi faire afficher les commentaires dans une deuxième colonne à droite si on limite la largeur du code
-proprement dit avec un environnement |{minipage}| de LaTeX.
-
-
-\begingroup
-\fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
-\begin{Verbatim}
-\PitonOptions{background-color=gray!10}
-~emphase&\NewDocumentCommand{\MyLaTeXCommand}{m}{\hfill \normalfont\itshape\rlap{\quad #1}}@
-~emphase&\SetPitonStyle{Comment.LaTeX = \MyLaTeXCommand}@
-~emphase&\begin{minipage}{12cm}@
-\begin{Piton}
-def arctan(x,n=10):
- if x < 0:
- return -arctan(-x) #> appel récursif
- elif x > 1:
- return pi/2 - arctan(1/x) #> autre appel récursif
- else:
- s = 0
- for k in range(n):
- s += (-1)**k/(2*k+1)*x**(2*k+1)
- return s
-\end{Piton}
-~emphase&\end{minipage}@
-\end{Verbatim}
-\endgroup
-
-
-
-\begingroup
-\PitonOptions{background-color=gray!10}
-\NewDocumentCommand{\MyLaTeXCommand}{m}{\hfill \normalfont\itshape\rlap{\quad #1}}
-\SetPitonStyle{Comment.LaTeX = \MyLaTeXCommand}
-\begin{minipage}{12cm}
-\begin{Piton}
-def arctan(x,n=10):
- if x < 0:
- return -arctan(-x) #> appel récursif
- elif x > 1:
- return pi/2 - arctan(1/x) #> autre appel récursif
- else:
- s = 0
- for k in range(n):
- s += (-1)**k/(2*k+1)*x**(2*k+1)
- return s
-\end{Piton}
-\end{minipage}
-\endgroup
-
-\bigskip
-
-\subsection{Notes dans les listings}
-
-Pour pouvoir extraire les notes (introduites par |\footnote|), l'extension |piton| doit être chargée, soit avec la
-clé |footnote|, soit avec la clé |footnotehyper|, comme expliqué à la section \ref{footnote} p.~\pageref{footnote}.
-Dans le présent document, l'extension \pkg{piton} a été chargée par la clé |footnotehyper|.
-
-Bien entendu, une commande |\footnote| ne peut apparaître que dans un commentaire LaTeX (qui débute par |#>|). Un
-tel commentaire peut se limiter à cette unique commande |\footnote|, comme dans l'exemple suivant.
-
-\begingroup
-\fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
-\begin{Verbatim}
-\PitonOptions{background-color=gray!10}
-\begin{Piton}
-def arctan(x,n=10):
- if x < 0:
- return -arctan(-x)~emphase&#>\footnote{Un premier appel récursif.}]@
- elif x > 1:
- return pi/2 - arctan(1/x)~emphase&#>\footnote{Un deuxième appel récursif.}@
- else:
- return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-\end{Piton}
-\end{Verbatim}
-\endgroup
-
-\begingroup
-\PitonOptions{background-color=gray!10}
-\begin{Piton}
-def arctan(x,n=10):
- if x < 0:
- return -arctan(-x)#>\footnote{Un premier appel récursif.}
- elif x > 1:
- return pi/2 - arctan(1/x)#>\footnote{Un deuxième appel récursif.}
- else:
- return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-\end{Piton}
-\endgroup
-
-
-\vspace{1cm}
-
-Si on utilise l'environnement |{Piton}| dans un environnement |{minipage}| de LaTeX, les notes sont, bien entendu,
-composées au bas de l'environnement |{minipage}|. Rappelons qu'une telle |{minipage}| ne peut être coupée par un
-saut de page.
-
-
-\begingroup
-\fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
-\begin{Verbatim}
-\PitonOptions{background-color=gray!10}
-\emphase\begin{minipage}{\linewidth}
-\begin{Piton}
-def arctan(x,n=10):
- if x < 0:
- return -arctan(-x)~emphase&#>\footnote{Un premier appel récursif.}@
- elif x > 1:
- return pi/2 - arctan(1/x)~emphase&#>\footnote{Un deuxième appel récursif.}@
- else:
- return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-\end{Piton}
-\end{minipage}
-\end{Verbatim}
-\endgroup
-
-\begingroup
-\PitonOptions{background-color=gray!10}
-\begin{minipage}{\linewidth}
-\begin{Piton}
-def arctan(x,n=10):
- if x < 0:
- return -arctan(-x)#>\footnote{Un premier appel récursif.}
- elif x > 1:
- return pi/2 - arctan(1/x)#>\footnote{Un deuxième appel récursif.}
- else:
- return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-\end{Piton}
-\end{minipage}
-\endgroup
-
-
-\vspace{1cm}
-Si on encapsule l'environnement |{Piton}| dans un environnement |{minipage}| pour, typiquement, limiter la largeur
-d'un fond coloré, il faut encadrer l'ensemble dans un environnement |{savenotes}| (de \pkg{footnote} ou
-\pkg{footnotehyper}) si on veut avoir les notes reportées en pied de page.
-
-\begingroup
-\fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
-\begin{Verbatim}
-\PitonOptions{background-color=gray!10}
-~emphase&\begin{savenotes}@
-\begin{minipage}{13cm}
-\begin{Piton}
-def arctan(x,n=10):
- if x < 0:
- return -arctan(-x)~emphase&#>\footnote{Un premier appel récursif.}@
- elif x > 1:
- return pi/2 - arctan(1/x)~emphase&#>\footnote{Un deuxième appel récursif.}@
- else:
- return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-\end{Piton}
-\end{minipage}
-~emphase&\end{savenotes}@
-\end{Verbatim}
-\endgroup
-
-
-
-\begin{savenotes}
-\PitonOptions{background-color=gray!10}
-\begin{minipage}{13cm}
-\begin{Piton}
-def arctan(x,n=10):
- if x < 0:
- return -arctan(-x)#>\footnote{Un premier appel récursif.}
- elif x > 1:
- return pi/2 - arctan(1/x)#>\footnote{Un deuxième appel récursif.}
- else:
- return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-\end{Piton}
-\end{minipage}
-\end{savenotes}
-
-\bigskip
-
-\subsection{Un exemple de réglage des styles}
-
-Les styles graphiques ont été présentés à la partie \ref{styles}, p.~\pageref{styles}.
-
-\smallskip
-On présente ici un réglage de ces styles adapté pour les documents en noir et blanc. On l'utilise avec la fonte
-\emph{DejaVu Sans Mono}\footnote{Voir: \url{https://dejavu-fonts.github.io}} spécifiée avec la commande
- |\setmonofont| de \pkg{fontspec}.
-
-Ce réglage utilise la commande |\highLight| de \pkg{lua-ul} (cette extension nécessite elle-même l'extension \pkg{luacolor}).
-
-
-\begin{Verbatim}
-\setmonofont[Scale=0.85]{DejaVu Sans Mono}
-
-\SetPitonStyle
- {
- Number = ,
- String = \itshape ,
- String.Doc = \color{gray} \itshape ,
- Operator = ,
- Operator.Word = \bfseries ,
- Name.Builtin = ,
- Name.Function = \bfseries \highLight[gray!20] ,
- Comment = \color{gray} ,
- Comment.LaTeX = \normalfont \color{gray},
- Keyword = \bfseries ,
- Name.Namespace = ,
- Name.Class = ,
- Name.Type = ,
- InitialValues = \color{gray}
- }
-\end{Verbatim}
-
-
-\begingroup
-
-
-\setmonofont[Scale=0.85]{DejaVu Sans Mono}
-
-\SetPitonStyle
- {
- Number = ,
- String = \itshape ,
- String.Doc = \color{gray} \itshape ,
- Operator = ,
- Operator.Word = \bfseries ,
- Name.Builtin = ,
- Name.Function = \bfseries \highLight[gray!20] ,
- Comment = \color{gray} ,
- Comment.LaTeX = \normalfont \color{gray},
- Keyword = \bfseries ,
- Name.Namespace = ,
- Name.Class = ,
- Name.Type = ,
- InitialValues = \color{gray}
- }
-
-
-\bigskip
-
-\begin{Piton}
-from math import pi
-
-def arctan(x,n=10):
- """Compute the mathematical value of arctan(x)
-
- n is the number of terms in the sum
- """
- if x < 0:
- return -arctan(-x) # appel récursif
- elif x > 1:
- return pi/2 - arctan(1/x)
- #> (on a utilisé le fait que $\arctan(x)+\arctan(1/x)=\pi/2$ pour $x>0$)
- else:
- s = 0
- for k in range(n):
- s += (-1)**k/(2*k+1)*x**(2*k+1)
- return s
-\end{Piton}
-
-
-\endgroup
-
-\section{Utilisation avec pyluatex}
-
-\subsection{Utilisation standard de pyluatex}
-
-L'extension \pkg{pyluatex} est une extension qui permet l'exécution de code Python à partir de |lualatex| (pourvu
-que Python soit installé sur la machine et que la compilation soit effectuée avec |lualatex| et |--shell-escape|).
-
-Voici, à titre d'exemple, un environnement |{PitonExecute}| qui formate un listing Python (avec \pkg{piton}) et qui
-affiche également dessous le résultat de l'exécution de ce code avec Python.
-
-
-\begin{Verbatim}
-\ExplSyntaxOn
-\NewDocumentEnvironment { ~emphase#PitonExecute@ } { ! O { } } % le ! est obligatoire
- {
- \PyLTVerbatimEnv
- \begin{pythonq}
- }
- {
- \end{pythonq}
- \directlua
- {
- tex.print("\\PitonOptions{~#1}")
- tex.print("\\begin{Piton}")
- tex.print(pyluatex.get_last_code())
- tex.print("\\end{Piton}")
- tex.print("")
- }
- \begin{center}
- \directlua{tex.print(pyluatex.get_last_output())}
- \end{center}
- }
-\ExplSyntaxOff
-\end{Verbatim}
-
-\ExplSyntaxOn
-\NewDocumentEnvironment { PitonExecute } { ! O { } }
- {
- \PyLTVerbatimEnv
- \begin{pythonq}
- }
- {
- \end{pythonq}
- \directlua
- {
- tex.print("\\PitonOptions{#1}")
- tex.print("\\begin{Piton}")
- tex.print(pyluatex.get_last_code())
- tex.print("\\end{Piton}")
- tex.print("")
- }
- \begin{center}
- \directlua{tex.print(pyluatex.get_last_output())}
- \end{center}
- }
-\ExplSyntaxOff
-
-Cet environnement |{PitonExecute}| prend en argument optionnel (entre crochets) les options proposées par la
-commande |\PitonOptions|.
-
-\bigskip
-Voici un exemple d'utilisation de cet environnement |{PitonExecute}| :
-
-\begin{Verbatim}
-\begin{~emphase#PitonExecute@}[background-color=gray!15]
-def square(x):
- return x*x
-print(f'Le carré de 12 est {square(12)}.')
-\end{~emphase#PitonExecute@}
-\end{Verbatim}
-
-
-\medskip
-\begin{PitonExecute}[background-color=gray!15]
-def square(x):
- return x*x
-print(f'Le carré de 12 est {square(12)}.')
-\end{PitonExecute}
-
-\bigskip
-
-\subsection{Utilisation de l'environnement \{pythonrepl\} de pyluatex}
-
-\label{pythonrepl}
-
-L'environnement |{pythonrepl}| de \pkg{pyluatex} passe son contenu à Python et renvoie ce que l'on obtient quand on
-fournit ce code à une boucle \textsc{repl} (\emph{read-eval-print loop}) de Python. On obtient un entrelacement
-d'instructions précédées par le prompt |>>>| de Python et des valeurs renvoyées par Python (et de ce qui a été
-demandé d'être affiché avec des \piton{print} de Python).
-
-\medskip
-Il est ensuite possible de passer cela à un environnement |{Piton}| qui va faire un coloriage syntaxique
-et mettre sur fond grisé les lignes correspondant aux instructions fournies à l'interpréteur Python (gràce à la clé
-|prompt-background-color| de |\PitonOptions|).
-
-
-\medskip
-Voici la programmation d'un environnement |{PitonREPL}| qui effectue ce travail (pour des raisons techniques, le
-|!| est ici obligatoire dans la signature de l'environnement).
-
-\begin{Verbatim}
-\NewDocumentEnvironment { PitonREPL } { ! O { } } % le ! est obligatoire
- {
- \PitonOptions
- { background-color=white,
- ~emphase#prompt-background-color = gray!10@,
- ~#1
- }
- \PyLTVerbatimEnv
- \begin{pythonrepl}
- }
- {
- \directlua
- {
- tex.print("\\begin{Piton}")
- tex.print(pyluatex.get_last_output())
- tex.print("\\end{Piton}")
- tex.print("")
- }
- \end{pythonrepl}
- }
-\end{Verbatim}
-
-\medskip
-Voici un exemple d'utilisation de ce nouvel environnement |{PitonREPL}|.
-
-\medskip
-\begin{Verbatim}
-~emphase#\begin{PitonREPL}@
- def valeur_absolue(x):
- "Renvoie la valeur absolue de x"
- if x > 0:
- return x
- else:
- return -x
-
- valeur_absolue(-3)
- valeur_absolue(0)
- valeur_absolue(5)
-~emphase#\end{PitonREPL}@
-\end{Verbatim}
-
-\bigskip
-
-
-\NewDocumentEnvironment { PitonREPL } { }
- {
- \PitonOptions{background-color=white,prompt-background-color = gray!10}
- \PyLTVerbatimEnv
- \begin{pythonrepl}
- }
- {
- \directlua
- {
- tex.print("\\begin{Piton}")
- tex.print(pyluatex.get_last_output())
- tex.print("\\end{Piton}")
- tex.print("")
- }
- \end{pythonrepl}
- }
-
-
-\begin{PitonREPL}
- def valeur_absolue(x):
- "Renvoie la valeur absolue de x"
- if x > 0:
- return x
- else:
- return -x
-
- valeur_absolue(-3)
- valeur_absolue(0)
- valeur_absolue(5)
-\end{PitonREPL}
-
-
-\bigskip
-En fait, il est possible de ne pas faire afficher les prompts eux-mêmes (c'est-à-dire les chaînes de caractères
-|>>>| et |...|). En effet, \pkg{piton} propose un style pour ces éléments, qui est appelé |Prompt|. Par défaut, la
-valeur de ce style est vide, ce qui fait qu'aucune action n'est exécutée sur ces éléments qui sont donc affichés
-tels quels. En fournissant comme valeur une fonction qui se contente de gober son argument, on peut demander à ce
-qu'ils ne soient pas affichés.
-
-\bigskip
-\begin{savenotes}
-\begin{Verbatim}
-\NewDocumentCommand{\Gobe}{m}{}#~color#black@~footnote#On a défini ici une fonction ~texttt#~string~Gobe@ mais, en fait, elle existe déjà en L3 sous le nom ~texttt#~string~use~_none:n@.@@
-\SetPitonStyle{ ~emphase#Prompt = \Gobe@ }
-\end{Verbatim}
-\end{savenotes}
-
-
-
-
-\NewDocumentCommand{\Gobe}{m}{}
-\ExplSyntaxOn
-\SetPitonStyle{ Prompt = \use_none:n }
-\ExplSyntaxOff
-
-\bigskip
-L'exemple précédent donne alors :
-
-\medskip
-\begin{Verbatim}
-~emphase#\begin{PitonREPL}@
- def valeur_absolue(x):
- "Renvoie la valeur absolue de x"
- if x > 0:
- return x
- else:
- return -x
-
- valeur_absolue(-3)
- valeur_absolue(0)
- valeur_absolue(5)
-~emphase#\end{PitonREPL}@
-\end{Verbatim}
-
-
-
-\begin{PitonREPL}
- def valeur_absolue(x):
- "Renvoie la valeur absolue de x"
- if x > 0:
- return x
- else:
- return -x
-
- valeur_absolue(-3)
- valeur_absolue(0)
- valeur_absolue(5)
-\end{PitonREPL}
-
-
-
-\section*{Autre documentation}
-
-Le document |piton.pdf| (fourni avec l'extension \pkg{piton}) contient une traduction anglaise de la
-documentation ici présente, ainsi que le code source commenté et un historique des versions.
-
-
-\tableofcontents
-
+% -*- coding: utf-8 ; -*-
+\documentclass[dvipsnames]{article}
+
+\usepackage{fontspec}
+
+\usepackage[french]{babel}
+\frenchsetup{og = « , fg = »}
+
+\usepackage[footnotehyper,escape-inside=$$,math-comments]{piton}
+
+\usepackage[executable=python.exe]{pyluatex}
+
+\usepackage{xcolor}
+
+\usepackage{geometry}
+\geometry{left=2.8cm,right=2.8cm,top=2.5cm,bottom=2.5cm,papersize={21cm,29.7cm}}
+
+\usepackage{enumitem}
+\usepackage{verbatim}
+\usepackage{amsmath}
+\usepackage{tabularx}
+\usepackage{booktabs}
+\usepackage{tcolorbox}
+\usepackage{luacolor,lua-ul}
+
+\usepackage{caption}
+
+% We use \MakeShortVerb of shortvrb and not \DefineShortVerb of fancyvrb
+% because we don't want the contents of short verbatim colored in gray
+\usepackage{shortvrb}
+\MakeShortVerb{\|}
+
+\usepackage{varwidth}
+
+\skip\footins = 2\bigskipamount
+
+\usepackage{fancyvrb}
+\fvset{commandchars=\~\#\@,formatcom=\color{gray}}
+\def\emphase{\bgroup\color{RoyalPurple}\let\next=}
+
+
+\usepackage{titlesec}
+\titlespacing*{\section}{0pt}{6.5ex plus 1ex minus .2ex}{4.3ex plus .2ex}
+\titlespacing*{\subsection}{0pt}{4.5ex plus 1ex minus .2ex}{2ex plus .2ex}
+
+\def\interitem{\vspace{7mm plus 2 mm minus 3mm}}
+
+
+\usepackage[hyperfootnotes = false]{hyperref}
+
+\hypersetup
+ {
+ pdfinfo =
+ {
+ Title = L’extension piton ,
+ Subject = Une extension LaTeX ,
+ Author = F. Pantigny
+ }
+ }
+
+
+
+
+\NewDocumentCommand {\pkg} {m} {\textsf{#1}}
+\NewDocumentCommand {\cls} {m} {\textsf{#1}}
+
+\setlength{\parindent}{0pt}
+
+
+\begin{document}
+
+\PitonOptions{splittable = 4}
+
+\VerbatimFootnotes
+
+
+\title{L'extension LaTeX \pkg{piton}\thanks{Ce document correspond à la
+version~\myfileversion\space de \pkg{piton}, à la date du~\myfiledate.}}
+\author{F. Pantigny \\ \texttt{fpantigny@wanadoo.fr}}
+
+\maketitle
+
+\begin{abstract}
+L'extension \pkg{piton} propose des outils pour composer du code Python avec une coloration syntaxique
+en utilisant la bibliothèque Lua LPEG. L'extension \pkg{piton} nécessite l'emploi de LuaLaTeX.
+\end{abstract}
+
+
+
+\section{Présentation}
+
+L'extension \pkg{piton} utilise la librairie Lua nommée LPEG\footnote{LPEG est une librairie de capture de motifs
+ (\emph{pattern-matching} en anglais) pour Lua, écrite en C, fondée sur les PEG (\emph{parsing expression
+ grammars}): \url{http://www.inf.puc-rio.br/~roberto/lpeg/}} pour «parser» le code Python et le composer avec un
+coloriage syntaxique. Comme elle utilise du code Lua, elle fonctionne uniquement avec |lualatex| (et ne va pas
+fonctionner avec les autres moteurs de compilation LaTeX, que ce soit |latex|, |pdflatex| ou |xelatex|). Elle
+n'utilise aucun programme extérieur et la compilation ne requiert donc pas |--shell-escape|. La compilation est
+très rapide puisque tout le travail du parseur est fait par la librairie LPEG, écrite en C.
+
+\bigskip
+Voici un exemple de code Python composé avec l'environnement |{Piton}| proposé par \pkg{piton}.
+
+
+\bigskip
+\begin{Piton}
+from math import pi
+
+def arctan(x,n=10):
+ """Calcule la valeur mathématique de arctan(x)
+
+ n est le nombre de termes de la somme
+ """
+ if x < 0:
+ return -arctan(-x) # appel récursif
+ elif x > 1:
+ return pi/2 - arctan(1/x)
+ #> (on a utilisé le fait que $\arctan(x)+\arctan(1/x)=\pi/2$ pour $x>0$)\footnote{Cet échappement vers LaTeX a été obtenu en débutant par \ttfamily\#>.}
+ else:
+ s = 0
+ for k in range(n):
+ s += (-1)**k/(2*k+1)*x**(2*k+1)
+ return s
+\end{Piton}
+
+
+\bigskip
+
+L'extension LaTeX \pkg{piton} est entièrement contenue dans le fichier |piton.sty|. Ce
+fichier peut être placé dans le répertoire courant ou dans une arborescence |texmf|. Le mieux reste néanmoins
+d'installer \pkg{piton} avec une distribution TeX comme MiKTeX, TeX~Live ou MacTeX.
+
+
+\section{Utilisation de l'extension}
+
+\subsection{Chargement de l'extension}
+
+L'extension \pkg{piton} se charge simplement avec la commande |\usepackage| : |\usepackage{piton}|.
+
+On a cependant deux remarques à formuler :
+\begin{itemize}
+\item l'extension \pkg{piton} utilise l'extension \pkg{xcolor} (mais \pkg{piton} ne charge pas \pkg{xcolor} : si
+\pkg{xcolor} n'est pas chargée avant le |\begin{document}|, une erreur fatale sera levée) ;
+
+\item l'extension \pkg{piton} n'est utilisable qu'avec LuaLaTeX : si un autre moteur de compilation (comme |latex|,
+|pdflatex| ou |xelatex|) est utilisé, une erreur fatale sera levée.
+\end{itemize}
+
+\subsection{Les commandes et environnements à la disposition de l'utilisateur}
+
+L'extension \pkg{piton} fournit plusieurs outils pour composer du code Python: les commandes |\piton|,
+l'environnement |{Piton}| et la commande |\PitonInputFile|.
+
+\begin{itemize} \setlength{\fboxsep}{1pt}
+\item La commande \colorbox{gray!20}{\ttfamily \textbackslash piton} doit être utilisée pour composer de petits éléments de code à l'intérieur d'un
+paragraphe. Par exemple :
+
+{\color{gray}\verb|\piton{def carré(x): return x*x}|}\qquad
+\piton{def carré(x): return x*x}
+
+La syntaxe et les particularités de la commande sont détaillées ci-après.
+
+
+\item L'environnement \colorbox{gray!20}{\ttfamily \{Piton\}} doit être utilisé pour composer des codes de
+plusieurs lignes. Comme cet environnement prend son argument selon un mode verbatim, il ne peut pas être utilisé
+dans l'argument d'une commande LaTeX. Pour les besoins de personnalisation, il est possible de définir de nouveaux
+environnements similaires à |{Piton}| en utilisant la commande |\NewPitonEnvironment| : cf. partie
+\ref{NewPitonEnvironment} p.~\pageref{NewPitonEnvironment}.
+
+\item La commande \colorbox{gray!20}{\ttfamily \textbackslash PitonInputFile} doit être utilisée pour insérer et
+composer un fichier extérieur.
+
+Cette commande prend en argument optionnel entre crochets deux clés |first-line| et |last-line| qui permettent de
+n'insérer que la partie du fichier comprise entre les lignes correspondantes.
+\end{itemize}
+
+
+\subsection{La syntaxe de la commande \textbackslash piton}
+
+
+La commande |\piton| possède en fait une syntaxe double. Elle est peut être utilisée comme une commande standard de
+LaTeX prenant son argument entre accolades (|\piton{...}|), ou bien selon la syntaxe de la commande |\verb| où l'argument est
+délimité entre deux caractères identiques (par ex. : \verb!\piton|...|!). On détaille maintenant ces deux syntaxes.
+
+\bigskip
+\begin{itemize}
+\item {\color{blue} \textsf{Syntaxe} \verb|\piton{...}|}\par\nobreak
+
+Quant son argument est donné entre accolades, la commande |\piton| ne prend pas son argument en mode verbatim. Les
+points suivants doivent être remarqués :
+
+\begin{itemize}
+\item plusieurs espaces successives sont remplacées par une unique espace,
+
+{\color{cyan} mais la commande |\|␣ est fournie pour forcer l'insertion d'une espace} ;
+
+\item il n'est pas possible d'utiliser le caractère |%| à l'intérieur,
+
+{\color{cyan} mais la commande |\%| est fournie pour insérer un |%|} ;
+
+\item les accolades doivent apparaître par paires correctement imbriquées,
+
+{\color{cyan} mais les commandes |\{| et |\}| sont aussi fournies pour insérer des accolades individuelles} ;
+
+\item les commandes LaTeX\footnote{Cela s'applique aux commandes commençant par une contre-oblique |\| mais également aux caractères actifs.} sont
+complètement développées sans être exécutées
+
+{\color{cyan} et on peut donc utiliser |\\| pour insérer une contre-oblique}.
+\end{itemize}
+
+Les autres caractères (y compris |#|, |^|, |_|, |&|, |$| % $
+et |@|) doivent être insérés sans contre-oblique.
+
+\bigskip
+\begin{tabular}{>{\color{gray}}w{l}{75mm}@{\hspace*{1cm}}l}
+\omit Exemples : \hfil \\
+\noalign{\vskip1mm}
+\verb|\piton{ma_chaîne = '\\n'}| &
+\piton{ma_chaîne = '\\n' } \\
+\verb|\piton{def pair(n): return n\%2==0}| &
+\piton{def pair(n): return n\%2==0 } \\
+\verb|\piton{c="#" # une affectation }| &
+\piton{c="#" # une affectation } \\
+\verb|\piton{c="#" \ \ \ # une affectation }| &
+\piton{c="#" \ \ \ # une affectation } \\
+\verb|\piton{my_dict = {'a': 3, 'b': 4}}| &
+\piton{my_dict = {'a': 3, 'b': 4}}
+\end{tabular}
+
+\bigskip
+La commande |\piton| avec son argument entre accolades peut être utilisée dans les arguments des autres commandes LaTeX.\footnote{La commande
+ |\piton| peut par exemple être
+ utilisée dans une note de bas de page. Exemple : \piton{s = 'Une chaîne'}.}
+
+\bigskip
+\item {\color{blue} \textsf{Syntaxe} \verb!\piton|...|!}\par\nobreak
+
+Quand la commande |\piton| prend son argument entre deux caractères identiques, cet argument est pris \emph{en mode
+ verbatim}. De ce fait, avec cette syntaxe, la commande |\piton| ne peut \emph{pas} être utilisée dans l'argument d'une
+autre fonction.
+
+\medskip
+\begin{tabular}{>{\color{gray}}w{l}{75mm}@{\hspace*{1cm}}l}
+\omit Exemples : \hfil \\
+\noalign{\vskip1mm}
+\verb!\piton|ma_chaîne = '\n'|! &
+\piton|ma_chaîne = '\n'| \\
+\verb|\piton!def pair(n): return n%2==0!| &
+\piton!def pair(n): return n%2==0! \\
+\verb|\piton+c="#" # une affectation +| &
+\piton+c="#" # une affectation + \\
+\verb|\piton?my_dict = {'a': 3, 'b': 4}?| &
+\piton!my_dict = {'a': 3, 'b': 4}!
+\end{tabular}
+
+\end{itemize}
+
+
+
+\section{Personnalisation}
+
+\subsection{La commande \textbackslash PitonOptions}
+
+\NewDocumentCommand{\Definition}{m}
+ {{\setlength{\fboxsep}{1pt}\colorbox{gray!20}{\ttfamily \vphantom{gl}#1}}}
+
+
+La commande |\PitonOptions| prend en argument une liste de couples \textsl{clé=valeur}. La portée des réglages
+effectués par cette commande est le groupe TeX courant.\footnote{On rappelle que tout environnement LaTeX est, en particulier, un groupe.}
+
+\begin{itemize}
+\item La clé \Definition{gobble} prend comme valeur un entier positif $n$ : les $n$ premiers caractères de chaque
+ligne sont alors retirés (avant formatage du code) dans les environnements |{Piton}|. Ces $n$ caractères ne sont
+pas nécessairement des espaces.
+
+\item Quand la clé \Definition{auto-gobble} est activée, l'extension \pkg{piton} détermine la valeur minimale $n$
+du nombre d'espaces successifs débutant chaque ligne (non vide) de l'environnement |{Piton}| et applique |gobble|
+avec cette valeur de~$n$.
+
+\item Quand la clé \Definition{env-gobble} est activée, \pkg{piton} analyse la dernière ligne de l'environnement,
+c'est-à-dire celle qui contient le |\end{Piton}| et détermine si cette ligne ne comporte que des espaces suivis par
+|\end{Piton}|. Si c'est le cas, \pkg{piton} calcule le nombre $n$ de ces espaces et applique |gobble| avec cette
+valeur de~$n$. Le nom de cette clé vient de \emph{environment gobble}: le nombre d'espaces à retirer ne dépend que
+de la position des délimiteurs |\begin{Piton}| et |\end{Piton}| de l'environnement.
+
+\item Avec la clé \Definition{line-numbers}, les lignes \emph{non vides} (et toutes les lignes des
+\emph{docstrings}, y compris celles qui sont vides) sont numérotées dans les environnements \verb|{Piton}| et dans
+les listings produits par la commande |\PitonInputFile|.
+
+\item Avec la clé \Definition{all-line-numbers}, \emph{toutes} les lignes sont numérotées, y compris les lignes vides.
+
+\item \colorbox{yellow!50}{\textbf{Nouveau 1.5}}\par\nobreak
+
+La clé \Definition{numbers-sep} est la distance horizontale entre les numéros de lignes (insérés par |line-numbers|
+ou |all-line-numbers|) et les lignes du code informatique. La valeur initiale est 0.7~em.
+
+\item La clé \Definition{left-margin} fixe une marge sur la gauche. Cette clé peut être utile, en particulier, en
+conjonction avec l'une des clés |line-numbers| et |all-line-numbers| si on ne souhaite pas que les numéros de ligne
+soient dans une position en débordement sur la gauche.
+
+Il est possible de donner à la clé |left-margin| la valeur spéciale~|auto|. Avec cette valeur, une marge est
+insérée automatiquement pour les numéros de ligne quand l'une des clés |line-numbers| ou |all-line-numbers| est
+utilisée. Voir un exemple à la partie \ref{example-numbering} p.~\pageref{example-numbering}.
+
+\item Avec la clé \Definition{resume}, le compteur de lignes n'est pas remis à zéro comme il l'est normalement au
+début d'un environnement |{Piton}| ou bien au début d'un listing produit par |\PitonInputFile|. Cela permet de
+poursuivre la numérotation d'un environnement à l'autre.
+
+\item La clé \Definition{background-color} fixe la couleur de fond des environnements |{Piton}| et des listings
+produits par |\PitonInputFile| (ce fond a une largeur égale à la valeur courante de |\linewidth|). La clé
+|background-color| accepte une couleur définie «à la volée», c'est-à-dire que l'on peut écrire par exemple
+|background-color = [cmyk]{0.1,0.05,0,0}|
+
+\smallskip
+\colorbox{yellow!50}{\textbf{Nouveau 1.4}}\enskip La clé |background-color| accepte aussi en argument une
+\emph{liste} de couleurs. Les lignes sont alors coloriées de manière cyclique avec ces couleurs.
+
+\emph{Exemple} : |\PitonOptions{background-color = {gray!5,white}}|
+
+\item Avec la clé \Definition{prompt-background-color}, \pkg{piton} ajoute un fond coloré aux lignes débutant par
+le prompt «|>>>|» (et sa continuation «|...|») caractéristique des consoles Python avec boucle \textsc{repl}
+(\emph{read-only-eval loop}). Pour un exemple d'utilisation de cette clé, voir la partie \ref{pythonrepl}
+p.~\pageref{pythonrepl}.
+
+\item En activant la clé \Definition{show-spaces-in-strings}, les espaces dans les chaînes courtes (c'est-à-dire
+celles délimitées par |'| ou |"|) sont matérialisés par le caractère ␣ (U+2423 : \textsc{open box}). Bien sûr, le
+caractère U+2423 doit être présent dans la fonte mono-chasse utilisée.\footnote{L'extension \pkg{piton} utilise
+ simplement la fonte mono-chasse courante. Pour la changer, le mieux est d'utiliser |\setmonofont| de
+ \pkg{fontspec}.}\par\nobreak
+%
+\begingroup
+\PitonOptions{show-spaces-in-strings}
+Exemple : \piton{my_string = 'Très bonne réponse'}
+\endgroup
+
+\smallskip
+Avec la clé \Definition{show-spaces}, tous les espaces sont matérialisés (et aucune coupure de ligne ne peut plus
+intervenir sur ces espaces matérialisés, même si la clé |break-lines|\footnote{cf. \ref{line-breaks} p.~\pageref{line-breaks}.} est active).
+\end{itemize}
+
+\bigskip
+
+\begingroup
+\fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
+\begin{Verbatim}
+~emphase&\PitonOptions{line-numbers,auto-gobble,background-color = gray!15}@
+\begin{Piton}
+ from math import pi
+
+ def arctan(x,n=10):
+ """Calcule la valeur mathématique de arctan(x)
+
+ n est le nombre de termes de la somme
+ """
+ if x < 0:
+ return -arctan(-x) # appel récursif
+ elif x > 1:
+ return pi/2 - arctan(1/x)
+ #> (on a utilisé le fait que $\arctan(x)+\arctan(1/x)=\pi/2$ pour $x>0$)
+ else:
+ s = 0
+ for k in range(n):
+ s += (-1)**k/(2*k+1)*x**(2*k+1)
+ return s
+\end{Piton}
+\end{Verbatim}
+\endgroup
+
+
+\begingroup
+\PitonOptions{line-numbers,auto-gobble,background-color = gray!15}
+\begin{Piton}
+ from math import pi
+
+ def arctan(x,n=10):
+ """Compute the value of arctan(x)
+
+ n is the number of terms in the sum
+ """
+ if x < 0:
+ return -arctan(-x) # appel récursif
+ elif x > 1:
+ return pi/2 - arctan(1/x)
+ #> (on a utilisé le fait que $\arctan(x)+\arctan(1/x)=\pi/2$ pour $x>0$)
+ else:
+ s = 0
+ for k in range(n):
+ s += (-1)**k/(2*k+1)*x**(2*k+1)
+ return s
+\end{Piton}
+\endgroup
+
+
+
+\bigskip
+La commande |\PitonOptions| propose d'autres clés qui seront décrites plus loin (voir en particulier la coupure des
+pages et des lignes p.~\pageref{breakable}).
+
+
+\subsection{Les styles}
+
+\label{styles}
+
+L'extension \pkg{piton} fournit la commande |\SetPitonStyle| pour personnaliser les différents styles utilisés pour
+formater les éléments syntaxiques des listings Python. Ces personnalisations ont une portée qui correspond au
+groupe TeX courant.\footnote{On rappelle que tout environnement LaTeX est, en particulier, un groupe.}
+
+\bigskip
+La commande |\SetPitonStyle| prend en argument une liste de couples \textsl{clé=valeur}. Les clés sont les noms des
+styles et les valeurs sont les instructions LaTeX de formatage correspondantes.
+
+\bigskip
+Ces instructions LaTeX doivent être des instructions de formatage du type de |\bfseries|, |\slshape|,
+|\color{...}|, etc. (les commandes de ce type sont parfois qualifiées de \emph{semi-globales}). Il est aussi
+possible de mettre, \emph{à la fin de la liste d'instructions}, une commande LaTeX prenant exactement un argument.
+
+\bigskip
+Voici un exemple qui change le style utilisé pour le nom d'une fonction Python, au moment de sa définition
+(c'est-à-dire après le mot-clé |def|). Elle utilise la commande |\highLight| de \pkg{lua-ul} (qui nécessite
+lui-même le chargement de \pkg{luacolor}).
+
+\begin{Verbatim}
+\SetPitonStyle
+ { Name.Function = \bfseries \hightLight[red!50] }
+\end{Verbatim}
+
+Ici, |\highLight[red!50]| doit être considéré comme le nom d'une fonction LaTeX qui prend exactement un argument,
+puisque, habituellement, elle est utilisée avec |\highLight[red!50]{|\texttt{\slshape text}|}|.
+
+\medskip
+\begingroup
+\SetPitonStyle
+ { Name.Function = \bfseries \highLight[red!50] }
+Avec ce réglage, on obtient : \piton{def cube(x) : return x * x * x }
+\endgroup
+
+
+\bigskip
+Les différents styles sont décrits dans la table \ref{Semantic}. Les réglages initiaux effectués par \pkg{piton}
+dans |piton.sty| sont inspirés par le style \pkg{manni} de Pygments.\footnote{Voir
+ \url{https://pygments.org/styles/}. À remarquer que, par défaut, Pygments propose pour le style \pkg{manni} un
+ fond coloré dont la couleur est la couleur HTML |#F0F3F3|. Il est possible d'avoir la même couleur dans |{Piton}|
+ avec l'instruction : |\PitonOptions{background-color = [HTML]{F0F3F3}}|}
+
+\begin{table}[htb]
+\centering
+\caption{Les styles proposés par \pkg{piton}}
+\label{Semantic}
+\begin{tabularx}{0.9\textwidth}{@{}>{\ttfamily}l>{\raggedright\arraybackslash}X@{}}
+\toprule
+\normalfont Style & Usage \\
+\midrule
+Number & les nombres \\
+String.Short & les chaînes de caractères courtes (entre \texttt{'} ou \texttt{"}) \\
+String.Long & les chaînes de caractères longues (entre \texttt{'''} ou \texttt{"""}) sauf les chaînes de
+ documentation \\
+String & cette clé fixe à la fois |String.Short| et |String.Long| \\
+String.Doc & les chaînes de documentation (seulement entre |"""| suivant PEP~257) \\
+String.Interpol & les éléments syntaxiques des champs des f-strings (c'est-à-dire les caractères \texttt{\{}et \texttt{\}}) \\
+Operator & les opérateurs suivants : \texttt{!= == << >> - \~{} + / * \% = < > \& .} \verb+|+ \verb|@| \\
+Operator.Word & les opérateurs suivants : |in|, |is|, |and|, |or| et |not| \\
+Name.Builtin & la plupart des fonctions prédéfinies par Python \\
+Name.Function & le nom des fonctions définies par l'utilisateur \emph{au moment de leur définition}, c'est-à-dire
+ après le mot-clé \verb|def| \\
+Name.Decorator & les décorateurs (instructions débutant par \verb|@|) \\
+Name.Namespace & le nom des modules (= bibliothèques extérieures) \\
+Name.Class & le nom des classes au moment de leur définition, c'est-à-dire après le mot-clé \verb|class| \\
+Exception & le nom des exceptions prédéfinies (ex.: SyntaxError) \\
+Comment & les commentaires commençant par \texttt{\#} \\
+Comment.LaTeX & les commentaires commençant par \texttt{\#>} qui sont composés en LaTeX par \pkg{piton} (et
+ appelés simplement «commentaires LaTeX» dans ce document) \\
+Keyword.Constant & |True|, |False| et |None| \\
+Keyword & les mots-clés suivants :
+ \ttfamily assert, break, case, continue, del,
+ elif, else, except, exec, finally, for, from,
+ global, if, import, lambda, non local,
+ pass, raise, return, try, while,
+ with, yield, yield from.\\
+\bottomrule
+\end{tabularx}
+\end{table}
+
+\bigskip
+\colorbox{yellow!50}{\textbf{Nouveau 1.4}}\enskip La commande |\PitonStyle| prend en argument le nom d'un style
+et permet de récupérer la valeur (en tant que liste d'instructions LaTeX) de ce style.
+
+\smallskip
+Par exemple, on peut écrire, dans le texte courant, |{\PitonStyle{Keyword}{function}}| et on aura
+le mot {\PitonStyle{Keyword}{function}} formaté comme un mot-clé.
+
+\smallskip
+La syntaxe |{\PitonStyle{|\textsl{\texttt{style}}|}{...}}| est nécessaire pour pouvoir tenir compte à la fois des commandes
+semi-globales et des commandes à argument présentes dans la valeur courante du style \texttt{\textsl{style}}.
+
+
+\subsection{Définition de nouveaux environnements}
+
+\label{NewPitonEnvironment}
+
+Comme l'environnement |{Piton}| a besoin d'absorber son contenu d'une manière spéciale (à peu près comme du texte
+verbatim), il n'est pas possible de définir de nouveaux environnements directement au-dessus de l'environnement
+|{Piton}| avec les commandes classiques |\newenvironment| et |\NewDocumentEnvironment|.
+
+C'est pourquoi \pkg{piton} propose une commande |\NewPitonEnvironment|. Cette commande a la même syntaxe que la
+commande classique |\NewDocumentEnvironment|.
+
+\bigskip
+Par exemple, avec l'instruction suivante, un nouvel environnement |{Python}| sera défini avec le même comportement
+que l'environnement |{Piton}|:
+
+{\color{gray}\verb|\NewPitonEnvironment{Python}{}{}{}|}
+
+
+\bigskip
+Si on souhaite un environnement |{Python}| qui prenne en argument optionnel entre crochets les clés de
+|\PitonOptions|, on peut écrire :
+
+{\color{gray}\verb|\NewPitonEnvironment{Python}{O{}}{\PitonOptions{#1}}{}|}
+
+\bigskip
+Si on souhaite un environnement |{Python}| qui compose le code inclus dans une boîte de \pkg{tcolorbox}, on peut
+écrire (à condition, bien entendu, d'avoir chargé l'extension \pkg{tcolorbox}):
+
+\begin{Verbatim}
+\NewPitonEnvironment{Python}{}
+ {\begin{tcolorbox}}
+ {\end{tcolorbox}}
+\end{Verbatim}
+
+\bigskip
+Avec ce nouvel environnement |{Python}|, on peut écrire :
+
+\begin{Verbatim}
+~emphase#\begin{Python}@
+def carré(x):
+ """Calcule le carré d'un nombre"""
+ return x*x
+~emphase#\end{Python}@
+\end{Verbatim}
+
+\NewPitonEnvironment{Python}{}
+ {\begin{tcolorbox}}
+ {\end{tcolorbox}}
+
+\begin{Python}
+def carré(x):
+ """Calcule le carré d'un nombre"""
+ return x*x
+\end{Python}
+
+
+\section{Fonctionnalités avancées}
+
+
+\subsection{Mise en évidence d'identificateurs}
+
+\colorbox{yellow!50}{\textbf{Nouveau 1.4}}
+
+On peut demander le changement de formatage de certains identificateurs avec la clé |identifiers| de
+|\PitonOptions|.
+
+\smallskip
+Cette clé prend en argument une valeur au format suivant :
+
+\quad |{ names = |\textsl{\ttfamily noms}|, style = |\textsl{\ttfamily instructions}| }|
+
+\begin{itemize}
+\item \textsl{\ttfamily noms} est une liste de noms d'identificateurs (séparés par des virgules) ;
+
+\item \textsl{\ttfamily instructions} est une liste d'instructions LaTeX de formatage du même type que pour les
+styles précédemment définis (cf.~\ref{styles} p.~\pageref{styles}).
+\end{itemize}
+
+\emph{Attention} : Seuls les identifiants peuvent voir leur formatage affecté. Les mots-clés et les noms de
+fonctions prédéfinies ne seront pas affectés, même s'ils figurent dans la liste \textsl{\ttfamily noms}.
+
+\begin{Verbatim}
+\PitonOptions
+ {
+ ~emphase#identifiers@ =
+ {
+ ~emphase#names@ = { l1 , l2 } ,
+ ~emphase#style@ = \color{red}
+ }
+ }
+
+\begin{Piton}
+def tri(l):
+ """Tri par segmentation"""
+ if len(l) <= 1:
+ return l
+ else:
+ a = l[0]
+ l1 = [ x for x in l[1:] if x < a ]
+ l2 = [ x for x in l[1:] if x >= a ]
+ return tri(l1) + [a] + tri(l2)
+\end{Piton}
+\end{Verbatim}
+
+
+\bigskip
+
+\begingroup
+
+\PitonOptions
+ {
+ identifiers =
+ {
+ names = { l1 , l2 } ,
+ style = \color{red}
+ }
+ }
+
+\begin{Piton}
+def tri(l):
+ """Tri par segmentation"""
+ if len(l) <= 1:
+ return l
+ else:
+ a = l[0]
+ l1 = [ x for x in l[1:] if x < a ]
+ l2 = [ x for x in l[1:] if x >= a ]
+ return tri(l1) + [a] + tri(l2)
+\end{Piton}
+
+\endgroup
+
+\bigskip
+En utilisant la clé |identifiers|, on peut ajouter de nouvelles fonctions prédéfinies (ou de nouveaux mots-clés,
+etc.) qui seront détectées par \pkg{piton}.
+
+
+\begin{Verbatim}
+\PitonOptions
+ {
+ ~emphase#identifiers@ =
+ {
+ names = { cos, sin, tan, floor, ceil, trunc, pow, exp, ln, factorial } ,
+ style = \PitonStyle{Name.Builtin}
+ }
+ }
+
+\begin{Piton}
+from math import *
+cos(pi/2)
+factorial(5)
+ceil(-2.3)
+floor(5.4)
+\end{Piton}
+\end{Verbatim}
+
+\begingroup
+
+\PitonOptions
+ {
+ identifiers =
+ {
+ names = { cos, sin, tan, floor, ceil, trunc, pow, exp, ln, factorial } ,
+ style = \PitonStyle{Name.Builtin}
+ }
+ }
+
+\begin{Piton}
+from math import *
+cos(pi/2)
+factorial(5)
+ceil(-2.3)
+floor(5.4)
+\end{Piton}
+
+
+\endgroup
+
+\subsection{Les échappements vers LaTeX}
+
+L'extension \pkg{piton} propose plusieurs mécanismes d'échappement vers LaTeX :
+\begin{itemize}
+\item Il est possible d'avoir des commentaires entièrement composés en LaTeX.
+\item Il est possible d'avoir, dans les commentaires Python, les éléments entre \texttt{\$} composés en mode
+mathématique de LaTeX.
+\item Il est possible d'insérer du code LaTeX à n'importe quel endroit d'un listing Python.
+\end{itemize}
+Ces mécanismes vont être détaillés dans les sous-parties de cette partie.
+
+\smallskip
+À remarquer également que, dans le cas où \pkg{piton} est utilisée dans la classe \cls{beamer}, \pkg{piton} détecte
+la plupart des commandes et environnements de Beamer : voir la sous-section \ref{beamer}, p.~\pageref{beamer}.
+
+
+\subsubsection{Les «commentaires LaTeX»}
+
+Dans ce document, on appelle «commentaire LaTeX» des commentaires qui débutent par |#>|. Tout ce qui suit ces deux
+caractères, et jusqu'à la fin de la ligne, sera composé comme du code LaTeX standard.
+
+Il y a deux outils pour personnaliser ces commentaires.
+
+\begin{itemize}
+\item Il est possible de changer le marquage syntaxique utilisé (qui vaut initialement~|#>|). Pour ce faire, il
+existe une clé |comment-latex|, disponible seulement au chargement de \pkg{piton} (c'est-à-dire au moment du
+|\usepackage|), qui permet de choisir les caractères qui (précédés par~|#|) serviront de marqueur syntaxique.
+
+Par exemple, avec le chargement suivant :
+
+\quad \verb|\usepackage[comment-latex = LaTeX]{piton}|
+
+les commentaires LaTeX commenceront par~|#LaTeX|.
+
+Si on donne la valeur nulle à la clé |comment-latex|, tous les commentaires Python (débutant par~|#|) seront en
+fait des «commentaires LaTeX».
+
+\smallskip
+\item Il est possible de changer le formatage du commentaire LaTeX lui-même en changeant le style \pkg{piton}
+|Comment.LaTeX|.
+
+Par exemple, avec |\SetPitonStyle{Comment.LaTeX = \normalfont\color{blue}}|, les commentaires LaTeX seront composés
+en bleu.
+
+Si on souhaite qu'un croisillon (|#|) soit affiché en début de commentaire dans le \textsc{pdf}, on peut régler
+|Comment.LaTeX| de la manière suivante :
+
+\begin{Verbatim}
+\SetPitonStyle{Comment.LaTeX = \color{gray}\~#\normalfont\space }
+\end{Verbatim}
+
+Pour d'autres exemples de personnalisation des commentaires LaTeX, voir la partie \ref{example-comments}
+p.~\pageref{example-comments}.
+\end{itemize}
+
+
+\bigskip
+Si l'utilisateur a demandé l'affichage des numéros de ligne (avec |line-numbers| ou |all-line-numbers|), il est
+possible de faire référence à ce numéro de ligne avec la commande |\label| placée dans un commentaire
+LaTeX.\footnote{Cette fonctionnalité est implémentée en redéfinissant, dans les environnements |{Piton}|, la
+ commande |\label|. Il peut donc y avoir des incompatibilités avec les extensions qui redéfinissent (globalement)
+ cette commande |\label| (comme \pkg{varioref}, \pkg{refcheck}, \pkg{showlabels}, etc.)}
+
+
+
+
+\subsubsection{La clé «math-comments»}
+
+Il est possible de demander que, dans les commentaires Python normaux, c'est-à-dire débutant par~|#| (et non par
+|#>|), les éléments placés entre symboles \texttt{\$} soient composés en mode mathématique de LaTeX (le reste du
+commentaire restant composé en verbatim).
+
+La clé |math-comments|, qui n'est disponible qu'au chargement de \pkg{piton} (c'est-à-dire au moment du
+|\usepackage|), active ce comportement.
+
+\bigskip
+Dans l'exemple suivant, on suppose que la clé |math-comments| a été utilisée au chargement de \pkg{piton}.
+
+\begin{Verbatim}
+\begin{Piton}
+def carré(x):
+ return x*x ~# renvoie $x^2$
+\end{Piton}
+\end{Verbatim}
+
+\begin{Piton}
+def carré(x):
+ return x*x # renvoie $x^2$
+\end{Piton}
+
+
+\subsubsection{Le mécanisme «espace-inside»}
+
+Il est aussi possible de surcharger les listings Python pour y insérer du code LaTeX à peu près n'importe où (mais
+entre deux lexèmes, bien entendu). Cette fonctionnalité n'est pas activée par défaut par \pkg{piton}. Pour
+l'utiliser, il faut spécifier les deux caractères marquant l'échappement (le premier le commençant et le deuxième
+le terminant) en utilisant la clé |escape-inside| au chargement de \pkg{piton} (c'est-à-dire au moment du
+|\usepackage|). Les deux caractères peuvent être identiques.
+
+
+\bigskip
+Dans l'exemple suivant, on suppose que l'extension \pkg{piton} a été chargée de la manière suivante :
+
+\begin{Verbatim}
+\usepackage[~emphase#escape-inside=$$@]{piton}
+\end{Verbatim}
+
+\medskip
+Dans le code suivant, qui est une programmation récursive de la factorielle, on décide de surligner en jaune
+l'instruction qui contient l'appel récursif. Cet exemple utilise la commande |\highLight| de \pkg{lua-ul} (cette
+extension requiert aussi l'extension \pkg{luacolor}).
+\begin{Verbatim}
+\begin{Piton}
+def fact(n):
+ if n==0:
+ return 1
+ else:
+ ~emphase#$\highLight{$@return n*fact(n-1)~emphase#$}$@
+\end{Piton}
+\end{Verbatim}
+
+\begin{Piton}
+def fact(n):
+ if n==0:
+ return 1
+ else:
+ $\highLight{$return n*fact(n-1)$}$
+\end{Piton}
+
+\bigskip
+En fait, dans le cas présent, il serait sans doute plus habile d'utiliser la commande |\@highLight| de
+\pkg{lua-ul}: cette commande bascule vers un fond jaune jusqu'à la fin du groupe TeX courant. Comme le nom de cette
+commande contient le caractère |@|, il convient de lui donner un synonyme sans caractère |@| pour pouvoir
+l'utiliser directement dans |{Piton}|.
+
+\begingroup
+\fvset{commandchars=\~\#\+,formatcom=\color{gray}}
+\begin{Verbatim}
+\makeatletter
+~emphase#\let\Jaune\@highLight+
+\makeatother
+\end{Verbatim}
+\endgroup
+
+\begin{Verbatim}
+\begin{Piton}
+def fact(n):
+ if n==0:
+ return 1
+ else:
+ ~emphase#$\Jaune$@return n*fact(n-1)
+\end{Piton}
+\end{Verbatim}
+
+\makeatletter
+\let\Jaune\@highLight
+\makeatother
+
+
+\begin{Piton}
+def fact(n):
+ if n==0:
+ return 1
+ else:
+ $\Jaune$return n*fact(n-1)
+\end{Piton}
+
+
+
+\bigskip
+\emph{Attention} : L'échappement vers LaTeX permis par les caractères de |escape-inside| n'est pas actif dans les
+chaînes de caractères ni dans les commentaires (pour avoir un commentaire entièrement en échappement vers LaTeX,
+c'est-à-dire ce qui est
+appelé dans ce document «commentaire LaTeX», il suffit de le faire débuter par |#>|).
+
+
+
+
+\subsection{Comportement dans la classe Beamer}
+
+\label{beamer}
+
+\emph{Première remarque}\par\nobreak
+Remarquons que, comme l'environnement |{Piton}| prend son argument selon un mode verbatim, il convient, ce qui
+n'est pas surprenant, de l'utiliser dans des environnements |{frame}| de Beamer protégés par la clé |fragile|.\footnote{On
+ rappelle que pour un environnement |{frame}| de Beamer qui utilise la clé |fragile|, l'instruction |\end{frame}|
+ doit être seule sur une ligne (à l'exception d'éventuels espaces en début de ligne).}
+
+
+\medskip
+Quand l'extension \pkg{piton} est utilisée dans la classe \cls{beamer}\footnote{L'extension \pkg{piton} détecte la
+ classe \cls{beamer} mais il est aussi possible, si le besoin s'en faisait sentir, d'activer ce comportement avec
+ la clé |beamer| au chargement de \pkg{piton} : |\usepackage[beamer]{piton}|}, le comportement de \pkg{piton} est
+légèrement modifié, comme décrit maintenant.
+
+\subsubsection{\{Piton\} et \textbackslash PitonInputFile sont ``overlay-aware''}
+
+Quand \pkg{piton} est utilisé avec Beamer, l'environnement |{Piton}| et la commande |\PitonInputFile| acceptent
+l'argument optionnel |<...>| de Beamer pour indiquer les «\emph{overlays}» concernés.
+
+On peut par exemple écrire :
+
+\begin{Verbatim}
+\begin{Piton}~emphase#<2-5>@
+...
+\end{Piton}
+\end{Verbatim}
+
+ou aussi
+
+\begin{Verbatim}
+\PitonInputFile~emphase#<2-5>@{mon_fichier.py}
+\end{Verbatim}
+
+
+\subsubsection{Commandes de Beamer reconnues dans \{Piton\} et \textbackslash PitonInputFile}
+
+Quand \pkg{piton} est utilisé dans la classe \cls{beamer}, les commandes suivantes de \cls{beamer} (classées selon
+leur nombre d'arguments obligatoires) sont directement reconnues dans les environnements |{Piton}| (ainsi que dans
+les listings composés par la commande |\PitonInputFile|, même si c'est sans doute moins utile).
+%
+\begin{itemize}
+\item aucun argument obligatoire : |\pause|\footnote{On remarquera que, bien sûr, on peut aussi utiliser |\pause|
+ dans un «commentaire LaTeX», c'est-à-dire en écrivant |#> \pause|. Ainsi, si le code Python est copié, il est
+ interprétable par Python.} ;
+\item un argument obligatoire : |\action|, |\alert|, |\invisible|, |\only|, |\uncover| et |\visible| ;
+\item deux arguments obligatoire : |\alt| ;
+\item trois arguments obligatoires : |\temporal|.
+\end{itemize}
+
+\medskip
+Les accolades dans les arguments obligatoires de ces commandes doivent être équilibrées (cependant, les accolades
+présentes dans des chaînes courtes\footnote{Les chaînes courtes de Python sont les chaînes (string) délimitées par
+ les caractères \texttt{'} ou \texttt{"} non triplés. En Python, les chaînes de caractères courtes ne peuvent pas
+ s'étendre sur plusieurs lignes de code.} de Python ne sont pas prises en compte).
+
+\medskip
+Concernant les fonctions |\alt| et |\temporal|, aucun retour à la ligne ne doit se trouver dans les arguments de ces fonctions.
+
+
+\medskip
+Voici un exemple complet de fichier :
+
+\begin{Verbatim}[formatcom = \small\color{gray}]
+\documentclass{beamer}
+\usepackage{piton}
+\begin{document}
+\begin{frame}[fragile]
+\begin{Piton}
+def string_of_list(l):
+ """Convertit une liste de nombres en chaîne"""
+~emphase# \only<2->{s = "{" + str(l[0])}@
+~emphase# \only<3->{for x in l[1:]: s = s + "," + str(x)}@
+~emphase# \only<4->{s = s + "}"}@
+ return s
+\end{Piton}
+\end{frame}
+\end{document}
+\end{Verbatim}
+
+Dans l'exemple précédent, les accolades des deux chaînes de caractères Python |"{"| et |"}"| sont correctement
+interprétées (sans aucun caractère d'échappement).
+
+
+
+\bigskip
+\subsubsection{Environnements de Beamer reconnus dans \{Piton\} et \textbackslash PitonInputFile}
+
+Quand \pkg{piton} est utilisé dans la classe \pkg{beamer}, les environnements suivants de Beamer sont directement
+reconnus dans les environnements |{Piton}| (ainsi que dans les listings composés par la commande |\PitonInputFile|
+même si c'est sans doute moins utile) : |{actionenv}|, |{alertenv}|, |{invisibleenv}|, |{onlyenv}|, |{uncoverenv}|
+et |{visibleenv}|.
+
+
+\medskip
+Il y a néanmoins une restriction : ces environnements doivent englober des \emph{lignes entières de code Python}.
+
+
+\medskip
+On peut par exemple écrire :
+
+\begin{Verbatim}[formatcom = \small\color{gray}]
+\documentclass{beamer}
+\usepackage{piton}
+\begin{document}
+\begin{frame}[fragile]
+\begin{Piton}
+def carré(x):
+ """Calcule le carré de l'argument"""
+ ~emphase#\begin{uncoverenv}<2>@
+ return x*x
+ ~emphase#\end{uncoverenv}@
+\end{Piton}
+\end{frame}
+\end{document}
+\end{Verbatim}
+
+
+
+\vspace{1cm}
+\textbf{Remarque à propos de la commande \textbackslash alert et de l'environnement \{alertenv\} de Beamer}\par\nobreak
+
+\smallskip
+Beamer propose un moyen aisé de changer la couleur utilisée par l'environnement |{alertenv}| (et par la commande
+|\alert| qui s'appuie dessus). Par exemple, on peut écrire:
+
+\begin{Verbatim}
+\setbeamercolor{~emphase#alerted text@}{fg=blue}
+\end{Verbatim}
+
+Néanmoins, dans le cas d'une utilisation à l'intérieur d'un environnement |{Piton}| un tel réglage n'est sans doute
+pas pertinent, puisque, justement, \pkg{piton} va (le plus souvent) changer la couleur des élements selon leur
+valeur lexicale. On préfèrera sans doute un environnement |{alertenv}| qui change la couleur de fond des
+éléments à mettre en évidence.
+
+\smallskip
+Voici un code qui effectuera ce travail en mettant un fond jaune. Ce code utilise la commande |\@highLight| de
+l'extension \pkg{lua-ul} (cette extension nécessite elle-même l'extension \pkg{luacolor}).
+
+\begingroup
+\fvset{commandchars=\~\#\+,formatcom=\color{gray}}
+\begin{Verbatim}
+\setbeamercolor{alerted text}{bg=yellow!50}
+\makeatletter
+\AddToHook{env/Piton/begin}
+ {\renewenvironment<>{alertenv}{\only~#1{~emphase#\@highLight+[alerted text.bg]}}{}}
+\makeatother
+\end{Verbatim}
+\endgroup
+
+Ce code redéfinit localement l'environnement |{alertenv}| à l'intérieur de l'environnement |{Piton}| (on rappelle
+que la commande |\alert| s'appuie sur cet environnement |{alertenv}|).
+
+
+
+\bigskip
+\subsection{Coupure des pages et des lignes}
+
+\label{breakable}
+
+\subsubsection{Coupure des pages}
+
+Par défaut les listings produits par l'environnement |{Piton}| et par la commande |\PitonInputFile| sont
+insécables.
+
+Néanmoins, la commande |\PitonOptions| propose la clé |splittable| pour autoriser de telles coupures.
+
+\begin{itemize}
+\item Si la clé |splittable| est utilisée sans valeur, les listings sont sécables n'importe où.
+
+\item Si la clé |splittable| est utilisée avec une valeur numérique $n$ (qui doit être un entier naturel non nul),
+alors les listings seront sécables mais aucune coupure ne pourra avoir lieu entre les $n$~premières lignes, ni
+entre les $n$~dernières. De ce fait, |splittable=1| est équivalent à |splittable|.
+\end{itemize}
+
+\medskip
+\emph{Remarque}\par\nobreak
+
+Même avec une couleur de fond (fixée avec |background-color|), les sauts de page sont possibles, à partir du moment
+où la clé |splittable| est utilisée.\footnote{Avec la clé |splittable|, un environnement |{Piton}| est sécable même dans un environnement de
+ \pkg{tcolorbox} (à partir du moment où la clé |breakable| de \pkg{tcolorbox} est utilisée). On précise cela parce
+ que, en revanche, un environnement de \pkg{tcolorbox} inclus dans un autre environnement de \pkg{tcolorbox} n'est
+ pas sécable, même quand les deux utilisent la clé |breakable|.}
+
+\subsubsection{Coupure des lignes}
+
+\label{line-breaks}
+
+Par défaut, les éléments produits par \pkg{piton} ne peuvent pas être coupés par une fin de ligne. Il existe
+néanmoins des clés pour autoriser de telles coupures (les points de coupure possibles sont les espaces, y compris
+les espaces dans les chaînes Python).
+\begin{itemize}
+\item Avec la clé |break-lines-in-piton|, les coupures de ligne sont autorisées dans la commande |\piton{...}|
+(mais pas dans la commande \verb+\piton|...|+, c'est-à-dire avec la syntaxe verbatim).
+
+\item Avec la clé |break-lines-in-Piton|, les coupures de ligne sont autorisées dans l'environnement |{Piton}|
+(d'où la lettre |P| capitale dans le nom) et dans les listings produits par |\PitonInputFile|.
+
+\item La clé |break-lines| est la conjonction des deux clés précédentes.
+\end{itemize}
+
+\medskip
+L'extension \pkg{piton} fournit aussi plusieurs clés pour contrôler l'apparence des coupures de ligne autorisées par |break-lines-in-Piton|.
+
+\begin{itemize}
+\item Avec la clé |indent-broken-lines|, l'indentation de la ligne coupée est respectée à chaque retour à la ligne.
+
+\item La clé |end-of-broken-line| correspond au symbole placé à la fin d'une ligne coupée. Sa valeur initiale est :
+|\hspace*{0.5em}\textbackslash|.
+
+\item La clé |continuation-symbol| correspond au symbole placé à chaque retour de ligne dans la marge gauche. Sa
+valeur initiale est : |+\;|.
+
+\item La clé |continuation-symbol-on-indentation| correspond au symbole placé à chaque retour de ligne au niveau de
+l'indentation (uniquement dans le cas où la clé |indent-broken-lines| est active). Sa valeur initiale est :
+|$\hookrightarrow\;$|.
+\end{itemize}
+
+\bigskip
+Le code suivant a été composé dans une |{minipage}| standard de LaTeX de largeur 12~cm avec le réglage suivant :
+
+\begin{Verbatim}
+\PitonOptions{break-lines,indent-broken-lines,background-color=gray!15}
+\end{Verbatim}
+
+\begin{center}
+\PitonOptions{break-lines,indent-broken-lines,background-color=gray!15}
+\begin{minipage}{12cm}
+\begin{Piton}
+def dict_of_liste(liste):
+ """Convertit une liste de subrs et de descriptions de glyphes en dictionnaire"""
+ dict = {}
+ for liste_lettre in liste:
+ if (liste_lettre[0][0:3] == 'dup'): # si c'est un subr
+ nom = liste_lettre[0][4:-3]
+ print("On traite le subr de numéro " + nom)
+ else:
+ nom = liste_lettre[0][1:-3] # si c'est un glyphe
+ print("On traite le glyphe du caractère " + nom)
+ dict[nom] = [traite_ligne_Postscript(k) for k in liste_lettre[1:-1]]
+ return dict
+\end{Piton}
+\end{minipage}
+\end{center}
+
+
+
+\bigskip
+\subsection{Notes de pied de page dans les environnements de piton}
+
+\label{footnote}
+
+Si vous voulez mettre des notes de pied de page dans un environnement de \pkg{piton} (ou bien dans un listing
+produit par |\PitonInputFile|, bien que cela paraisse moins pertinent dans ce cas-là) vous pouvez utiliser une
+paire |\footnotemark|--|\footnotetext|.
+
+\smallskip
+Néanmoins, il est également possible d'extraire les notes de pieds de page avec l'extension \pkg{footnote} ou bien
+l'extension \pkg{footnotehyper}.
+
+\smallskip
+Si \pkg{piton} est chargée avec l'option |footnote| (avec |\usepackage[footnote]{piton}|) l'extension
+\pkg{footnote} est chargée (si elle ne l'est pas déjà) et elle est utilisée pour extraire les notes de pied de
+page.
+
+\smallskip
+Si \pkg{piton} est chargée avec l'option |footnotehyper|, l'extension \pkg{footnotehyper} est chargée (si
+elle ne l'est pas déjà) et elle est utilisée pour extraire les notes de pied de page.
+
+\smallskip
+Attention : Les extensions \pkg{footnote} et \pkg{footnotehyper} sont incompatibles.
+L'extension \pkg{footnotehyper} est le successeur de l'extension \pkg{footnote}
+et devrait être utilisée préférentiellement. L'extension \pkg{footnote} a quelques défauts ;
+en particulier, elle doit être chargée après l'extension \pkg{xcolor} et elle n'est pas parfaitement
+compatible avec \pkg{hyperref}.
+
+\medskip
+Dans ce document, l'extension \pkg{piton} a été chargée avec l'option |footnotehyper| et c'est pourquoi des notes
+peuvent être mises dans les environnements |{Piton}| : voir un exemple sur la première page de ce document.
+
+\subsection{Tabulations}
+
+\smallskip
+Même s'il est recommandé d'indenter les listings Python avec des espaces (cf. PEP~8), \pkg{piton} accepte les
+caractères de tabulations (U+0009) en début de ligne. Chaque caractère U+0009 est remplacé par $n$ espaces. La
+valeur initiale de~$n$ est~4 mais on peut la changer avec la clé |tab-size| de |\PitonOptions|.
+
+\smallskip
+Il existe aussi une clé |tabs-auto-gobble| qui détermine le nombre minimal de caractères U+0009 débutant chaque
+ligne (non vide) de l'environnement |{Piton}| et applique |gobble| avec cette valeur (avant le remplacement des
+caractères U+0009 par des espaces, bien entendu). Cette clé est donc similaire à la clé |auto-gobble| mais agit sur
+des caractères U+0009 au lieu de caractères U+0020 (espaces).
+
+\section{Exemples}
+
+
+\subsection{Numérotation des lignes}
+
+\label{example-numbering}
+
+On rappelle que l'on peut demander la numérotation des lignes des listings avec la clé |line-numbers| ou la clé |all-line-numbers|.
+
+Par défaut, les numéros de ligne sont composés par \pkg{piton} en débordement à gauche (en utilisant en interne la commande |\llap| de LaTeX).
+
+Si on ne veut pas de débordement, on peut utiliser l'option |left-margin=auto| qui va insérer une marge adaptée aux
+numéros qui seront insérés (elle est plus large quand les numéros dépassent 10).
+
+
+\begingroup
+\fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
+\begin{Verbatim}
+~emphase&\PitonOptions{background-color=gray!10, left-margin = auto, line-numbers}@
+\begin{Piton}
+def arctan(x,n=10):
+ if x < 0:
+ return -arctan(-x) #> (appel récursif)
+ elif x > 1:
+ return pi/2 - arctan(1/x) #> (autre appel récursif)
+ else:
+ return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+\end{Piton}
+\end{Verbatim}
+\endgroup
+
+
+
+\begingroup
+\PitonOptions{background-color=gray!10,left-margin = auto, line-numbers}
+\begin{Piton}
+def arctan(x,n=10):
+ if x < 0:
+ return -arctan(-x) #> (appel récursif)
+ elif x > 1:
+ return pi/2 - arctan(1/x) #> (autre appel récursif)
+ else:
+ return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+\end{Piton}
+\endgroup
+
+
+\bigskip
+
+\subsection{Formatage des commentaires LaTeX}
+
+\label{example-comments}
+
+On peut modifier le style |Comment.LaTeX| (avec |\SetPitonStyle|) pour faire afficher les commentaires
+LaTeX (qui débutent par |#>|) en butée à droite.
+
+\begingroup
+\fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
+\begin{Verbatim}
+\PitonOptions{background-color=gray!10}
+~emphase&\SetPitonStyle{Comment.LaTeX = \hfill \normalfont\color{gray}}@
+\begin{Piton}
+def arctan(x,n=10):
+ if x < 0:
+ return -arctan(-x) #> appel récursif
+ elif x > 1:
+ return pi/2 - arctan(1/x) #> autre appel récursif
+ else:
+ return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+\end{Piton}
+\end{Verbatim}
+\endgroup
+
+\begingroup
+\PitonOptions{background-color=gray!10}
+\SetPitonStyle{Comment.LaTeX = \hfill \normalfont\color{gray}}
+\begin{Piton}
+def arctan(x,n=10):
+ if x < 0:
+ return -arctan(-x) #> appel récursif
+ elif x > 1:
+ return pi/2 - arctan(1/x) #> autre appel récursif
+ else:
+ return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+\end{Piton}
+\endgroup
+
+
+\vspace{1cm}
+On peut aussi faire afficher les commentaires dans une deuxième colonne à droite si on limite la largeur du code
+proprement dit avec un environnement |{minipage}| de LaTeX.
+
+
+\begingroup
+\fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
+\begin{Verbatim}
+\PitonOptions{background-color=gray!10}
+~emphase&\NewDocumentCommand{\MyLaTeXCommand}{m}{\hfill \normalfont\itshape\rlap{\quad #1}}@
+~emphase&\SetPitonStyle{Comment.LaTeX = \MyLaTeXCommand}@
+~emphase&\begin{minipage}{12cm}@
+\begin{Piton}
+def arctan(x,n=10):
+ if x < 0:
+ return -arctan(-x) #> appel récursif
+ elif x > 1:
+ return pi/2 - arctan(1/x) #> autre appel récursif
+ else:
+ s = 0
+ for k in range(n):
+ s += (-1)**k/(2*k+1)*x**(2*k+1)
+ return s
+\end{Piton}
+~emphase&\end{minipage}@
+\end{Verbatim}
+\endgroup
+
+
+
+\begingroup
+\PitonOptions{background-color=gray!10}
+\NewDocumentCommand{\MyLaTeXCommand}{m}{\hfill \normalfont\itshape\rlap{\quad #1}}
+\SetPitonStyle{Comment.LaTeX = \MyLaTeXCommand}
+\begin{minipage}{12cm}
+\begin{Piton}
+def arctan(x,n=10):
+ if x < 0:
+ return -arctan(-x) #> appel récursif
+ elif x > 1:
+ return pi/2 - arctan(1/x) #> autre appel récursif
+ else:
+ s = 0
+ for k in range(n):
+ s += (-1)**k/(2*k+1)*x**(2*k+1)
+ return s
+\end{Piton}
+\end{minipage}
+\endgroup
+
+\bigskip
+
+\subsection{Notes dans les listings}
+
+Pour pouvoir extraire les notes (introduites par |\footnote|), l'extension |piton| doit être chargée, soit avec la
+clé |footnote|, soit avec la clé |footnotehyper|, comme expliqué à la section \ref{footnote} p.~\pageref{footnote}.
+Dans le présent document, l'extension \pkg{piton} a été chargée par la clé |footnotehyper|.
+
+Bien entendu, une commande |\footnote| ne peut apparaître que dans un commentaire LaTeX (qui débute par |#>|). Un
+tel commentaire peut se limiter à cette unique commande |\footnote|, comme dans l'exemple suivant.
+
+\begingroup
+\fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
+\begin{Verbatim}
+\PitonOptions{background-color=gray!10}
+\begin{Piton}
+def arctan(x,n=10):
+ if x < 0:
+ return -arctan(-x)~emphase&#>\footnote{Un premier appel récursif.}]@
+ elif x > 1:
+ return pi/2 - arctan(1/x)~emphase&#>\footnote{Un deuxième appel récursif.}@
+ else:
+ return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+\end{Piton}
+\end{Verbatim}
+\endgroup
+
+\begingroup
+\PitonOptions{background-color=gray!10}
+\begin{Piton}
+def arctan(x,n=10):
+ if x < 0:
+ return -arctan(-x)#>\footnote{Un premier appel récursif.}
+ elif x > 1:
+ return pi/2 - arctan(1/x)#>\footnote{Un deuxième appel récursif.}
+ else:
+ return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+\end{Piton}
+\endgroup
+
+
+\vspace{1cm}
+
+Si on utilise l'environnement |{Piton}| dans un environnement |{minipage}| de LaTeX, les notes sont, bien entendu,
+composées au bas de l'environnement |{minipage}|. Rappelons qu'une telle |{minipage}| ne peut être coupée par un
+saut de page.
+
+
+\begingroup
+\fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
+\begin{Verbatim}
+\PitonOptions{background-color=gray!10}
+\emphase\begin{minipage}{\linewidth}
+\begin{Piton}
+def arctan(x,n=10):
+ if x < 0:
+ return -arctan(-x)~emphase&#>\footnote{Un premier appel récursif.}@
+ elif x > 1:
+ return pi/2 - arctan(1/x)~emphase&#>\footnote{Un deuxième appel récursif.}@
+ else:
+ return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+\end{Piton}
+\end{minipage}
+\end{Verbatim}
+\endgroup
+
+\begingroup
+\PitonOptions{background-color=gray!10}
+\begin{minipage}{\linewidth}
+\begin{Piton}
+def arctan(x,n=10):
+ if x < 0:
+ return -arctan(-x)#>\footnote{Un premier appel récursif.}
+ elif x > 1:
+ return pi/2 - arctan(1/x)#>\footnote{Un deuxième appel récursif.}
+ else:
+ return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+\end{Piton}
+\end{minipage}
+\endgroup
+
+
+\vspace{1cm}
+Si on encapsule l'environnement |{Piton}| dans un environnement |{minipage}| pour, typiquement, limiter la largeur
+d'un fond coloré, il faut encadrer l'ensemble dans un environnement |{savenotes}| (de \pkg{footnote} ou
+\pkg{footnotehyper}) si on veut avoir les notes reportées en pied de page.
+
+\begingroup
+\fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
+\begin{Verbatim}
+\PitonOptions{background-color=gray!10}
+~emphase&\begin{savenotes}@
+\begin{minipage}{13cm}
+\begin{Piton}
+def arctan(x,n=10):
+ if x < 0:
+ return -arctan(-x)~emphase&#>\footnote{Un premier appel récursif.}@
+ elif x > 1:
+ return pi/2 - arctan(1/x)~emphase&#>\footnote{Un deuxième appel récursif.}@
+ else:
+ return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+\end{Piton}
+\end{minipage}
+~emphase&\end{savenotes}@
+\end{Verbatim}
+\endgroup
+
+
+
+\begin{savenotes}
+\PitonOptions{background-color=gray!10}
+\begin{minipage}{13cm}
+\begin{Piton}
+def arctan(x,n=10):
+ if x < 0:
+ return -arctan(-x)#>\footnote{Un premier appel récursif.}
+ elif x > 1:
+ return pi/2 - arctan(1/x)#>\footnote{Un deuxième appel récursif.}
+ else:
+ return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+\end{Piton}
+\end{minipage}
+\end{savenotes}
+
+\bigskip
+
+\subsection{Un exemple de réglage des styles}
+
+Les styles graphiques ont été présentés à la partie \ref{styles}, p.~\pageref{styles}.
+
+\smallskip
+On présente ici un réglage de ces styles adapté pour les documents en noir et blanc. On l'utilise avec la fonte
+\emph{DejaVu Sans Mono}\footnote{Voir: \url{https://dejavu-fonts.github.io}} spécifiée avec la commande
+ |\setmonofont| de \pkg{fontspec}.
+
+Ce réglage utilise la commande |\highLight| de \pkg{lua-ul} (cette extension nécessite elle-même l'extension \pkg{luacolor}).
+
+
+\begin{Verbatim}
+\setmonofont[Scale=0.85]{DejaVu Sans Mono}
+
+\SetPitonStyle
+ {
+ Number = ,
+ String = \itshape ,
+ String.Doc = \color{gray} \itshape ,
+ Operator = ,
+ Operator.Word = \bfseries ,
+ Name.Builtin = ,
+ Name.Function = \bfseries \highLight[gray!20] ,
+ Comment = \color{gray} ,
+ Comment.LaTeX = \normalfont \color{gray},
+ Keyword = \bfseries ,
+ Name.Namespace = ,
+ Name.Class = ,
+ Name.Type = ,
+ InitialValues = \color{gray}
+ }
+\end{Verbatim}
+
+
+\begingroup
+
+
+\setmonofont[Scale=0.85]{DejaVu Sans Mono}
+
+\SetPitonStyle
+ {
+ Number = ,
+ String = \itshape ,
+ String.Doc = \color{gray} \itshape ,
+ Operator = ,
+ Operator.Word = \bfseries ,
+ Name.Builtin = ,
+ Name.Function = \bfseries \highLight[gray!20] ,
+ Comment = \color{gray} ,
+ Comment.LaTeX = \normalfont \color{gray},
+ Keyword = \bfseries ,
+ Name.Namespace = ,
+ Name.Class = ,
+ Name.Type = ,
+ InitialValues = \color{gray}
+ }
+
+
+\bigskip
+
+\begin{Piton}
+from math import pi
+
+def arctan(x,n=10):
+ """Compute the mathematical value of arctan(x)
+
+ n is the number of terms in the sum
+ """
+ if x < 0:
+ return -arctan(-x) # appel récursif
+ elif x > 1:
+ return pi/2 - arctan(1/x)
+ #> (on a utilisé le fait que $\arctan(x)+\arctan(1/x)=\pi/2$ pour $x>0$)
+ else:
+ s = 0
+ for k in range(n):
+ s += (-1)**k/(2*k+1)*x**(2*k+1)
+ return s
+\end{Piton}
+
+
+\endgroup
+
+\section{Utilisation avec pyluatex}
+
+\subsection{Utilisation standard de pyluatex}
+
+L'extension \pkg{pyluatex} est une extension qui permet l'exécution de code Python à partir de |lualatex| (pourvu
+que Python soit installé sur la machine et que la compilation soit effectuée avec |lualatex| et |--shell-escape|).
+
+Voici, à titre d'exemple, un environnement |{PitonExecute}| qui formate un listing Python (avec \pkg{piton}) et qui
+affiche également dessous le résultat de l'exécution de ce code avec Python.
+
+
+\begin{Verbatim}
+\ExplSyntaxOn
+\NewDocumentEnvironment { ~emphase#PitonExecute@ } { ! O { } } % le ! est obligatoire
+ {
+ \PyLTVerbatimEnv
+ \begin{pythonq}
+ }
+ {
+ \end{pythonq}
+ \directlua
+ {
+ tex.print("\\PitonOptions{~#1}")
+ tex.print("\\begin{Piton}")
+ tex.print(pyluatex.get_last_code())
+ tex.print("\\end{Piton}")
+ tex.print("")
+ }
+ \begin{center}
+ \directlua{tex.print(pyluatex.get_last_output())}
+ \end{center}
+ }
+\ExplSyntaxOff
+\end{Verbatim}
+
+\ExplSyntaxOn
+\NewDocumentEnvironment { PitonExecute } { ! O { } }
+ {
+ \PyLTVerbatimEnv
+ \begin{pythonq}
+ }
+ {
+ \end{pythonq}
+ \directlua
+ {
+ tex.print("\\PitonOptions{#1}")
+ tex.print("\\begin{Piton}")
+ tex.print(pyluatex.get_last_code())
+ tex.print("\\end{Piton}")
+ tex.print("")
+ }
+ \begin{center}
+ \directlua{tex.print(pyluatex.get_last_output())}
+ \end{center}
+ }
+\ExplSyntaxOff
+
+Cet environnement |{PitonExecute}| prend en argument optionnel (entre crochets) les options proposées par la
+commande |\PitonOptions|.
+
+\bigskip
+Voici un exemple d'utilisation de cet environnement |{PitonExecute}| :
+
+\begin{Verbatim}
+\begin{~emphase#PitonExecute@}[background-color=gray!15]
+def square(x):
+ return x*x
+print(f'Le carré de 12 est {square(12)}.')
+\end{~emphase#PitonExecute@}
+\end{Verbatim}
+
+
+\medskip
+\begin{PitonExecute}[background-color=gray!15]
+def square(x):
+ return x*x
+print(f'Le carré de 12 est {square(12)}.')
+\end{PitonExecute}
+
+\bigskip
+
+\subsection{Utilisation de l'environnement \{pythonrepl\} de pyluatex}
+
+\label{pythonrepl}
+
+L'environnement |{pythonrepl}| de \pkg{pyluatex} passe son contenu à Python et renvoie ce que l'on obtient quand on
+fournit ce code à une boucle \textsc{repl} (\emph{read-eval-print loop}) de Python. On obtient un entrelacement
+d'instructions précédées par le prompt |>>>| de Python et des valeurs renvoyées par Python (et de ce qui a été
+demandé d'être affiché avec des \piton{print} de Python).
+
+\medskip
+Il est ensuite possible de passer cela à un environnement |{Piton}| qui va faire un coloriage syntaxique
+et mettre sur fond grisé les lignes correspondant aux instructions fournies à l'interpréteur Python (gràce à la clé
+|prompt-background-color| de |\PitonOptions|).
+
+
+\medskip
+Voici la programmation d'un environnement |{PitonREPL}| qui effectue ce travail (pour des raisons techniques, le
+|!| est ici obligatoire dans la signature de l'environnement).
+
+\begin{Verbatim}
+\NewDocumentEnvironment { PitonREPL } { ! O { } } % le ! est obligatoire
+ {
+ \PitonOptions
+ { background-color=white,
+ ~emphase#prompt-background-color = gray!10@,
+ ~#1
+ }
+ \PyLTVerbatimEnv
+ \begin{pythonrepl}
+ }
+ {
+ \directlua
+ {
+ tex.print("\\begin{Piton}")
+ tex.print(pyluatex.get_last_output())
+ tex.print("\\end{Piton}")
+ tex.print("")
+ }
+ \end{pythonrepl}
+ }
+\end{Verbatim}
+
+\medskip
+Voici un exemple d'utilisation de ce nouvel environnement |{PitonREPL}|.
+
+\medskip
+\begin{Verbatim}
+~emphase#\begin{PitonREPL}@
+ def valeur_absolue(x):
+ "Renvoie la valeur absolue de x"
+ if x > 0:
+ return x
+ else:
+ return -x
+
+ valeur_absolue(-3)
+ valeur_absolue(0)
+ valeur_absolue(5)
+~emphase#\end{PitonREPL}@
+\end{Verbatim}
+
+\bigskip
+
+
+\NewDocumentEnvironment { PitonREPL } { }
+ {
+ \PitonOptions{background-color=white,prompt-background-color = gray!10}
+ \PyLTVerbatimEnv
+ \begin{pythonrepl}
+ }
+ {
+ \directlua
+ {
+ tex.print("\\begin{Piton}")
+ tex.print(pyluatex.get_last_output())
+ tex.print("\\end{Piton}")
+ tex.print("")
+ }
+ \end{pythonrepl}
+ }
+
+
+\begin{PitonREPL}
+ def valeur_absolue(x):
+ "Renvoie la valeur absolue de x"
+ if x > 0:
+ return x
+ else:
+ return -x
+
+ valeur_absolue(-3)
+ valeur_absolue(0)
+ valeur_absolue(5)
+\end{PitonREPL}
+
+
+\bigskip
+En fait, il est possible de ne pas faire afficher les prompts eux-mêmes (c'est-à-dire les chaînes de caractères
+|>>>| et |...|). En effet, \pkg{piton} propose un style pour ces éléments, qui est appelé |Prompt|. Par défaut, la
+valeur de ce style est vide, ce qui fait qu'aucune action n'est exécutée sur ces éléments qui sont donc affichés
+tels quels. En fournissant comme valeur une fonction qui se contente de gober son argument, on peut demander à ce
+qu'ils ne soient pas affichés.
+
+\bigskip
+\begin{savenotes}
+\begin{Verbatim}
+\NewDocumentCommand{\Gobe}{m}{}#~color#black@~footnote#On a défini ici une fonction ~texttt#~string~Gobe@ mais, en fait, elle existe déjà en L3 sous le nom ~texttt#~string~use~_none:n@.@@
+\SetPitonStyle{ ~emphase#Prompt = \Gobe@ }
+\end{Verbatim}
+\end{savenotes}
+
+
+
+
+\NewDocumentCommand{\Gobe}{m}{}
+\ExplSyntaxOn
+\SetPitonStyle{ Prompt = \use_none:n }
+\ExplSyntaxOff
+
+\bigskip
+L'exemple précédent donne alors :
+
+\medskip
+\begin{Verbatim}
+~emphase#\begin{PitonREPL}@
+ def valeur_absolue(x):
+ "Renvoie la valeur absolue de x"
+ if x > 0:
+ return x
+ else:
+ return -x
+
+ valeur_absolue(-3)
+ valeur_absolue(0)
+ valeur_absolue(5)
+~emphase#\end{PitonREPL}@
+\end{Verbatim}
+
+
+
+\begin{PitonREPL}
+ def valeur_absolue(x):
+ "Renvoie la valeur absolue de x"
+ if x > 0:
+ return x
+ else:
+ return -x
+
+ valeur_absolue(-3)
+ valeur_absolue(0)
+ valeur_absolue(5)
+\end{PitonREPL}
+
+
+
+\section*{Autre documentation}
+
+Le document |piton.pdf| (fourni avec l'extension \pkg{piton}) contient une traduction anglaise de la
+documentation ici présente, ainsi que le code source commenté et un historique des versions.
+
+
+\medskip
+Les versions successives du fichier |piton.sty| fournies par
+TeXLive sont disponibles sur le serveur \textsc{svn} de TeXLive :
+
+\smallskip
+{
+\small
+\nolinkurl{https://tug.org/svn/texlive/trunk/Master/texmf-dist/tex/lualatex/piton/piton.sty}
+}
+
+
+
+\tableofcontents
+
\end{document} \ No newline at end of file
diff --git a/macros/luatex/latex/piton/piton.dtx b/macros/luatex/latex/piton/piton.dtx
index 8d8caee54f..4f1d4290a1 100644
--- a/macros/luatex/latex/piton/piton.dtx
+++ b/macros/luatex/latex/piton/piton.dtx
@@ -1,5161 +1,5174 @@
-% \iffalse -*- coding: utf-8 ; -*- \fi \iffalse meta-comment
-%
-% Copyright (C) 2023 by F. Pantigny
-% -----------------------------------
-%
-% This file may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3
-% of this license or (at your option) any later version.
-% The latest version of this license is in:
-%
-% http://www.latex-project.org/lppl.txt
-%
-% and version 1.3 or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
-%
-% \fi
-% \iffalse
-\def\myfileversion{1.5}
-\def\myfiledate{2023/04/04}
-%
-%
-%<*batchfile>
-\begingroup
-\input l3docstrip.tex
-\keepsilent
-\usedir{tex/latex/cascade}
-\preamble
-
-Copyright (C) 2022-2023 by F. Pantigny
------------------------------------
-
-This file may be distributed and/or modified under the
-conditions of the LaTeX Project Public License, either version 1.3
-of this license or (at your option) any later version.
-The latest version of this license is in:
-
-http://www.latex-project.org/lppl.txt
-
-and version 1.3 or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
-
-\endpreamble
-\askforoverwritefalse
-\endgroup
-%</batchfile>
-%
-%<@@=piton>
-%<*driver>
-\documentclass{l3doc}
-\usepackage{geometry}
-\geometry{left=2.8cm,right=2.8cm,top=2.5cm,bottom=2.5cm,papersize={21cm,29.7cm}}
-\usepackage{fontspec}
-\usepackage[dvipsnames]{xcolor}
-\usepackage{caption,tabularx,tcolorbox,luacolor,lua-ul}
-\def\emphase{\bgroup\color{RoyalPurple}\let\next=}
-\fvset{commandchars=\~\#\@,formatcom=\color{gray}}
-\captionsetup{labelfont = bf}
-\usepackage{ragged2e}
-\usepackage[footnotehyper,escape-inside=$$,math-comments]{piton} % $$
-
-\parindent 0pt
-\skip\footins = 2\bigskipamount
-
-\PitonOptions{gobble=2}
-
-\EnableCrossrefs
-
-\begin{document}
-\DocInput{piton.dtx}
-\end{document}
-%</driver>
-% \fi
-%
-% \catcode`\" = 11
-%
-% \title{The package \pkg{piton}\thanks{This document corresponds to the
-% version~\myfileversion\space of \pkg{piton}, at the date of~\myfiledate.}}
-% \author{F. Pantigny \\ \texttt{fpantigny@wanadoo.fr}}
-%
-% \maketitle
-%
-% \begin{abstract}
-% The package \pkg{piton} provides tools to typeset Python listings with
-% syntactic highlighting by using the Lua library LPEG. It requires LuaLaTeX.
-% \end{abstract}
-%
-%
-%
-% \section{Presentation}
-%
-%
-% The package \pkg{piton} uses the Lua library LPEG\footnote{LPEG is a
-% pattern-matching library for Lua, written in C, based on \emph{parsing
-% expression grammars}: \url{http://www.inf.puc-rio.br/~roberto/lpeg/}} for
-% parsing Python listings and typeset them with syntactic highlighting. Since it
-% uses Lua code, it works with |lualatex| only (and won't work with the other
-% engines: |latex|, |pdflatex| and |xelatex|). It does not use external program
-% and the compilation does not require |--shell-escape|. The compilation is very
-% fast since all the parsing is done by the library LPEG, written in C.
-%
-% \bigskip
-% Here is an example of code typeset by \pkg{piton}, with the environment |{Piton}|.
-%
-% \bigskip
-%
-% \begin{Piton}
-% from math import pi
-%
-% def arctan(x,n=10):
-% """Compute the mathematical value of arctan(x)
-%
-% n is the number of terms in the sum
-% """
-% if x < 0:
-% return -arctan(-x) # recursive call
-% elif x > 1:
-% return pi/2 - arctan(1/x)
-% #> (we have used that $\arctan(x)+\arctan(1/x)=\frac{\pi}{2}$ for $x>0$)\footnote{This LaTeX escape has been done by beginning the comment by \ttfamily\#>.}
-% else:
-% s = 0
-% for k in range(n):
-% s += (-1)**k/(2*k+1)*x**(2*k+1)
-% return s
-% \end{Piton}
-%
-%
-% \bigskip
-% The package \pkg{piton} is entirely contained in the file
-% |piton.sty|. This file may be put in the current directory or in a
-% |texmf| tree. However, the best is to install \pkg{piton} with a TeX
-% distribution such as MiKTeX, TeX Live or MacTeX.
-%
-%
-% \section{Use of the package}
-%
-%
-% \subsection{Loading the package}
-%
-% The package \pkg{piton} should be loaded with the classical command
-% |\usepackage|: |\usepackage{piton}|.
-%
-% \smallskip
-% Nevertheless, we have two remarks:
-% \begin{itemize}
-% \item the package \pkg{piton} uses the package \pkg{xcolor} (but \pkg{piton}
-% does \emph{not} load \pkg{xcolor}: if \pkg{xcolor} is not loaded before the
-% |\begin{document}|, a fatal error will be raised).
-% \item the package \pkg{piton} must be used with LuaLaTeX exclusively: if
-% another LaTeX engine (|latex|, |pdflatex|, |xelatex|,\dots ) is used, a
-% fatal error will be raised.
-% \end{itemize}
-%
-% \subsection{The tools provided to the user}
-%
-% The package \pkg{piton} provides several tools to typeset Python code: the
-% command |\piton|, the environment |{Piton}| and the command |\PitonInputFile|.
-%
-% \begin{itemize}\setlength{\fboxsep}{1pt}
-% \item The command \colorbox{gray!20}{\texttt\textbackslash piton} should be
-% used to typeset small pieces of code inside a paragraph. For example:
-%
-% {\color{gray}\verb|\piton{def square(x): return x*x}|}\qquad
-% \piton{def square(x): return x*x}
-%
-% The syntax and particularities of the command |\piton| are detailed below.
-%
-% \item The environment \colorbox{gray!20}{\ttfamily\{Piton\}} should be used to
-% typeset multi-lines code. Since it takes its argument in a verbatim mode, it
-% can't be used within the argument of a LaTeX command. For sake of
-% customization, it's possible to define new environments similar to the
-% environment |{Piton}| with the command |\NewPitonEnvironment|:
-% cf.~\ref{NewPitonEnvironment} p.~\pageref{NewPitonEnvironment}.
-%
-% \item The command \colorbox{gray!20}{\ttfamily\textbackslash PitonInputFile}
-% is used to insert and typeset a whole external file.
-%
-% That command takes in as optional argument (between square brackets) two keys
-% |first-line| and |last-line|: only the part between the corresponding lines
-% will be inserted.
-% \end{itemize}
-%
-% \subsection{The syntax of the command \textbackslash piton}
-%
-% In fact, the command |\piton| is provided with a double syntax. It may be used
-% as a standard command of LaTeX taking its argument between curly braces
-% (|\piton{...}|) but it may also be used with a syntax similar to the syntax of
-% the command
-% |\verb|, that is to say with the argument delimited by two identical characters (e.g.: \verb!\piton|...|!).
-%
-% \begin{itemize}
-% \item {\color{blue} \textsf{Syntax} \verb|\piton{...}|}\par\nobreak
-% When its argument is given between curly braces, the command |\piton| does not
-% take its argument in verbatim mode. In particular:
-% \begin{itemize}
-% \item several consecutive spaces will be replaced by only one space,
-%
-% {\color{cyan} but the command |\|␣ is provided to force the insertion of a space};
-%
-% \item it's not possible to use |%| inside the argument,
-%
-% {\color{cyan} but the command |\%| is provided to insert a |%|};
-%
-% \item the braces must be appear by pairs correctly nested
-%
-% {\color{cyan} but the commands |\{| and |\}| are also provided for individual braces};
-%
-% \item the LaTeX commands\footnote{That concerns the commands beginning with a
-% backslash but also the active characters.} are fully expanded and not
-% executed,
-%
-% {\color{cyan} so it's possible to use |\\| to insert a backslash}.
-% \end{itemize}
-%
-%
-% The other characters (including |#|, |^|, |_|, |&|, |$| and |@|)
-% must be inserted without backslash.
-%
-% \bigskip
-%\begin{tabular}{>{\color{gray}}w{l}{75mm}@{\hspace*{1cm}}l}
-% \omit Examples : \hfil \\
-% \noalign{\vskip1mm}
-% \verb|\piton{MyString = '\\n'}| &
-% \piton{MyString = '\\n'} \\
-% \verb|\piton{def even(n): return n\%2==0}| &
-% \piton{def even(n): return n\%2==0} \\
-% \verb|\piton{c="#" # an affectation }| &
-% \piton{c="#" # an affectation } \\
-% \verb|\piton{c="#" \ \ \ # an affectation }| &
-% \piton{c="#" \ \ \ # an affectation } \\
-% \verb|\piton{MyDict = {'a': 3, 'b': 4 }}| &
-% \piton{MyDict = {'a': 3, 'b': 4 }}
-% \end{tabular}
-%
-% \bigskip
-% It's possible to use the command |\piton| in the arguments of a
-% LaTeX command.\footnote{For example, it's possible to use the command
-% \texttt{\textbackslash piton} in a footnote. Example :
-% \piton{s = 'A string'}.}
-%
-% \bigskip
-% \item {\color{blue} \textsf{Syntaxe} \verb!\piton|...|!}\par\nobreak
-%
-% When the argument of the command |\piton| is provided between two identical
-% characters, that argument is taken in a \emph{verbatim mode}. Therefore, with
-% that syntax, the command |\piton| can't be used within the argument of another
-% command.
-%
-% \medskip
-%
-% \begin{tabular}{>{\color{gray}}w{l}{75mm}@{\hspace*{1cm}}l}
-% \omit Examples : \hfil \\
-% \noalign{\vskip1mm}
-% \verb!\piton|MyString = '\n'|! &
-% \piton|MyString = '\n'| \\
-% \verb|\piton!def even(n): return n%2==0!| &
-% \piton!def even(n): return n%2==0! \\
-% \verb|\piton+c="#" # an affectation +| &
-% \piton+c="#" # an affectation + \\
-% \verb|\piton?MyDict = {'a': 3, 'b': 4}?| &
-% \piton!MyDict = {'a': 3, 'b': 4}!
-% \end{tabular}
-%
-% \end{itemize}
-%
-% \section{Customization}
-%
-% \subsection{The command \textbackslash PitonOptions}
-%
-%
-% \NewDocumentCommand{\Definition}{m}
-% {{\setlength{\fboxsep}{1pt}\colorbox{gray!20}{\ttfamily \vphantom{gl}#1}}}
-%
-% The command |\PitonOptions| takes in as argument a comma-separated list of
-% \textsl{key=value} pairs. The scope of the settings done by that command is
-% the current TeX group.\footnote{We remind that a LaTeX environment is, in
-% particular, a TeX group.}
-%
-% \begin{itemize}
-% \item The key \Definition{gobble} takes in as value a
-% positive integer~$n$: the first $n$ characters are discarded (before the
-% process of highlightning of the code) for each line of the environment
-% |{Piton}|. These characters are not necessarily spaces.
-%
-% \item When the key \Definition{auto-gobble} is in force, the
-% extension \pkg{piton} computes the minimal value $n$ of the number of
-% consecutive spaces beginning each (non empty) line of the environment
-% |{Piton}| and applies |gobble| with that value of~$n$.
-%
-% \item When the key \Definition{env-gobble} is in force, \pkg{piton} analyzes the last
-% line of the environment |{Piton}|, that is to say the line which contains
-% |\end{Piton}| and determines whether that line contains only spaces followed
-% by the |\end{Piton}|. If we are in that situation, \pkg{piton} computes the
-% number~$n$ of spaces on that line and applies |gobble| with that value of~$n$.
-% The name of that key comes from \emph{environment gobble}: the effect of
-% gobble is set by the position of the commands |\begin{Piton}| and
-% |\end{Piton}| which delimit the current environment.
-%
-% \item With the key \Definition{line-numbers}, the \emph{non empty} lines (and
-% all the lines of the \emph{docstrings}, even the empty ones) are numbered in
-% the environments |{Piton}| and in the listings resulting from the use of
-% |\PitonInputFile|.
-%
-% \item With the key \Definition{all-line-numbers}, \emph{all} the lines are numbered,
-% including the empty ones.
-%
-% \item \colorbox{yellow!50}{\bfseries{New 1.5}}\par\nobreak
-%
-% The key \Definition{numbers-sep} is the horizontal distance between the
-% numbers of lines (inserted by |line-numbers| of |all-line-numbers|) and the
-% beginning of the lines of code. The initial value is 0.7~em.
-%
-% \item With the key \Definition{resume}, the counter of lines is not set to zero
-% at the beginning of each environment |{Piton}| or use of |\PitonInputFile| as
-% it is otherwise. That allows a numbering of the lines across several
-% environments.
-%
-% \item The key \Definition{left-margin} corresponds to a margin on the left.
-% That key may be useful in conjonction with the key |line-numbers| or the key
-% |line-all-numbers| if one does not want the numbers in an overlapping position
-% on the left.
-%
-% It's possible to use the key |left-margin| with the value |auto|. With that
-% value, if the key |line-numbers| or the key |all-line-numbers| is used, a
-% margin will be automatically inserted to fit the numbers of lines. See an
-% example part \ref{example-numbering} on page~\pageref{example-numbering}.
-%
-% \item The key \Definition{background-color} sets the background color of the
-% environments |{Piton}| and the listings produced by |\PitonInputFile| (that
-% background has a width of |\linewidth|).
-%
-% \smallskip
-% \colorbox{yellow!50}{\textbf{New 1.4}}\enskip The key |background-color|
-% supports also as value a \emph{list} of colors. In this case, the successive
-% rows are colored by using the colors of the list in a cyclic way.
-%
-% \emph{Example} : |\PitonOptions{background-color = {gray!5,white}}|
-%
-%
-% The key |background-color| accepts a color defined «on the fly». For example,
-% it's possible to write |background-color = [cmyk]{0.1,0.05,0,0}|.
-%
-% \item With the key \Definition{prompt-background-color}, \pkg{piton} adds a
-% color background to the lines beginning with the prompt ``|>>>|'' (and its
-% continuation ``|...|'') characteristic of the Python consoles with
-% \textsc{repl} (\emph{read-eval-print loop}).
-%
-% \item When the key \Definition{show-spaces-in-strings} is activated, the
-% spaces in the short strings (that is to say those delimited by |'| or |"|) are
-% replaced by the character~␣ (U+2423 : \textsc{open box}). Of course, that
-% character~U+2423 must be present in the monospaced font which is
-% used.\footnote{The package \pkg{piton} simply uses the current monospaced
-% font. The best way to change that font is to use the command
-% \texttt{\textbackslash setmonofont} of the package \pkg{fontspec}.}\par\nobreak
-% \begingroup \PitonOptions{show-spaces-in-strings} Example :
-% \piton|my_string = 'Very good answer'| \endgroup
-%
-% With the key \Definition{show-spaces}, all the spaces are replaced by U+2423
-% (and no line break can occur on those ``visible spaces'', even when the key
-% |break-lines|\footnote{cf. \ref{line-breaks} p.~\pageref{line-breaks}} is in
-% force).
-% \end{itemize}
-%
-% \bigskip
-%
-% \begingroup
-% \fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
-% \begin{Verbatim}
-% ~emphase&\PitonOptions{line-numbers,auto-gobble,background-color = gray!15}@
-% \begin{Piton}
-% from math import pi
-% def arctan(x,n=10):
-% """Compute the mathematical value of arctan(x)
-%
-% n is the number of terms in the sum
-% """
-% if x < 0:
-% return -arctan(-x) # recursive call
-% elif x > 1:
-% return pi/2 - arctan(1/x)
-% #> (we have used that $\arctan(x)+\arctan(1/x)=\frac{\pi}{2}$ pour $x>0$)
-% else
-% s = 0
-% for k in range(n):
-% s += (-1)**k/(2*k+1)*x**(2*k+1)
-% return s
-% \end{Piton}
-% \end{Verbatim}
-% \endgroup
-%
-% \begingroup
-% \PitonOptions{line-numbers,background-color = gray!15}
-% \begin{Piton}
-% from math import pi
-%
-% def arctan(x,n=10):
-% """Compute the mathematical value of arctan(x)
-%
-% n is the number of terms in the sum
-% """
-% if x < 0:
-% return -arctan(-x) # recursive call
-% elif x > 1:
-% return pi/2 - arctan(1/x)
-% #> (we have used that $\arctan(x)+\arctan(1/x)=\frac{\pi}{2}$ for $x>0$)
-% else
-% s = 0
-% for k in range(n):
-% s += (-1)**k/(2*k+1)*x**(2*k+1)
-% return s
-% \end{Piton}
-% \endgroup
-%
-% \bigskip
-% The command |\PitonOptions| provides in fact several other keys which will be
-% described further (see in particular the ``Pages breaks and line breaks''
-% p.~\pageref{breakable}).
-%
-% \subsection{The styles}
-%
-% \label{styles}
-%
-% The package \pkg{piton} provides the command |\SetPitonStyle| to customize the
-% different styles used to format the syntactic elements of the Python listings.
-% The customizations done by that command are limited to the current TeX
-% group.\footnote{We remind that a LaTeX environment is, in particular, a TeX group.}
-%
-% \bigskip
-% The command |\SetPitonStyle| takes in as argument a comma-separated list of
-% \textsl{key=value} pairs. The keys are names of styles and the value are LaTeX
-% formatting instructions.
-%
-% \bigskip
-% These LaTeX instructions must be formatting instructions such as
-% |\color{...}|, |\bfseries|, |\slshape|, etc. (the commands of this kind are
-% sometimes called \emph{semi-global} commands). It's also possible to put,
-% \emph{at the end of the list of instructions}, a LaTeX command taking exactly
-% one argument.
-%
-% \bigskip
-% Here an example which changes the style used to highlight, in the definition
-% of a Python function, the name of the function which is defined. That code
-% uses the command |\highLight| of \pkg{lua-ul} (that package requires also the
-% package \pkg{luacolor}).
-%
-% \begin{verbatim}
-% \SetPitonStyle{ Name.Function = \bfseries \highLight[red!50] }
-% \end{verbatim}
-%
-% In that example, |\highLight[red!50]| must be considered as the name of a
-% LaTeX command which takes in exactly one argument, since, usually, it is used
-% with |\highLight[red!50]{...}|.
-%
-% \medskip
-% \begingroup
-% \SetPitonStyle
-% { Name.Function = \bfseries \highLight[red!50] }
-% With that setting, we will have : \piton{def cube(x) : return x * x * x }
-% \endgroup
-%
-% \bigskip
-% The different styles are described in the table \ref{Semantic}. The initial
-% settings done by \pkg{piton} in |piton.sty| are inspired by the style
-% \pkg{manni} de Pygments.\footnote{See:
-% \url{https://pygments.org/styles/}. Remark that, by default, Pygments provides for its style \pkg{manni} a colored background whose color is the HTML color \texttt{\#F0F3F3}. It's possible to have the same color in \texttt{\{Pion\}} with the instruction \texttt{\textbackslash PitonOptions\{background-color = [HTML]\{F0F3F3\}\}}.}
-%
-% \bigskip
-% \colorbox{yellow!50}{\textbf{New 1.4}}\enskip The command |\PitonStyle| takes
-% in as argument the name of a style and allows to retrieve the value (as a list
-% of LaTeX instructions) of that style.
-%
-% \smallskip
-% For example, it's possible to write |{\PitonStyle{Keyword}{function}}| and we
-% will have the word {\PitonStyle{Keyword}{function}} formatted as a keyword.
-%
-% \smallskip
-% The syntax |{\PitonStyle{|\textsl{\texttt{style}}|}{...}}| is mandatory in
-% order to be able to deal both with the semi-global commands and the commands
-% with arguments which may be present in the definition of the style
-% \texttt{\textsl{style}}.
-%
-% \begin{table}[b]
-% \centering
-% \caption{Usage of the different styles}
-% \label{Semantic}
-% \begin{tabular}{@{}>{\ttfamily}l>{\RaggedRight\arraybackslash}p{9cm}@{}}
-% \toprule
-% \normalfont Style & Usage \\
-% \midrule
-% Number & the numbers \\
-% String.Short & the short strings (between \texttt{'} or \verb|"|) \\
-% String.Long & the long strings (between \texttt{'''} or \verb|"""|) except the
-% documentation strings \\
-% String & that keys sets both |String.Short| and |String.Long| \\
-% String.Doc & the documentation strings (only between \texttt{"""} following
-% PEP~257) \\
-% String.Interpol & the syntactic elements of the fields of the f-strings (that
-% is to say the characters \texttt{\{} and \texttt{\}}) \\
-% Operator & the following operators : \texttt{!= == << >> - \~{} + / * \% = < > \& .} \verb+|+ \verb|@|\\
-% Operator.Word & the following operators : \texttt{in}, \texttt{is},
-% \texttt{and}, \texttt{or} and \texttt{not} \\
-% Name.Builtin & the predefined functions of Python \\
-% Name.Function & the name of the functions defined by the user, at the point of
-% their definition (that is to say after the keyword |def|) \\
-% Name.Decorator & the decorators (instructions beginning by \verb|@|) \\
-% Name.Namespace & the name of the modules (= external libraries) \\
-% Name.Class & the name of the classes at the point of their definition (that is
-% to say after the keyword |class|) \\
-% Exception & the names of the exceptions (eg: \texttt{SyntaxError}) \\
-% Comment & the comments beginning with \verb|#| \\
-% Comment.LaTeX & the comments beginning by \verb|#>|, which are composed in LaTeX by
-% \pkg{piton} (and simply called ``LaTeX comments'' in this document) \\
-% Keyword.Constant & |True|, |False| and |None| \\
-% Keyword & the following keywords :
-% \ttfamily as, assert, break, case, continue, def, del,
-% elif, else, except, exec, finally, for, from,
-% global, if, import, lambda, non local,
-% pass, raise, return, try, while,
-% with, yield, yield from.\\
-% \bottomrule
-% \end{tabular}
-% \end{table}
-%
-%
-%
-%
-% \subsection{Creation of new environments}
-%
-% \label{NewPitonEnvironment}
-%
-% Since the environment |{Piton}| has to catch its body in a special way (more
-% or less as verbatim text), it's not possible to construct new environments
-% directly over the environment |{Piton}| with the classical commands
-% |\newenvironment| or |\NewDocumentEnvironment|.
-%
-% That's why \pkg{piton} provides a command |\NewPitonEnvironment|. That
-% command takes in three mandatory arguments.
-
-% That command has the same syntax as the classical environment
-% |\NewDocumentEnvironment|.
-%
-% \bigskip
-% With the following instruction, a new environment |{Python}| will be
-% constructed with the same behaviour as |{Piton}|:
-%
-% {\color{gray}\verb|\NewPitonEnvironment{Python}{}{}{}|}
-%
-% \bigskip
-% If one wishes an environment |{Python}| with takes in as optional argument
-% (between square brackets) the keys of the command |\PitonOptions|, it's
-% possible to program as follows:
-%
-% {\color{gray}\verb|\NewPitonEnvironment{Python}{O{}}{\PitonOptions{#1}}{}|}
-%
-% \bigskip
-% If one wishes to format Python code in a box of \pkg{tcolorbox}, it's possible
-% to define an environment |{Python}| with the following code (of course, the
-% package \pkg{tcolorbox} must be loaded).
-%
-%\begin{verbatim}
-% \NewPitonEnvironment{Python}{}
-% {\begin{tcolorbox}}
-% {\end{tcolorbox}}
-% \end{verbatim}
-%
-% \bigskip
-% With this new environment |{Python}|, it's possible to write:
-%
-% \begin{Verbatim}
-% ~emphase#\begin{Python}@
-% def square(x):
-% """Compute the square of a number"""
-% return x*x
-% ~emphase#\end{Python}@
-% \end{Verbatim}
-%
-% \NewPitonEnvironment{Python}{}
-% {\begin{tcolorbox}}
-% {\end{tcolorbox}}
-%
-% \begin{Python}
-% def square(x):
-% """Compute the square of a number"""
-% return x*x
-% \end{Python}
-%
-%
-% \section{Advanced features}
-%
-% \subsection{Highlighting some identifiers}
-%
-% \colorbox{yellow!50}{\textbf{New 1.4}} It's possible to require a changement
-% of formating for some identifiers with the key |identifiers| of
-% |\PitonOptions|.
-%
-% \smallskip
-% That key takes in as argument a value of the following format:
-%
-% \quad |{ names = |\textsl{\ttfamily names}|, style = |\textsl{\ttfamily
-% instructions}| }|
-%
-% \begin{itemize}
-% \item \textsl{\ttfamily names} is a (comma-separated) list of identifiers
-% names;
-%
-% \item \textsl{\ttfamily instructions} is a list of LaTeX instructions of the
-% same type that \pkg{piton} ``styles'' previously presented (cf~\ref{styles}
-% p.~\pageref{styles}).
-% \end{itemize}
-%
-% \emph{Caution}: Only the identifiers may be concerned by that key. The
-% keywords and the built-in functions won't be affected, even if their name is
-% in the list |\textsl{\ttfamily names}|.
-%
-% \begin{Verbatim}
-% \PitonOptions
-% {
-% ~emphase#identifiers@ =
-% {
-% ~emphase#names@ = { l1 , l2 } ,
-% ~emphase#style@ = \color{red}
-% }
-% }
-%
-% \begin{Piton}
-% def tri(l):
-% """Segmentation sort"""
-% if len(l) <= 1:
-% return l
-% else:
-% a = l[0]
-% l1 = [ x for x in l[1:] if x < a ]
-% l2 = [ x for x in l[1:] if x >= a ]
-% return tri(l1) + [a] + tri(l2)
-% \end{Piton}
-% \end{Verbatim}
-%
-%
-% \bigskip
-%
-% \begingroup
-%
-% \PitonOptions
-% {
-% identifiers =
-% {
-% names = { l1 , l2 } ,
-% style = \color{red}
-% }
-% }
-%
-% \begin{Piton}
-% def tri(l):
-% """Segmentation sort"""
-% if len(l) <= 1:
-% return l
-% else:
-% a = l[0]
-% l1 = [ x for x in l[1:] if x < a ]
-% l2 = [ x for x in l[1:] if x >= a ]
-% return tri(l1) + [a] + tri(l2)
-% \end{Piton}
-%
-% \endgroup
-%
-% \bigskip
-% By using the key |identifier|, it's possible to add other built-in functions
-% (or other new keywords, etc.) that will be detected by \pkg{piton}.
-%
-%
-% \begin{Verbatim}
-% \PitonOptions
-% {
-% ~emphase#identifiers@ =
-% {
-% names = { cos, sin, tan, floor, ceil, trunc, pow, exp, ln, factorial } ,
-% style = \PitonStyle{Name.Builtin}
-% }
-% }
-%
-% \begin{Piton}
-% from math import *
-% cos(pi/2)
-% factorial(5)
-% ceil(-2.3)
-% floor(5.4)
-% \end{Piton}
-% \end{Verbatim}
-%
-% \begingroup
-%
-% \PitonOptions
-% {
-% identifiers =
-% {
-% names = { cos, sin, tan, floor, ceil, trunc, pow, exp, ln, factorial } ,
-% style = \PitonStyle{Name.Builtin}
-% }
-% }
-%
-% \begin{Piton}
-% from math import *
-% cos(pi/2)
-% factorial(5)
-% ceil(-2.3)
-% floor(5.4)
-% \end{Piton}
-%
-%
-% \endgroup
-%
-%
-% \subsection{Mechanisms to escape to LaTeX}
-%
-% The package \pkg{piton} provides several mechanisms for escaping to LaTeX:
-% \begin{itemize}
-% \item It's possible to compose comments entirely in LaTeX.
-% \item It's possible to have the elements between \texttt{\$} in the comments
-% composed in LateX mathematical mode.
-% \item It's also possible to insert LaTeX code almost everywhere in a Python listing.
-% \end{itemize}
-%
-% One should aslo remark that, when the extension \pkg{piton} is used with the
-% class \cls{beamer}, \pkg{piton} detects in |{Piton}| many commands and
-% environments of Beamer: cf. \ref{beamer} p.~\pageref{beamer}.
-%
-% \subsubsection{The ``LaTeX comments''}
-%
-% In this document, we call ``LaTeX comments'' the comments which begins by
-% |#>|. The code following those characters, until the end of the line, will be
-% composed as standard LaTeX code. There is two tools to customize those
-% comments.
-%
-% \begin{itemize}
-% \item It's possible to change the syntatic mark (which, by default, is |#>|).
-% For this purpose, there is a key |comment-latex| available at load-time (that
-% is to say at the |\usepackage|) which allows to choice the characters which,
-% preceded by |#|, will be the syntatic marker.
-%
-% For example, with the following loading:
-%
-% \quad \verb|\usepackage[comment-latex = LaTeX]{piton}|
-%
-% the LaTeX comments will begin by |#LaTeX|.
-%
-% If the key |comment-latex| is used with the empty value, all the Python
-% comments (which begins by |#|) will, in fact, be ``LaTeX comments''.
-%
-% \smallskip
-% \item It's possible to change the formatting of the LaTeX comment itself by
-% changing the \pkg{piton} style |Comment.LaTeX|.
-%
-% For example, with |\SetPitonStyle{Comment.LaTeX = \normalfont\color{blue}}|,
-% the LaTeX comments will be composed in blue.
-%
-% If you want to have a character |#| at the beginning of the LaTeX comment in
-% the \textsc{pdf}, you can use set |Comment.LaTeX| as follows:
-%
-% \begin{Verbatim}
-% \SetPitonStyle{Comment.LaTeX = \color{gray}\~#\normalfont\space }
-% \end{Verbatim}
-%
-% For other examples of customization of the LaTeX comments, see the part
-% \ref{example-comments} p.~\pageref{example-comments}
-% \end{itemize}
-%
-% \bigskip
-% If the user has required line numbers in the left margin (with the
-% key |line-numbers| or the key |all-line-numbers| of |\PitonOptions|), it's
-% possible to refer to a number of line with the command |\label| used in a
-% LaTeX comment.\footnote{That feature is implemented by using a redefinition of
-% the standard command \texttt{\textbackslash label} in the environments
-% \texttt{\{Piton\}}. Therefore, incompatibilities may occur with extensions
-% which redefine (globally) that command \texttt{\textbackslash label} (for
-% example: \pkg{varioref}, \pkg{refcheck}, \pkg{showlabels}, etc.)}
-%
-% \subsubsection{The key ``math-comments''}
-%
-% It's possible to request that, in the standard Python comments (that is to say
-% those beginning by |#| and not |#>|), the elements between \texttt{\$} be
-% composed in LaTeX mathematical mode (the other elements of the comment being
-% composed verbatim).
-%
-% That feature is activated by the key |math-comments| at load-time (that is to
-% say with the |\usepackage|).
-%
-% \medskip
-% In the following example, we assume that the key |math-comments| has been used
-% when loading \pkg{piton}.
-%
-% \begin{Verbatim}
-% \begin{Piton}
-% def square(x):
-% return x*x ~# compute $x^2$
-% \end{Piton}
-% \end{Verbatim}
-%
-% \begin{Piton}
-% def square(x):
-% return x*x # compute $x^2$
-% \end{Piton}
-%
-% \subsubsection{The mechanism ``escape-inside''}
-%
-% It's also possible to overwrite the Python listings to insert LaTeX code
-% almost everywhere (but between lexical units, of course). By default,
-% \pkg{piton} does not fix any character for that kind of escape.
-%
-% In order to use this mechanism, it's necessary to specify two characters which
-% will delimit the escape (one for the beginning and one for the end) by using
-% the key |escape-inside| at load-time (that is to say at the
-% |\begin{docuemnt}|).
-%
-% \medskip
-% In the following example, we assume that the extension \pkg{piton} has been
-% loaded by the following instruction.
-%
-% \begin{Verbatim}
-% \usepackage[~emphase#escape-inside=$$@]{piton}
-% \end{Verbatim}
-%
-% \medskip
-% In the following code, which is a recursive programmation of the mathematical
-% factorial, we decide to highlight in yellow the instruction which contains the
-% recursive call. That example uses the command |\highLight| of \pkg{lua-ul}
-% (that package requires itself the package \pkg{luacolor}).
-% \begin{Verbatim}
-% \begin{Piton}
-% def fact(n):
-% if n==0:
-% return 1
-% else:
-% ~emphase#$\highLight{$@return n*fact(n-1)~emphase#$}$@
-% \end{Piton}
-% \end{Verbatim}
-%
-% \begin{Piton}
-% def fact(n):
-% if n==0:
-% return 1
-% else:
-% $\highLight{$return n*fact(n-1)$}$
-% \end{Piton}
-%
-% \bigskip
-% In fact, in that case, it's probably easier to use the command |\@highLight|
-% of \pkg{lua-ul}: that command sets a yellow background until the end of the
-% current TeX group. Since the name of that command contains the character |@|,
-% it's necessary to define a synonym without |@| in order to be able to use it
-% directly in |{Piton}|.
-% \begingroup
-% \fvset{commandchars=\~\#\+,formatcom=\color{gray}}
-% \begin{Verbatim}
-% \makeatletter
-% ~emphase#\let\Yellow\@highLight+
-% \makeatother
-% \end{Verbatim}
-% \endgroup
-%
-% \begin{Verbatim}
-% \begin{Piton}
-% def fact(n):
-% if n==0:
-% return 1
-% else:
-% ~emphase#$\Yellow$@return n*fact(n-1)
-% \end{Piton}
-% \end{Verbatim}
-%
-% \makeatletter
-% \let\Yellow\@highLight
-% \makeatother
-%
-%
-% \begin{Piton}
-% def fact(n):
-% if n==0:
-% return 1
-% else:
-% $\Yellow$return n*fact(n-1)
-% \end{Piton}
-%
-%
-%
-% \bigskip
-% \emph{Caution} : The escape to LaTeX allowed by the characters of
-% |escape-inside| is not active in the strings nor in the Python comments
-% (however, it's possible to have a whole Python comment composed in LaTeX by
-% beginning it with |#>|; such comments are merely called ``LaTeX comments'' in
-% this document).
-%
-%
-% \subsection{Behaviour in the class Beamer}
-%
-% \label{beamer}
-%
-% \emph{First remark}\par\nobreak
-% Since the environment |{Piton}| catches its body with a verbatim mode,
-% it's necessary to use the environments |{Piton}| within environments |{frame}|
-% of Beamer protected by the key |fragile|.\footnote{Remind that for an
-% environment \texttt{\{frame\}} of Beamer using the key |fragile|, the
-% instruction \texttt{\textbackslash end\{frame\}} must be alone on a single
-% line (except for any leading whitespace).}
-%
-%
-% \bigskip
-% When the package \pkg{piton} is used within the class
-% \cls{beamer}\footnote{The extension \pkg{piton} detects the class \cls{beamer}
-% but, if needed, it's also possible to activate that mechanism with the key
-% |beamer| provided by \pkg{piton} at load-time: |\textbackslash
-% usepackage[beamer]\{piton\}|}, the behaviour of \pkg{piton} is slightly
-% modified, as described now.
-%
-% \subsubsection{\{Piton\} et \textbackslash PitonInputFile are
-% ``overlay-aware''}
-%
-% When \pkg{piton} is used in the class \cls{beamer}, the environment |{Piton}|
-% and the command |\PitonInputFile| accept the optional argument |<...>| of
-% Beamer for the overlays which are involved.
-%
-% For example, it's possible to write:
-%
-% \begin{Verbatim}
-% \begin{Piton}~emphase#<2-5>@
-% ...
-% \end{Piton}
-% \end{Verbatim}
-%
-% and
-%
-% \begin{Verbatim}
-% \PitonInputFile~emphase#<2-5>@{my_file.py}
-% \end{Verbatim}
-%
-% \subsubsection{Commands of Beamer allowed in \{Piton\} and \textbackslash PitonInputFile}
-%
-% When \pkg{piton} is used in the class \cls{beamer} , the following commands of
-% \cls{beamer} (classified upon their number of arguments) are automatically
-% detected in the environments |{Piton}| (and in the listings processed by
-% |\PitonInputFile|):
-% \begin{itemize}
-% \item no mandatory argument : |\pause|\footnote{One should remark that it's
-% also possible to use the command \texttt{\textbackslash pause} in a ``LaTeX
-% comment'', that is to say by writing \texttt{\#> \textbackslash pause}. By
-% this way, if the Python code is copied, it's still executable by Python}. ;
-% \item one mandatory argument : |\action|, |\alert|, |\invisible|, |\only|, |\uncover| and |\visible| ;
-% \item two mandatory arguments : |\alt| ;
-% \item three mandatory arguments : |\temporal|.
-% \end{itemize}
-
-% \medskip
-% In the mandatory arguments of these commands, the braces must be balanced.
-% However, the braces included in short strings\footnote{The short strings of
-% Python are the strings delimited by characters \texttt{'} or the characters
-% \texttt{"} and not \texttt{'''} nor \texttt{"""}. In Python, the short strings
-% can't extend on several lines.} of Python are not considered.
-%
-% \medskip
-% Here is a complete example of file:
-%
-% \begin{Verbatim}[formatcom = \small\color{gray}]
-% \documentclass{beamer}
-% \usepackage{piton}
-% \begin{document}
-% \begin{frame}[fragile]
-% \begin{Piton}
-% def string_of_list(l):
-% """Convert a list of numbers in string"""
-% ~emphase# \only<2->{s = "{" + str(l[0])}@
-% ~emphase# \only<3->{for x in l[1:]: s = s + "," + str(x)}@
-% ~emphase# \only<4->{s = s + "}"}@
-% return s
-% \end{Piton}
-% \end{frame}
-% \end{document}
-% \end{Verbatim}
-%
-% In the previous example, the braces in the Python strings |"{"| and |"}"| are
-% correctly interpreted (without any escape character).
-%
-%
-%
-%
-% \bigskip
-% \subsubsection{Environments of Beamer allowed in \{Piton\} and \textbackslash PitonInputFile}
-%
-% When \pkg{piton} is used in the class \pkg{beamer}, the following environments
-% of Beamer are directly detected in the environments |{Piton}| (and in the
-% listings processed by |\PitonInputFile|): |{actionenv}|, |{alertenv}|,
-% |{invisibleenv}|, |{onlyenv}|, |{uncoverenv}| and |{visibleenv}|.
-%
-% However, there is a restriction: these environments must contain only \emph{whole
-% lines of Python code} in their body.
-%
-%\medskip
-% Here is an example:
-%
-% \begin{Verbatim}[formatcom = \small\color{gray}]
-% \documentclass{beamer}
-% \usepackage{piton}
-% \begin{document}
-% \begin{frame}[fragile]
-% \begin{Piton}
-% def square(x):
-% """Compure the square of its argument"""
-% ~emphase#\begin{uncoverenv}<2>@
-% return x*x
-% ~emphase#\end{uncoverenv}@
-% \end{Piton}
-% \end{frame}
-% \end{document}
-% \end{Verbatim}
-%
-%
-% \vspace{1cm}
-% \textbf{Remark concerning the command \textbackslash alert and the environment
-% \{alertenv\} of Beamer}\par\nobreak
-%
-% \smallskip
-% Beamer provides an easy way to change the color used by the environment
-% |{alertenv}| (and by the command |\alert| which relies upon it) to highlight
-% its argument. Here is an example:
-%
-% \begin{Verbatim}
-% \setbeamercolor{~emphase#alerted text@}{fg=blue}
-% \end{Verbatim}
-%
-% However, when used inside an environment |{Piton}|, such tuning will probably
-% not be the best choice because \pkg{piton} will, by design, change (most of
-% the time) the color the different elements of text. One may prefer an environment
-% |{alertenv}| that will change the background color for the elements to be
-% hightlighted.
-%
-% \smallskip
-% Here is a code that will do that job and add a yellow background. That code
-% uses the command |\@highLight| of \pkg{lua-ul} (that extension requires also
-% the package \pkg{luacolor}).
-%
-% \begingroup
-% \fvset{commandchars=\~\#\+,formatcom=\color{gray}}
-% \begin{Verbatim}
-% \setbeamercolor{alerted text}{bg=yellow!50}
-% \makeatletter
-% \AddToHook{env/Piton/begin}
-% {\renewenvironment<>{alertenv}{\only~#1{~emphase#\@highLight+[alerted text.bg]}}{}}
-% \makeatother
-% \end{Verbatim}
-% \endgroup
-%
-% That code redefines locally the environment |{alertenv}| within the
-% environments |{Piton}| (we recall that the command |\alert| relies upon that
-% environment |{alertenv}|).
-%
-% \subsection{Page breaks and line breaks}
-%
-% \label{breakable}
-%
-% \subsubsection{Page breaks}
-%
-% By default, the listings produced by the environment |{Piton}| and the command
-% |\PitonInputFile| are not breakable.
-%
-% However, the command |\PitonOptions| provides the key |splittable| to allow such
-% breaks.
-%
-% \begin{itemize}
-% \item If the key |splittable| is used without any value, the listings are
-% breakable everywhere.
-% \item If the key |splittable| is used with a numeric value~$n$ (which must be
-% a non-negative integer number), the listings are breakable but no break will
-% occur within the first $n$ lines and within the last $n$ lines. Therefore,
-% |splittable=1| is equivalent to |splittable|.
-% \end{itemize}
-%
-% \medskip
-% Even with a background color (set by the key |background-color|), the pages
-% breaks are allowed, as soon as the key |splittable| is in force.\footnote{With
-% the key |splittable|, the environments \texttt{\{Piton\}} are breakable, even
-% within a (breakable) environment of \pkg{tcolorbox}. Remind that an
-% environment of \pkg{tcolorbox} included in another environment of
-% \pkg{tcolorbox} is \emph{not} breakable, even when both environments use the
-% key |breakable| of \pkg{tcolorbox}.}
-%
-% \subsubsection{Line breaks}
-%
-% \label{line-breaks}
-%
-% By default, the elements produced by \pkg{piton} can't be broken by an end on
-% line. However, there are keys to allow such breaks (the possible breaking
-% points are the spaces, even the spaces in the Python strings).
-% \begin{itemize}
-% \item With the key |break-lines-in-piton|, the line breaks are allowed in the
-% command |\piton{...}| (but not in the command \verb+\piton|...|+, that is to say
-% the command |\piton| in verbatim mode).
-% \item With the key |break-lines-in-Piton|, the line breaks are allowed in the
-% environment |{Piton}| (hence the capital letter |P| in the name) and in the
-% listings produced by |\PitonInputFile|.
-% \item The key |break-lines| is a conjonction of the two previous keys.
-% \end{itemize}
-%
-% \bigskip
-% The package \pkg{piton} provides also several keys to control the appearance
-% on the line breaks allowed by |break-lines-in-Piton|.
-%
-% \begin{itemize}
-% \item With the key |indent-broken-lines|, the indentation of a broken line is
-% respected at carriage return.
-%
-% \item The key |end-of-broken-line| corresponds to the symbol placed at the end
-% of a broken line. The initial value is: |\hspace*{0.5em}\textbackslash|.
-%
-% \item The key |continuation-symbol| corresponds to the symbol placed at each
-% carriage return. The initial value is: |+\;|.
-%
-% \item The key |continuation-symbol-on-indentation| coresponds to the symbol
-% placed at each carriage return, on the position of the indentation (only when
-% the key |indent-broken-line| is in force). The initial value is:
-% |$\hookrightarrow\;$|.
-% \end{itemize}
-%
-%
-% \bigskip
-% The following code has been composed in a standard LaTeX |{minipage}| of width
-% 12~cm with the following tuning:
-%
-% \begin{Verbatim}
-% \PitonOptions{break-lines,indent-broken-lines,background-color=gray!15}
-% \end{Verbatim}
-%
-% \begin{center}
-% \PitonOptions{break-lines,indent-broken-lines,background-color=gray!15}
-% \begin{minipage}{12cm}
-% \begin{Piton}
-% def dict_of_list(l):
-% """Converts a list of subrs and descriptions of glyphs in a dictionary"""
-% our_dict = {}
-% for list_letter in l:
-% if (list_letter[0][0:3] == 'dup'): # if it's a subr
-% name = list_letter[0][4:-3]
-% print("We treat the subr of number " + name)
-% else:
-% name = list_letter[0][1:-3] # if it's a glyph
-% print("We treat the glyph of number " + name)
-% our_dict[name] = [treat_Postscript_line(k) for k in list_letter[1:-1]]
-% return dict
-% \end{Piton}
-% \end{minipage}
-% \end{center}
-%
-% \subsection{Footnotes in the environments of piton}
-%
-% \label{footnote}
-% If you want to put footnotes in an environment |{Piton}| or
-% (or, more unlikely, in a listing produced by |\PitonInputFile|), you can use a
-% pair |\footnotemark|--|\footnotetext|.
-%
-% \smallskip
-% However, it's also possible to extract the footnotes with the help of the
-% package \pkg{footnote} or the package \pkg{footnotehyper}.
-%
-% \smallskip
-% If \pkg{piton} is loaded with the option |footnote| (with
-% |\usepackage[footnote]{piton}| or with |\PassOptionsToPackage|), the
-% package \pkg{footnote} is loaded (if it is not yet loaded) and it is used to
-% extract the footnotes.
-%
-% \smallskip
-% If \pkg{piton} is loaded with the option |footnotehyper|, the package
-% \pkg{footnotehyper} is loaded (if it is not yet loaded) ant it is used to
-% extract footnotes.
-%
-% \smallskip
-% Caution: The packages \pkg{footnote} and \pkg{footnotehyper} are incompatible.
-% The package \pkg{footnotehyper} is the successor of the package \pkg{footnote}
-% and should be used preferently. The package \pkg{footnote} has some drawbacks,
-% in particular: it must be loaded after the package \pkg{xcolor} and it is not
-% perfectly compatible with \pkg{hyperref}.
-%
-% \medskip
-% In this document, the package \pkg{piton} has been loaded with the
-% option |footnotehyper|. For examples of notes, cf. \ref{notes-examples},
-% p.~\pageref{notes-examples}.
-%
-% \subsection{Tabulations}
-%
-% \smallskip
-% Even though it's recommended to indent the Python listings with spaces (see
-% PEP~8), \pkg{piton} accepts the characters of tabulation (that is to say the
-% characters U+0009) at the beginning of the lines. Each character U+0009 is
-% replaced by $n$~spaces. The initial value of $n$ is $4$ but it's possible to
-% change it with the key |tab-size| of |\PitonOptions|.
-%
-% \smallskip
-% There exists also a key |tabs-auto-gobble| which computes the minimal value
-% $n$ of the number of consecutive characters U+0009 beginning each (non empty)
-% line of the environment |{Piton}| and applies |gobble| with that value of~$n$
-% (before replacement of the tabulations by spaces, of course). Hence, that key
-% is similar to the key |auto-gobble| but acts on U+0009 instead of U+0020
-% (spaces).
-%
-% \section{Examples}
-%
-% \subsection{Line numbering}
-%
-% \label{example-numbering}
-%
-% We remind that it's possible to have an automatic numbering of the lines in
-% the Python listings by using the key |line-numbers| or the key |all-line-numbers|.
-%
-% By default, the numbers of the lines are composed by \pkg{piton} in an
-% overlapping position on the left (by using internally the command |\llap| of LaTeX).
-%
-% In order to avoid that overlapping, it's possible to use the option |left-margin=auto|
-% which will insert automatically a margin adapted to the numbers of lines that
-% will be written (that margin is larger when the numbers are greater than~10).
-%
-%
-% \begingroup
-% \fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
-% \begin{Verbatim}
-% ~emphase&\PitonOptions{background-color=gray!10, left-margin = auto, line-numbers}@
-% \begin{Piton}
-% def arctan(x,n=10):
-% if x < 0:
-% return -arctan(-x) #> (appel récursif)
-% elif x > 1:
-% return pi/2 - arctan(1/x) #> (autre appel récursif)
-% else:
-% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-% \end{Piton}
-% \end{Verbatim}
-% \endgroup
-%
-%
-%
-% \begingroup
-% \PitonOptions{background-color=gray!10,left-margin = auto, line-numbers}
-% \begin{Piton}
-% def arctan(x,n=10):
-% if x < 0:
-% return -arctan(-x) #> (appel récursif)
-% elif x > 1:
-% return pi/2 - arctan(1/x) #> (autre appel récursif)
-% else:
-% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-% \end{Piton}
-% \endgroup
-%
-%
-%
-% \bigskip
-% \subsection{Formatting of the LaTeX comments}
-%
-% \label{example-comments}
-%
-% It's possible to modify the style |Comment.LaTeX| (with |\SetPitonStyle|) in
-% order to display the LaTeX comments (which begin with |#>|) aligned on the
-% right margin.
-%
-%
-% \begingroup
-% \fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
-% \begin{Verbatim}
-% \PitonOptions{background-color=gray!10}
-% ~emphase&\SetPitonStyle{Comment.LaTeX = \hfill \normalfont\color{gray}}@
-% \begin{Piton}
-% def arctan(x,n=10):
-% if x < 0:
-% return -arctan(-x) #> appel récursif
-% elif x > 1:
-% return pi/2 - arctan(1/x) #> autre appel récursif
-% else:
-% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-% \end{Piton}
-% \end{Verbatim}
-% \endgroup
-%
-% \begingroup
-% \PitonOptions{background-color=gray!10}
-% \SetPitonStyle{Comment.LaTeX = \hfill \normalfont\color{gray}}
-% \begin{Piton}
-% def arctan(x,n=10):
-% if x < 0:
-% return -arctan(-x) #> appel récursif
-% elif x > 1:
-% return pi/2 - arctan(1/x) #> autre appel récursif
-% else:
-% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-% \end{Piton}
-% \endgroup
-%
-%
-% \vspace{1cm}
-% It's also possible to display these LaTeX comments in a kind of second column
-% by limiting the width of the Python code by an environment |{minipage}| of LaTeX.
-%
-%
-% \begingroup
-% \fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
-% \begin{Verbatim}
-% \PitonOptions{background-color=gray!10}
-% ~emphase&\NewDocumentCommand{\MyLaTeXCommand}{m}{\hfill \normalfont\itshape\rlap{\quad #1}}@
-% ~emphase&\SetPitonStyle{Comment.LaTeX = \MyLaTeXCommand}@
-% ~emphase&\begin{minipage}{12cm}@
-% \begin{Piton}
-% def arctan(x,n=10):
-% if x < 0:
-% return -arctan(-x) #> appel récursif
-% elif x > 1:
-% return pi/2 - arctan(1/x) #> autre appel récursif
-% else:
-% s = 0
-% for k in range(n):
-% s += (-1)**k/(2*k+1)*x**(2*k+1)
-% return s
-% \end{Piton}
-% ~emphase&\end{minipage}@
-% \end{Verbatim}
-% \endgroup
-%
-%
-%
-% \begingroup
-% \PitonOptions{background-color=gray!10}
-% \NewDocumentCommand{\MyLaTeXCommand}{m}{\hfill \normalfont\itshape\rlap{\quad #1}}
-% \SetPitonStyle{Comment.LaTeX = \MyLaTeXCommand}
-% \begin{minipage}{12cm}
-% \begin{Piton}
-% def arctan(x,n=10):
-% if x < 0:
-% return -arctan(-x) #> appel récursif
-% elif x > 1:
-% return pi/2 - arctan(1/x) #> autre appel récursif
-% else:
-% s = 0
-% for k in range(n):
-% s += (-1)**k/(2*k+1)*x**(2*k+1)
-% return s
-% \end{Piton}
-% \end{minipage}
-% \endgroup
-%
-%
-% \bigskip
-% \subsection{Notes in the listings}
-%
-% \label{notes-examples}
-%
-% In order to be able to extract the notes (which are typeset with the command
-% |\footnote|), the extension \pkg{piton} must be loaded with the key |footnote|
-% or the key |footenotehyper| as explained in the section \ref{footnote}
-% p.~\pageref{footnote}. In this document, the extension \pkg{piton} has been
-% loaded with the key |footnotehyper|.
-%
-% Of course, in an environment |{Piton}|, a command |\footnote| may appear only
-% within a LaTeX comment (which begins with |#>|). It's possible to have comments
-% which contain only that command |\footnote|. That's the case in the following example.
-%
-%
-%
-% \begingroup
-% \fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
-% \begin{Verbatim}
-% \PitonOptions{background-color=gray!10}
-% \begin{Piton}
-% def arctan(x,n=10):
-% if x < 0:
-% return -arctan(-x)~emphase&#>\footnote{First recursive call.}]@
-% elif x > 1:
-% return pi/2 - arctan(1/x)~emphase&#>\footnote{Second recursive call.}@
-% else:
-% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-% \end{Piton}
-% \end{Verbatim}
-% \endgroup
-%
-% \begingroup
-% \PitonOptions{background-color=gray!10}
-% \begin{Piton}
-% def arctan(x,n=10):
-% if x < 0:
-% return -arctan(-x)#>\footnote{First recursive call.}
-% elif x > 1:
-% return pi/2 - arctan(1/x)#>\footnote{Second recursive call.}
-% else:
-% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-% \end{Piton}
-% \endgroup
-%
-%
-% \vspace{1cm}
-%
-% If an environment |{Piton}| is used in an environment |{minipage}| of LaTeX,
-% the notes are composed, of course, at the foot of the environment
-% |{minipage}|. Recall that such |{minipage}| can't be broken by a page break.
-%
-%
-% \begingroup
-% \fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
-% \begin{Verbatim}
-% \PitonOptions{background-color=gray!10}
-% \emphase\begin{minipage}{\linewidth}
-% \begin{Piton}
-% def arctan(x,n=10):
-% if x < 0:
-% return -arctan(-x)~emphase&#>\footnote{First recursive call.}@
-% elif x > 1:
-% return pi/2 - arctan(1/x)~emphase&#>\footnote{Second recursive call.}@
-% else:
-% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-% \end{Piton}
-% \end{minipage}
-% \end{Verbatim}
-% \endgroup
-%
-% \begingroup
-% \PitonOptions{background-color=gray!10}
-% \begin{minipage}{\linewidth}
-% \begin{Piton}
-% def arctan(x,n=10):
-% if x < 0:
-% return -arctan(-x)#>\footnote{First recursive call.}
-% elif x > 1:
-% return pi/2 - arctan(1/x)#>\footnote{Second recursive call.}
-% else:
-% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-% \end{Piton}
-% \end{minipage}
-% \endgroup
-%
-%
-% \vspace{1cm}
-% If we embed an environment |{Piton}| in an environment |{minipage}|
-% (typically in order to limit the width of a colored background), it's
-% necessary to embed the whole environment |{minipage}| in an environment
-% |{savenotes}| (of \pkg{footnote} or \pkg{footnotehyper}) in order to have the
-% footnotes composed at the bottom of the page.
-%
-% \begingroup
-% \fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
-% \begin{Verbatim}
-% \PitonOptions{background-color=gray!10}
-% ~emphase&\begin{savenotes}@
-% \begin{minipage}{13cm}
-% \begin{Piton}
-% def arctan(x,n=10):
-% if x < 0:
-% return -arctan(-x)~emphase&#>\footnote{First recursive call.}@
-% elif x > 1:
-% return pi/2 - arctan(1/x)~emphase&#>\footnote{Second recursive call.}@
-% else:
-% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-% \end{Piton}
-% \end{minipage}
-% ~emphase&\end{savenotes}@
-% \end{Verbatim}
-% \endgroup
-%
-%
-%
-% \begin{savenotes}
-% \PitonOptions{background-color=gray!10}
-% \begin{minipage}{13cm}
-% \begin{Piton}
-% def arctan(x,n=10):
-% if x < 0:
-% return -arctan(-x)#>\footnote{First recursive call.}
-% elif x > 1:
-% return pi/2 - arctan(1/x)#>\footnote{Second recursive call.}
-% else:
-% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-% \end{Piton}
-% \end{minipage}
-% \end{savenotes}
-%
-% \bigskip
-%
-% \subsection{An example of tuning of the styles}
-%
-% The graphical styles have been presented in the section \ref{styles},
-% p.~\pageref{styles}.
-%
-% \smallskip
-% We present now an example of tuning of these styles adapted to the documents
-% in black and white. We use the font \emph{DejaVu Sans Mono}\footnote{See:
-% \url{https://dejavu-fonts.github.io}} specified by the command |\setmonofont| of
-% \pkg{fontspec}.
-%
-% That tuning uses the command |\highLight| of \pkg{lua-ul} (that package
-% requires itself the package \pkg{luacolor}).
-%
-% \begin{Verbatim}
-% \setmonofont[Scale=0.85]{DejaVu Sans Mono}
-%
-% \SetPitonStyle
-% {
-% Number = ,
-% String = \itshape ,
-% String.Doc = \color{gray} \slshape ,
-% Operator = ,
-% Operator.Word = \bfseries ,
-% Name.Builtin = ,
-% Name.Function = \bfseries \highLight[gray!20] ,
-% Comment = \color{gray} ,
-% Comment.LaTeX = \normalfont \color{gray},
-% Keyword = \bfseries ,
-% Name.Namespace = ,
-% Name.Class = ,
-% Name.Type = ,
-% InitialValues = \color{gray}
-% }
-% \end{Verbatim}
-%
-%
-% \begingroup
-%
-% \setmonofont[Scale=0.85]{DejaVu Sans Mono}
-%
-% \PitonOptions{splittable}
-%
-% \SetPitonStyle
-% {
-% Number = ,
-% String = \itshape ,
-% String.Doc = \color{gray} \slshape ,
-% Operator.Word = \bfseries ,
-% Operator = ,
-% Name.Builtin = ,
-% Name.Function = \bfseries \highLight[gray!20] ,
-% Comment = \color{gray} ,
-% Comment.LaTeX = \normalfont \color{gray} ,
-% Keyword = \bfseries ,
-% Name.Namespace = ,
-% Name.Class = ,
-% Name.Type = ,
-% InitialValues = \color{gray}
-% }
-%
-%
-% \bigskip
-%
-% \begin{Piton}
-% from math import pi
-%
-% def arctan(x,n=10):
-% """Compute the mathematical value of arctan(x)
-%
-% n is the number of terms in the sum
-% """
-% if x < 0:
-% return -arctan(-x) # appel récursif
-% elif x > 1:
-% return pi/2 - arctan(1/x)
-% #> (we have used that $\arctan(x)+\arctan(1/x)=\pi/2$ for $x>0$)
-% else:
-% s = 0
-% for k in range(n):
-% s += (-1)**k/(2*k+1)*x**(2*k+1)
-% return s
-% \end{Piton}
-%
-% \endgroup
-%
-% \subsection{Use with pyluatex}
-%
-% The package \pkg{pyluatex} is an extension which allows the execution of some
-% Python code from |lualatex| (provided that Python is installed on the machine
-% and that the compilation is done with |lualatex| and |--shell-escape|).
-%
-% Here is, for example, an environment |{PitonExecute}| which formats a Python
-% listing (with \pkg{piton}) but display also the output of the execution of the
-% code with Python (for technical reasons, the |!| is mandatory in the signature
-% of the environment).
-%
-%
-% \begin{Verbatim}
-% \ExplSyntaxOn
-% \NewDocumentEnvironment { ~emphase#PitonExecute@ } { ! O { } } % the ! is mandatory
-% {
-% \PyLTVerbatimEnv
-% \begin{pythonq}
-% }
-% {
-% \end{pythonq}
-% \directlua
-% {
-% tex.print("\\PitonOptions{~#1}")
-% tex.print("\\begin{Piton}")
-% tex.print(pyluatex.get_last_code())
-% tex.print("\\end{Piton}")
-% tex.print("")
-% }
-% \begin{center}
-% \directlua{tex.print(pyluatex.get_last_output())}
-% \end{center}
-% }
-% \ExplSyntaxOff
-% \end{Verbatim}
-%
-% \ExplSyntaxOn
-% \NewDocumentEnvironment { PitonExecute } { ! O { } }
-% {
-% \PyLTVerbatimEnv
-% \begin{pythonq}
-% }
-% {
-% \end{pythonq}
-% \directlua
-% {
-% tex.print("\\PitonOptions{#1}")
-% tex.print("\\begin{Piton}")
-% tex.print(pyluatex.get_last_code())
-% tex.print("\\end{Piton}")
-% tex.print("")
-% }
-% \begin{center}
-% \directlua{tex.print(pyluatex.get_last_output())}
-% \end{center}
-% }
-% \ExplSyntaxOff
-%
-% This environment |{PitonExecute}| takes in as optional argument (between
-% square brackets) the options of the command |\PitonOptions|.
-%
-%
-% \bigskip
-% \clearpage
-%
-% \section{Implementation}
-%
-% \subsection{Introduction}
-%
-% The main job of the package \pkg{piton} is to take in as input a Python
-% listing and to send back to LaTeX as output that code \emph{with interlaced LaTeX
-% instructions of formatting}.
-%
-% In fact, all that job is done by a \textsc{lpeg} called |python|. That
-% \textsc{lpeg}, when matched against the string of a Python listing,
-% returns as capture a Lua table containing data to send to LaTeX.
-% The only thing to do after will be to apply |tex.tprint| to each element of
-% that table.\footnote{Recall that |tex.tprint| takes in as argument a Lua table whose
-% first component is a ``catcode table'' and the second element a string. The
-% string will be sent to LaTeX with the regime of catcodes specified by the
-% catcode table. If no catcode table is provided, the standard catcodes of LaTeX
-% will be used.}
-%
-% \bigskip
-% Consider, for example, the following Python code:
-%
-% \begin{Piton}
-% def parity(x):
-% return x%2
-% \end{Piton}
-%
-% The capture returned by the \pkg{lpeg} |python| against that code is the
-% Lua table containing the following elements :
-%
-% \bigskip
-% \begin{minipage}{\linewidth}
-% \color{gray}
-%
-% |{ "\\__piton_begin_line:" }|\footnote{Each line of the Python listings will
-% be encapsulated in a pair: \texttt{\textbackslash_@@_begin_line:} --
-% \texttt{\textbackslash@@_end_line:}. The token
-% \texttt{\textbackslash@@_end_line:} must be explicit because it will be used as
-% marker in order to delimit the argument of the command \texttt{\textbackslash
-% @@\_begin\_line:}. Both tokens \texttt{\textbackslash_@@_begin_line:} and
-% \texttt{\textbackslash@@_end_line:} will be nullified in the command
-% \texttt{\textbackslash piton} (since there can't be lines breaks in the
-% argument of a command \texttt{\textbackslash piton}).}
-%
-% \texttt{\{ "\{\textbackslash PitonStyle\{Keyword\}\{" \}}\footnote{The
-% lexical elements of Python for which we have a \pkg{piton} style will be
-% formatted via the use of the command \texttt{\textbackslash PitonStyle}.
-% Such an element is typeset in LaTeX via the syntax \texttt{\{\textbackslash
-% PitonStyle\{\textsl{style}\}\{...\}\}} because the instructions inside an \texttt{\textbackslash
-% PitonStyle} may be both semi-global declarations like
-% \texttt{\textbackslash bfseries} and commands with one argument like
-% \texttt{\textbackslash fbox}.}
-%
-% \texttt{\{
-% luatexbase.catcodetables.CatcodeTableOther\footnote{\texttt{luatexbase.catcodetables.CatcodeTableOther} is a mere number which corresponds to the ``catcode table'' whose all characters have the catcode ``other'' (which means that they will be typeset by LaTeX verbatim).}, "def" \} }
-%
-% |{ "}}" }|
-%
-% |{ luatexbase.catcodetables.CatcodeTableOther, " " }|
-%
-% |{ "{\PitonStyle{Name.Function}{" }|
-%
-% |{ luatexbase.catcodetables.CatcodeTableOther, "parity" }|
-%
-% |{ "}}" }|
-%
-% |{ luatexbase.catcodetables.CatcodeTableOther, "(" }|
-%
-% |{ luatexbase.catcodetables.CatcodeTableOther, "x" }|
-%
-% |{ luatexbase.catcodetables.CatcodeTableOther, ")" }|
-%
-% |{ luatexbase.catcodetables.CatcodeTableOther, ":" }|
-%
-% |{ "\\__piton_end_line: \\__piton_newline: \\__piton_begin_line:" }|
-%
-% |{ luatexbase.catcodetables.CatcodeTableOther, " " }|
-%
-% |{ "{\PitonStyle{Keyword}{" }|
-%
-% |{ luatexbase.catcodetables.CatcodeTableOther, "return" }|
-%
-% |{ "}}" }|
-%
-% |{ luatexbase.catcodetables.CatcodeTableOther, " " }|
-%
-% |{ luatexbase.catcodetables.CatcodeTableOther, "x" }|
-%
-% |{ "{\PitonStyle{Operator}{" }|
-%
-% |{ luatexbase.catcodetables.CatcodeTableOther, "&" }|
-%
-% |{ "}}" }|
-%
-% |{ "{\PitonStyle{Number}{" }|
-%
-% |{ luatexbase.catcodetables.CatcodeTableOther, "2" }|
-%
-% |{ "}}" }|
-%
-% |{ "\\__piton_end_line:" }|
-%
-% \end{minipage}
-%
-% \bigskip
-% We give now the LaTeX code which is sent back by Lua to TeX (we have written
-% on several lines for legibility but no character |\r| will be sent to LaTeX). The
-% characters which are greyed-out are sent to LaTeX with the catcode ``other''
-% (=12). All the others characters are sent with the regime of catcodes of L3
-% (as set by |\ExplSyntaxOn|)
-%
-%
-% \begingroup
-% \def\gbox#1{\colorbox{gray!20}{\strut #1}}
-% \setlength{\fboxsep}{1pt}
-%
-% \begin{Verbatim*}[formatcom = \color{black}]
-% \__piton_begin_line:{\PitonStyle{Keyword}{~gbox#def@}}
-% ~gbox# @{\PitonStyle{Name.Function}{~gbox#parity@}}~gbox#(x):@\__piton_end_line:\__piton_newline:
-% \__piton_begin_line:~gbox# @{\PitonStyle{Keyword}{~gbox#return@}}
-% ~gbox# x@{\PitonStyle{Operator}{~gbox#%@}}{\PitonStyle{Number}{~gbox#2@}}\__piton_end_line:
-% \end{Verbatim*}
-% \endgroup
-%
-%
-%
-%
-% \subsection{The L3 part of the implementation}
-%
-% \subsubsection{Declaration of the package}
-% \begin{macrocode}
-\NeedsTeXFormat{LaTeX2e}
-\RequirePackage{l3keys2e}
-\ProvidesExplPackage
- {piton}
- {\myfiledate}
- {\myfileversion}
- {Highlight Python codes with LPEG on LuaLaTeX}
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\msg_new:nnn { piton } { LuaLaTeX~mandatory }
- {
- LuaLaTeX~is~mandatory.\\
- The~package~'piton'~requires~the~engine~LuaLaTeX.\\
- \str_if_eq:VnT \c_sys_jobname_str { output }
- { If~you~use~Overleaf,~you~can~switch~to~LuaLaTeX~in~the~"Menu". \\}
- If~you~go~on,~the~package~'piton'~won't~be~loaded.
- }
-\sys_if_engine_luatex:F { \msg_critical:nn { piton } { LuaLaTeX~mandatory } }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\RequirePackage { luatexbase }
-% \end{macrocode}
-%
-% \bigskip
-% The boolean |\c_@@_footnotehyper_bool| will indicate if the option
-% |footnotehyper| is used.
-% \begin{macrocode}
-\bool_new:N \c_@@_footnotehyper_bool
-% \end{macrocode}
-%
-% \medskip
-% The boolean |\c_@@_footnote_bool| will indicate if the option |footnote| is
-% used, but quicky, it will also be set to |true| if the option |footnotehyper|
-% is used.
-% \begin{macrocode}
-\bool_new:N \c_@@_footnote_bool
-% \end{macrocode}
-%
-% \medskip
-% The following boolean corresponds to the key |math-comments| (only at load-time).
-% \begin{macrocode}
-\bool_new:N \c_@@_math_comments_bool
-% \end{macrocode}
-%
-% \medskip
-% The following boolean corresponds to the key |beamer|.
-% \begin{macrocode}
-\bool_new:N \c_@@_beamer_bool
-% \end{macrocode}
-%
-% \bigskip
-% We define a set of keys for the options at load-time.
-% \begin{macrocode}
-\keys_define:nn { piton / package }
- {
- footnote .bool_set:N = \c_@@_footnote_bool ,
- footnotehyper .bool_set:N = \c_@@_footnotehyper_bool ,
- escape-inside .tl_set:N = \c_@@_escape_inside_tl ,
- escape-inside .initial:n = ,
- comment-latex .code:n = { \lua_now:n { comment_latex = "#1" } } ,
- comment-latex .value_required:n = true ,
- math-comments .bool_set:N = \c_@@_math_comments_bool ,
- math-comments .default:n = true ,
- beamer .bool_set:N = \c_@@_beamer_bool ,
- beamer .default:n = true ,
- unknown .code:n = \msg_error:nn { piton } { unknown~key~for~package }
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\msg_new:nnn { piton } { unknown~key~for~package }
- {
- Unknown~key.\\
- You~have~used~the~key~'\l_keys_key_str'~but~the~only~keys~available~here~
- are~'beamer',~'comment-latex',~'escape-inside',~'footnote',~'footnotehyper'~and~
- 'math-comments'.~Other~keys~are~available~in~\token_to_str:N \PitonOptions.\\
- That~key~will~be~ignored.
- }
-% \end{macrocode}
-%
-% \bigskip
-% We process the options provided by the user at load-time.
-% \begin{macrocode}
-\ProcessKeysOptions { piton / package }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\begingroup
-\cs_new_protected:Npn \@@_set_escape_char:nn #1 #2
- {
- \lua_now:n { piton_begin_escape = "#1" }
- \lua_now:n { piton_end_escape = "#2" }
- }
-\cs_generate_variant:Nn \@@_set_escape_char:nn { x x }
-\@@_set_escape_char:xx
- { \tl_head:V \c_@@_escape_inside_tl }
- { \tl_tail:V \c_@@_escape_inside_tl }
-\endgroup
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\@ifclassloaded { beamer } { \bool_set_true:N \c_@@_beamer_bool } { }
-\bool_if:NT \c_@@_beamer_bool { \lua_now:n { piton_beamer = true } }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\hook_gput_code:nnn { begindocument } { . }
- {
- \@ifpackageloaded { xcolor }
- { }
- { \msg_fatal:nn { piton } { xcolor~not~loaded } }
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\msg_new:nnn { piton } { xcolor~not~loaded }
- {
- xcolor~not~loaded \\
- The~package~'xcolor'~is~required~by~'piton'.\\
- This~error~is~fatal.
- }
-% \end{macrocode}
-%
-%
-% \begin{macrocode}
-\msg_new:nnn { piton } { footnote~with~footnotehyper~package }
- {
- Footnote~forbidden.\\
- You~can't~use~the~option~'footnote'~because~the~package~
- footnotehyper~has~already~been~loaded.~
- If~you~want,~you~can~use~the~option~'footnotehyper'~and~the~footnotes~
- within~the~environments~of~piton~will~be~extracted~with~the~tools~
- of~the~package~footnotehyper.\\
- If~you~go~on,~the~package~footnote~won't~be~loaded.
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\msg_new:nnn { piton } { footnotehyper~with~footnote~package }
- {
- You~can't~use~the~option~'footnotehyper'~because~the~package~
- footnote~has~already~been~loaded.~
- If~you~want,~you~can~use~the~option~'footnote'~and~the~footnotes~
- within~the~environments~of~piton~will~be~extracted~with~the~tools~
- of~the~package~footnote.\\
- If~you~go~on,~the~package~footnotehyper~won't~be~loaded.
- }
-% \end{macrocode}
-%
-% \medskip
-% \begin{macrocode}
-\bool_if:NT \c_@@_footnote_bool
- {
-% \end{macrocode}
-% The class \cls{beamer} has its own system to extract footnotes and that's why
-% we have nothing to do if \cls{beamer} is used.
-% \begin{macrocode}
- \@ifclassloaded { beamer }
- { \bool_set_false:N \c_@@_footnote_bool }
- {
- \@ifpackageloaded { footnotehyper }
- { \@@_error:n { footnote~with~footnotehyper~package } }
- { \usepackage { footnote } }
- }
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\bool_if:NT \c_@@_footnotehyper_bool
- {
-% \end{macrocode}
-% The class \cls{beamer} has its own system to extract footnotes and that's why
-% we have nothing to do if \cls{beamer} is used.
-% \begin{macrocode}
- \@ifclassloaded { beamer }
- { \bool_set_false:N \c_@@_footnote_bool }
- {
- \@ifpackageloaded { footnote }
- { \@@_error:n { footnotehyper~with~footnote~package } }
- { \usepackage { footnotehyper } }
- \bool_set_true:N \c_@@_footnote_bool
- }
- }
-% \end{macrocode}
-% The flag |\c_@@_footnote_bool| is raised and so, we will only have to test
-% |\c_@@_footnote_bool| in order to know if we have to insert an environment
-% |{savenotes}|.
-%
-% \bigskip
-% \subsubsection{Parameters and technical definitions}
-%
-% The following string will contain the name of the informatic language
-% considered (the initial value is |python|).
-%
-% \begin{macrocode}
-\str_new:N \l_@@_language_str
-\str_set:Nn \l_@@_language_str { python }
-% \end{macrocode}
-%
-% We will compute (with Lua) the numbers of lines of the Python code and store
-% it in the following counter.
-% \begin{macrocode}
-\int_new:N \l_@@_nb_lines_int
-% \end{macrocode}
-%
-% The same for the number of non-empty lines of the Python codes.
-% \begin{macrocode}
-\int_new:N \l_@@_nb_non_empty_lines_int
-% \end{macrocode}
-%
-% The following counter will be used to count the lines during the composition.
-% It will count all the lines, empty or not empty. It won't be used to print the
-% numbers of the lines.
-% \begin{macrocode}
-\int_new:N \g_@@_line_int
-% \end{macrocode}
-%
-% \medskip
-% The following token list will contains the (potential) informations to write
-% on the |aux| (to be used in the next compilation).
-% \begin{macrocode}
-\tl_new:N \g_@@_aux_tl
-% \end{macrocode}
-%
-% \medskip
-% The following counter corresponds to the key |splittable| of |\PitonOptions|.
-% If the value of |\l_@@_splittable_int| is equal to $n$, then no line break can
-% occur within the first $n$~lines or the last $n$~lines of the listings.
-% \begin{macrocode}
-\int_new:N \l_@@_splittable_int
-% \end{macrocode}
-%
-% \medskip
-% An initial value of |splittable| equal to 100 is equivalent to say that the
-% environments |{Piton}| are unbreakable.
-% \begin{macrocode}
-\int_set:Nn \l_@@_splittable_int { 100 }
-% \end{macrocode}
-%
-% \medskip
-% The following string corresponds to the key |background-color| of |\PitonOptions|.
-% \begin{macrocode}
-\clist_new:N \l_@@_bg_color_clist
-% \end{macrocode}
-%
-% \medskip
-% The package \pkg{piton} will also detect the lines of code which correspond to
-% the user input in a Python console, that is to say the lines of code beginning
-% with |>>>| and |...|. It's possible, with the key |prompt-background-color|,
-% to require a background for these lines of code (and the other lines of code
-% will have the standard background color specified by |background-color|).
-% \begin{macrocode}
-\tl_new:N \l_@@_prompt_bg_color_tl
-% \end{macrocode}
-%
-% \medskip
-% We will compute the maximal width of the lines of an environment |{Piton}| in
-% |\g_@@_width_dim|. We need a global variable because, when the key |footnote|
-% is in force, each line when be composed in an environment |{savenotes}| and
-% (when |slim| is in force) we need to exit |\g_@@_width_dim| from that
-% environment.
-% \begin{macrocode}
-\dim_new:N \g_@@_width_dim
-% \end{macrocode}
-% The value of that dimension as written on the |aux| file will be stored in
-% |\l_@@_width_on_aux_dim|.
-% \begin{macrocode}
-\dim_new:N \l_@@_width_on_aux_dim
-% \end{macrocode}
-%
-% \medskip
-% We will count the environments |{Piton}| (and, in fact, also the commands
-% |\PitonInputFile|, despite the name |\g_@@_env_int|).
-% \begin{macrocode}
-\int_new:N \g_@@_env_int
-% \end{macrocode}
-%
-% \medskip
-% The following boolean corresponds to the key |show-spaces|.
-% \begin{macrocode}
-\bool_new:N \l_@@_show_spaces_bool
-% \end{macrocode}
-%
-% \medskip
-% The following booleans correspond to the keys |break-lines| and
-% |indent-broken-lines|.
-% \begin{macrocode}
-\bool_new:N \l_@@_break_lines_in_Piton_bool
-\bool_new:N \l_@@_indent_broken_lines_bool
-% \end{macrocode}
-%
-% \medskip
-% The following token list corresponds to the key |continuation-symbol|.
-% \begin{macrocode}
-\tl_new:N \l_@@_continuation_symbol_tl
-\tl_set:Nn \l_@@_continuation_symbol_tl { + }
-% \end{macrocode}
-%
-% \medskip
-% \begin{macrocode}
-% The following token list corresponds to the key
-% |continuation-symbol-on-indentation|. The name has been shorten to |csoi|.
-\tl_new:N \l_@@_csoi_tl
-\tl_set:Nn \l_@@_csoi_tl { $ \hookrightarrow \; $ }
-% \end{macrocode}
-%
-% \medskip
-% The following token list corresponds to the key |end-of-broken-line|.
-% \begin{macrocode}
-\tl_new:N \l_@@_end_of_broken_line_tl
-\tl_set:Nn \l_@@_end_of_broken_line_tl { \hspace*{0.5em} \textbackslash }
-% \end{macrocode}
-%
-% \medskip
-% The following boolean corresponds to the key |break-lines-in-piton|.
-% \begin{macrocode}
-\bool_new:N \l_@@_break_lines_in_piton_bool
-% \end{macrocode}
-%
-% \medskip
-% The following boolean corresponds to the key |slim| of |\PitonOptions|.
-% \begin{macrocode}
-\bool_new:N \l_@@_slim_bool
-% \end{macrocode}
-%
-% \medskip
-% The following dimension corresponds to the key |left-margin| of |\PitonOptions|.
-% \begin{macrocode}
-\dim_new:N \l_@@_left_margin_dim
-% \end{macrocode}
-%
-% \medskip
-% The following boolean will be set when the key |left-margin=auto|
-% is used.
-% \begin{macrocode}
-\bool_new:N \l_@@_left_margin_auto_bool
-% \end{macrocode}
-%
-% \medskip
-% The following dimension corresponds to the key |numbers-sep| of
-% |\PitonOptions|.
-% \begin{macrocode}
-\dim_new:N \l_@@_numbers_sep_dim
-\dim_set:Nn \l_@@_numbers_sep_dim { 0.7 em }
-% \end{macrocode}
-%
-% \medskip
-% The tabulators will be replaced by the content of the following token list.
-% \begin{macrocode}
-\tl_new:N \l_@@_tab_tl
-% \end{macrocode}
-%
-% \medskip
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_set_tab_tl:n #1
- {
- \tl_clear:N \l_@@_tab_tl
- \prg_replicate:nn { #1 }
- { \tl_put_right:Nn \l_@@_tab_tl { ~ } }
- }
-\@@_set_tab_tl:n { 4 }
-% \end{macrocode}
-%
-% \medskip
-% The following integer corresponds to the key |gobble|.
-% \begin{macrocode}
-\int_new:N \l_@@_gobble_int
-% \end{macrocode}
-%
-% \medskip
-% \begin{macrocode}
-\tl_new:N \l_@@_space_tl
-\tl_set:Nn \l_@@_space_tl { ~ }
-% \end{macrocode}
-%
-%
-% \medskip
-% At each line, the following counter will count the spaces at the beginning.
-% \begin{macrocode}
-\int_new:N \g_@@_indentation_int
-% \end{macrocode}
-%
-% \medskip
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_an_indentation_space:
- { \int_gincr:N \g_@@_indentation_int }
-% \end{macrocode}
-%
-% \medskip
-% The following command |\@@_beamer_command:n| executes the argument
-% corresponding to its argument but also stores it in |\l_@@_beamer_command_str|.
-% That string is used only in the error message ``|cr~not~allowed|'' raised when
-% there is a carriage return in the mandatory argument of that command.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_beamer_command:n #1
- {
- \str_set:Nn \l_@@_beamer_command_str { #1 }
- \use:c { #1 }
- }
-% \end{macrocode}
-%
-% \bigskip
-% In the environment |{Piton}|, the command |\label| will be linked to the
-% following command.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_label:n #1
- {
- \bool_if:NTF \l_@@_line_numbers_bool
- {
- \@bsphack
- \protected@write \@auxout { }
- {
- \string \newlabel { #1 }
- {
-% \end{macrocode}
-% Remember that the content of a line is typeset in a box \emph{before} the
-% composition of the potential number of line.
-% \begin{macrocode}
- { \int_eval:n { \g_@@_visual_line_int + 1 } }
- { \thepage }
- }
- }
- \@esphack
- }
- { \msg_error:nn { piton } { label~with~lines~numbers } }
- }
-% \end{macrocode}
-%
-%
-% \bigskip
-% The following commands are a easy way to insert safely braces (|{| and |}|) in
-% the TeX flow.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_open_brace:
- { \directlua { piton.open_brace() } }
-\cs_new_protected:Npn \@@_close_brace:
- { \directlua { piton.close_brace() } }
-% \end{macrocode}
-%
-% \bigskip
-% The following token list will be evaluated at the beginning of
-% |\@@_begin_line:|... |\@@_end_line:| and cleared at the end. It will be used
-% by LPEG acting between the lines of the Python code in order to add
-% instructions to be executed at the beginning of the line.
-% \begin{macrocode}
-\tl_new:N \g_@@_begin_line_hook_tl
-% \end{macrocode}
-%
-% \smallskip
-% For example, the LPEG |Prompt| will trigger the following command which will
-% insert an instruction in the hook |\g_@@_begin_line_hook| to specify that a
-% background must be inserted to the current line of code.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_prompt:
- {
- \tl_gset:Nn \g_@@_begin_line_hook_tl
- { \clist_set:NV \l_@@_bg_color_clist \l_@@_prompt_bg_color_tl }
- }
-% \end{macrocode}
-%
-%
-% \bigskip
-% You will keep track of the current style for the treatment of EOL (for the
-% multi-line syntactic elements).
-% \begin{macrocode}
-\clist_new:N \g_@@_current_style_clist
-\clist_set:Nn \g_@@_current_style_clist { __end }
-% \end{macrocode}
-% The element |__end| is an arbitrary syntactic marker.
-%
-% \medskip
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_close_current_styles:
- {
- \int_set:Nn \l_tmpa_int { \clist_count:N \g_@@_current_style_clist - 1 }
- \exp_args:NV \@@_close_n_styles:n \l_tmpa_int
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_close_n_styles:n #1
- {
- \int_compare:nNnT { #1 } > 0
- {
- \@@_close_brace:
- \@@_close_brace:
- \@@_close_n_styles:n { #1 - 1 }
- }
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_open_current_styles:
- { \exp_last_unbraced:NV \@@_open_styles:w \g_@@_current_style_clist , }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_open_styles:w #1 ,
- {
- \tl_if_eq:nnF { #1 } { __end }
- { \@@_open_brace: #1 \@@_open_brace: \@@_open_styles:w }
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_pop_style:
- {
- \clist_greverse:N \g_@@_current_style_clist
- \clist_gpop:NN \g_@@_current_style_clist \l_tmpa_tl
- \clist_gpop:NN \g_@@_current_style_clist \l_tmpa_tl
- \clist_gpush:Nn \g_@@_current_style_clist { __end }
- \clist_greverse:N \g_@@_current_style_clist
- }
-% \end{macrocode}
-%
-% \medskip
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_push_style:n #1
- {
- \clist_greverse:N \g_@@_current_style_clist
- \clist_gpop:NN \g_@@_current_style_clist \l_tmpa_tl
- \clist_gpush:Nn \g_@@_current_style_clist { #1 }
- \clist_gpush:Nn \g_@@_current_style_clist { __end }
- \clist_greverse:N \g_@@_current_style_clist
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_push_and_exec:n #1
- {
- \@@_push_style:n { #1 }
- \@@_open_brace: #1 \@@_open_brace:
- }
-% \end{macrocode}
-%
-% \bigskip
-% \subsubsection{Treatment of a line of code}
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_replace_spaces:n #1
- {
- \tl_set:Nn \l_tmpa_tl { #1 }
- \bool_if:NTF \l_@@_show_spaces_bool
- { \regex_replace_all:nnN { \x20 } { ␣ } \l_tmpa_tl } % U+2423
- {
-% \end{macrocode}
-% If the key |break-lines-in-Piton| is in force, we replace all the characters
-% U+0020 (that is to say the spaces) by |\@@_breakable_space:|. Remark that,
-% except the spaces inserted in the LaTeX comments (and maybe in the math
-% comments), all these spaces are of catcode ``other'' (=12) and are
-% unbreakable.
-% \begin{macrocode}
- \bool_if:NT \l_@@_break_lines_in_Piton_bool
- {
- \regex_replace_all:nnN
- { \x20 }
- { \c { @@_breakable_space: } }
- \l_tmpa_tl
- }
- }
- \l_tmpa_tl
- }
-\cs_generate_variant:Nn \@@_replace_spaces:n { x }
-% \end{macrocode}
-%
-% \bigskip
-% In the contents provided by Lua, each line of the Python code will be
-% surrounded by |\@@_begin_line:| and |\@@_end_line:|. |\@@_begin_line:| is a
-% LaTeX command that we will define now but |\@@_end_line:| is only a syntactic
-% marker that has no definition.
-%
-% \begin{macrocode}
-\cs_set_protected:Npn \@@_begin_line: #1 \@@_end_line:
- {
- \group_begin:
- \g_@@_begin_line_hook_tl
- \int_gzero:N \g_@@_indentation_int
-% \end{macrocode}
-%
-%
-% Be careful: there is curryfication in the following lines.
-% \begin{macrocode}
- \bool_if:NTF \l_@@_slim_bool
- { \hcoffin_set:Nn \l_tmpa_coffin }
- {
- \clist_if_empty:NTF \l_@@_bg_color_clist
- {
- \vcoffin_set:Nnn \l_tmpa_coffin
- { \dim_eval:n { \linewidth - \l_@@_left_margin_dim } }
- }
- {
- \vcoffin_set:Nnn \l_tmpa_coffin
- { \dim_eval:n { \linewidth - \l_@@_left_margin_dim - 0.5 em } }
- }
- }
- {
- \language = -1
- \raggedright
- \strut
- \@@_replace_spaces:n { #1 }
- \strut \hfil
- }
- \hbox_set:Nn \l_tmpa_box
- {
- \skip_horizontal:N \l_@@_left_margin_dim
- \bool_if:NT \l_@@_line_numbers_bool
- {
- \bool_if:NF \l_@@_all_line_numbers_bool
- { \tl_if_empty:nF { #1 } }
- \@@_print_number:
- }
- \clist_if_empty:NF \l_@@_bg_color_clist
- {
- \dim_compare:nNnT \l_@@_left_margin_dim = \c_zero_dim
- {
- \bool_if:NF \l_@@_left_margin_auto_bool
- { \skip_horizontal:n { 0.5 em } }
- }
- }
- \coffin_typeset:Nnnnn \l_tmpa_coffin T l \c_zero_dim \c_zero_dim
- }
-% \end{macrocode}
-% We compute in |\g_@@_width_dim| the maximal width of the lines of the
-% environment.
-% \begin{macrocode}
- \dim_compare:nNnT { \box_wd:N \l_tmpa_box } > \g_@@_width_dim
- { \dim_gset:Nn \g_@@_width_dim { \box_wd:N \l_tmpa_box } }
- \box_set_dp:Nn \l_tmpa_box { \box_dp:N \l_tmpa_box + 1.25 pt }
- \box_set_ht:Nn \l_tmpa_box { \box_ht:N \l_tmpa_box + 1.25 pt }
- \clist_if_empty:NTF \l_@@_bg_color_clist
- { \box_use_drop:N \l_tmpa_box }
- {
- \vbox_top:n
- {
- \hbox:n
- {
- \@@_color:N \l_@@_bg_color_clist
- \vrule height \box_ht:N \l_tmpa_box
- depth \box_dp:N \l_tmpa_box
- width \l_@@_width_on_aux_dim
- }
- \skip_vertical:n { - \box_ht_plus_dp:N \l_tmpa_box }
- \box_set_wd:Nn \l_tmpa_box \l_@@_width_on_aux_dim
- \box_use_drop:N \l_tmpa_box
- }
- }
- \vspace { - 2.5 pt }
- \group_end:
- \tl_gclear:N \g_@@_begin_line_hook_tl
- }
-% \end{macrocode}
-%
-% \bigskip
-% The command |\@@_color:N| will take in as argument a reference to a
-% comma-separated list of colors. A color will be picked by using the value of
-% |\g_@@_line_int| (modulo the number of colors in the list).
-% \begin{macrocode}
-\cs_set_protected:Npn \@@_color:N #1
- {
- \int_set:Nn \l_tmpa_int { \clist_count:N #1 }
- \int_set:Nn \l_tmpb_int { \int_mod:nn \g_@@_line_int \l_tmpa_int + 1 }
- \tl_set:Nx \l_tmpa_tl { \clist_item:Nn #1 \l_tmpb_int }
- \tl_if_eq:NnTF \l_tmpa_tl { none }
-% \end{macrocode}
-% By setting |\l_@@_width_on_aux_dim| to zero, the colored rectangle will be
-% drawn with zero width and, thus, it will be a mere strut (and we need that strut).
-% \begin{macrocode}
- { \dim_zero:N \l_@@_width_on_aux_dim }
- { \exp_args:NV \@@_color_i:n \l_tmpa_tl }
- }
-% \end{macrocode}
-%
-% The following command |\@@_color:n| will accept both the instruction
-% |\@@_color:n { red!15 }| and the instruction |\@@_color:n { [rgb]{0.9,0.9,0} }|.
-% \begin{macrocode}
-\cs_set_protected:Npn \@@_color_i:n #1
- {
- \tl_if_head_eq_meaning:nNTF { #1 } [
- {
- \tl_set:Nn \l_tmpa_tl { #1 }
- \tl_set_rescan:Nno \l_tmpa_tl { } \l_tmpa_tl
- \exp_last_unbraced:NV \color \l_tmpa_tl
- }
- { \color { #1 } }
- }
-\cs_generate_variant:Nn \@@_color:n { V }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_newline:
- {
- \int_gincr:N \g_@@_line_int
- \int_compare:nNnT \g_@@_line_int > { \l_@@_splittable_int - 1 }
- {
- \int_compare:nNnT
- { \l_@@_nb_lines_int - \g_@@_line_int } > \l_@@_splittable_int
- {
- \egroup
- \bool_if:NT \c_@@_footnote_bool { \end { savenotes } }
- \newline
- \bool_if:NT \c_@@_footnote_bool { \begin { savenotes } }
- \vtop \bgroup
- }
- }
- }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\cs_set_protected:Npn \@@_breakable_space:
- {
- \discretionary
- { \hbox:n { \color { gray } \l_@@_end_of_broken_line_tl } }
- {
- \hbox_overlap_left:n
- {
- {
- \normalfont \footnotesize \color { gray }
- \l_@@_continuation_symbol_tl
- }
- \skip_horizontal:n { 0.3 em }
- \clist_if_empty:NF \l_@@_bg_color_clist
- { \skip_horizontal:n { 0.5 em } }
- }
- \bool_if:NT \l_@@_indent_broken_lines_bool
- {
- \hbox:n
- {
- \prg_replicate:nn { \g_@@_indentation_int } { ~ }
- { \color { gray } \l_@@_csoi_tl }
- }
- }
- }
- { \hbox { ~ } }
- }
-% \end{macrocode}
-%
-% \bigskip
-% \subsubsection{PitonOptions}
-%
-% \medskip
-% The following parameters correspond to the keys |line-numbers| and
-% |all-line-numbers|.
-% \begin{macrocode}
-\bool_new:N \l_@@_line_numbers_bool
-\bool_new:N \l_@@_all_line_numbers_bool
-% \end{macrocode}
-%
-% \medskip
-% The following flag corresponds to the key |resume|.
-% \begin{macrocode}
-\bool_new:N \l_@@_resume_bool
-% \end{macrocode}
-%
-% \bigskip
-% Be careful! The name of the following set of keys must be considered as
-% public! Hence, it should \emph{not} be changed.
-%
-% \begin{macrocode}
-\keys_define:nn { PitonOptions }
- {
- language .str_set:N = \l_@@_language_str ,
- language .value_required:n = true ,
- gobble .int_set:N = \l_@@_gobble_int ,
- gobble .value_required:n = true ,
- auto-gobble .code:n = \int_set:Nn \l_@@_gobble_int { -1 } ,
- auto-gobble .value_forbidden:n = true ,
- env-gobble .code:n = \int_set:Nn \l_@@_gobble_int { -2 } ,
- env-gobble .value_forbidden:n = true ,
- tabs-auto-gobble .code:n = \int_set:Nn \l_@@_gobble_int { -3 } ,
- tabs-auto-gobble .value_forbidden:n = true ,
- line-numbers .bool_set:N = \l_@@_line_numbers_bool ,
- line-numbers .default:n = true ,
- all-line-numbers .code:n =
- \bool_set_true:N \l_@@_line_numbers_bool
- \bool_set_true:N \l_@@_all_line_numbers_bool ,
- all-line-numbers .value_forbidden:n = true ,
- resume .bool_set:N = \l_@@_resume_bool ,
- resume .value_forbidden:n = true ,
- splittable .int_set:N = \l_@@_splittable_int ,
- splittable .default:n = 1 ,
- background-color .clist_set:N = \l_@@_bg_color_clist ,
- background-color .value_required:n = true ,
- prompt-background-color .tl_set:N = \l_@@_prompt_bg_color_tl ,
- prompt-background-color .value_required:n = true ,
- slim .bool_set:N = \l_@@_slim_bool ,
- slim .default:n = true ,
- left-margin .code:n =
- \str_if_eq:nnTF { #1 } { auto }
- {
- \dim_zero:N \l_@@_left_margin_dim
- \bool_set_true:N \l_@@_left_margin_auto_bool
- }
- { \dim_set:Nn \l_@@_left_margin_dim { #1 } } ,
- left-margin .value_required:n = true ,
- numbers-sep .dim_set:N = \l_@@_numbers_sep_dim ,
- numbers-sep .value_required:n = true ,
- tab-size .code:n = \@@_set_tab_tl:n { #1 } ,
- tab-size .value_required:n = true ,
- show-spaces .bool_set:N = \l_@@_show_spaces_bool ,
- show-spaces .default:n = true ,
- show-spaces-in-strings .code:n = \tl_set:Nn \l_@@_space_tl { ␣ } , % U+2423
- show-spaces-in-strings .value_forbidden:n = true ,
- break-lines-in-Piton .bool_set:N = \l_@@_break_lines_in_Piton_bool ,
- break-lines-in-Piton .default:n = true ,
- break-lines-in-piton .bool_set:N = \l_@@_break_lines_in_piton_bool ,
- break-lines-in-piton .default:n = true ,
- break-lines .meta:n = { break-lines-in-piton , break-lines-in-Piton } ,
- break-lines .value_forbidden:n = true ,
- indent-broken-lines .bool_set:N = \l_@@_indent_broken_lines_bool ,
- indent-broken-lines .default:n = true ,
- end-of-broken-line .tl_set:N = \l_@@_end_of_broken_line_tl ,
- end-of-broken-line .value_required:n = true ,
- continuation-symbol .tl_set:N = \l_@@_continuation_symbol_tl ,
- continuation-symbol .value_required:n = true ,
- continuation-symbol-on-indentation .tl_set:N = \l_@@_csoi_tl ,
- continuation-symbol-on-indentation .value_required:n = true ,
- unknown .code:n =
- \msg_error:nn { piton } { Unknown~key~for~PitonOptions }
- }
-% \end{macrocode}
-%
-%
-% \bigskip
-%
-% \bigskip
-% The argument of |\PitonOptions| is provided by curryfication.
-% \begin{macrocode}
-\NewDocumentCommand \PitonOptions { } { \keys_set:nn { PitonOptions } }
-% \end{macrocode}
-%
-% \bigskip
-% \subsubsection{The numbers of the lines}
-%
-% \medskip
-% The following counter will be used to count the lines in the code when the
-% user requires the numbers of the lines to be printed (with |line-numbers| or
-% |all-line-numbers|).
-%
-% \begin{macrocode}
-\int_new:N \g_@@_visual_line_int
-% \end{macrocode}
-%
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_print_number:
- {
- \int_gincr:N \g_@@_visual_line_int
- \hbox_overlap_left:n
- {
- { \color { gray } \footnotesize \int_to_arabic:n \g_@@_visual_line_int }
- \skip_horizontal:N \l_@@_numbers_sep_dim
- }
- }
-% \end{macrocode}
-%
-%
-% \bigskip
-% \subsubsection{The command to write on the aux file}
-%
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_write_aux:
- {
- \tl_if_empty:NF \g_@@_aux_tl
- {
- \iow_now:Nn \@mainaux { \ExplSyntaxOn }
- \iow_now:Nx \@mainaux
- {
- \tl_gset:cn { c_@@_ \int_use:N \g_@@_env_int _ tl }
- { \exp_not:V \g_@@_aux_tl }
- }
- \iow_now:Nn \@mainaux { \ExplSyntaxOff }
- }
- \tl_gclear:N \g_@@_aux_tl
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_width_to_aux:
- {
- \bool_if:NT \l_@@_slim_bool
- {
- \clist_if_empty:NF \l_@@_bg_color_clist
- {
- \tl_gput_right:Nx \g_@@_aux_tl
- {
- \dim_set:Nn \l_@@_width_on_aux_dim
- { \dim_eval:n { \g_@@_width_dim + 0.5 em } }
- }
- }
- }
- }
-% \end{macrocode}
-%
-% \bigskip
-% \subsubsection{The main commands and environments for the final user}
-%
-% \bigskip
-% \begin{macrocode}
-\NewDocumentCommand { \piton } { }
- { \peek_meaning:NTF \bgroup \@@_piton_standard \@@_piton_verbatim }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\NewDocumentCommand { \@@_piton_standard } { m }
- {
- \group_begin:
- \ttfamily
-% \end{macrocode}
-% The following tuning of LuaTeX in order to avoid all break of lines on the
-% hyphens.
-% \begin{macrocode}
- \automatichyphenmode = 1
- \cs_set_eq:NN \\ \c_backslash_str
- \cs_set_eq:NN \% \c_percent_str
- \cs_set_eq:NN \{ \c_left_brace_str
- \cs_set_eq:NN \} \c_right_brace_str
- \cs_set_eq:NN \$ \c_dollar_str
- \cs_set_eq:cN { ~ } \space
- \cs_set_protected:Npn \@@_begin_line: { }
- \cs_set_protected:Npn \@@_end_line: { }
- \tl_set:Nx \l_tmpa_tl
- {
- \lua_now:e
- { piton.ParseBis('\l_@@_language_str',token.scan_string()) }
- { #1 }
- }
- \bool_if:NTF \l_@@_show_spaces_bool
- { \regex_replace_all:nnN { \x20 } { ␣ } \l_tmpa_tl } % U+2423
-% \end{macrocode}
-% The following code replaces the characters U+0020 (spaces) by characters
-% U+0020 of catcode~10: thus, they become breakable by an end of line.
-% \begin{macrocode}
- {
- \bool_if:NT \l_@@_break_lines_in_piton_bool
- { \regex_replace_all:nnN { \x20 } { \x20 } \l_tmpa_tl }
- }
- \l_tmpa_tl
- \group_end:
- }
-% \end{macrocode}
-%
-%
-% \begin{macrocode}
-\NewDocumentCommand { \@@_piton_verbatim } { v }
- {
- \group_begin:
- \ttfamily
- \automatichyphenmode = 1
- \cs_set_protected:Npn \@@_begin_line: { }
- \cs_set_protected:Npn \@@_end_line: { }
- \tl_set:Nx \l_tmpa_tl
- {
- \lua_now:e
- { piton.Parse('\l_@@_language_str',token.scan_string()) }
- { #1 }
- }
- \bool_if:NT \l_@@_show_spaces_bool
- { \regex_replace_all:nnN { \x20 } { ␣ } \l_tmpa_tl } % U+2423
- \l_tmpa_tl
- \group_end:
- }
-% \end{macrocode}
-%
-
-% \bigskip
-%
-%
-% \bigskip
-% The following command is not a user command. It will be used when we will
-% have to ``rescan'' some chunks of Python code. For example, it will be the
-% initial value of the Piton style |InitialValues| (the default values of the
-% arguments of a Python function).
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_piton:n #1
- {
- \group_begin:
- \cs_set_protected:Npn \@@_begin_line: { }
- \cs_set_protected:Npn \@@_end_line: { }
- \bool_lazy_or:nnTF
- \l_@@_break_lines_in_piton_bool
- \l_@@_break_lines_in_Piton_bool
- {
- \tl_set:Nx \l_tmpa_tl
- {
- \lua_now:e
- { piton.ParseTer('\l_@@_language_str',token.scan_string()) }
- { #1 }
- }
- }
- {
- \tl_set:Nx \l_tmpa_tl
- {
- \lua_now:e
- { piton.Parse('\l_@@_language_str',token.scan_string()) }
- { #1 }
- }
- }
- \bool_if:NT \l_@@_show_spaces_bool
- { \regex_replace_all:nnN { \x20 } { ␣ } \l_tmpa_tl } % U+2423
- \l_tmpa_tl
- \group_end:
- }
-% \end{macrocode}
-%
-% \bigskip
-% The following command is similar to the previous one but raise a fatal error if
-% its argument contains a carriage return.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_piton_no_cr:n #1
- {
- \group_begin:
- \cs_set_protected:Npn \@@_begin_line: { }
- \cs_set_protected:Npn \@@_end_line: { }
- \cs_set_protected:Npn \@@_newline:
- { \msg_fatal:nn { piton } { cr~not~allowed } }
- \bool_lazy_or:nnTF
- \l_@@_break_lines_in_piton_bool
- \l_@@_break_lines_in_Piton_bool
- {
- \tl_set:Nx \l_tmpa_tl
- {
- \lua_now:e
- { piton.ParseTer('\l_@@_language_str',token.scan_string()) }
- { #1 }
- }
- }
- {
- \tl_set:Nx \l_tmpa_tl
- {
- \lua_now:e
- { piton.Parse('\l_@@_language_str',token.scan_string()) }
- { #1 }
- }
- }
- \bool_if:NT \l_@@_show_spaces_bool
- { \regex_replace_all:nnN { \x20 } { ␣ } \l_tmpa_tl } % U+2423
- \l_tmpa_tl
- \group_end:
- }
-% \end{macrocode}
-%
-% \bigskip
-% Despite its name, |\@@_pre_env:| will be used both in |\PitonInputFile| and
-% in the environments such as |{Piton}|.
-% \begin{macrocode}
-\cs_new:Npn \@@_pre_env:
- {
- \automatichyphenmode = 1
- \int_gincr:N \g_@@_env_int
- \tl_gclear:N \g_@@_aux_tl
- \cs_if_exist_use:c { c_@@ _ \int_use:N \g_@@_env_int _ tl }
- \dim_compare:nNnT \l_@@_width_on_aux_dim = \c_zero_dim
- { \dim_set_eq:NN \l_@@_width_on_aux_dim \linewidth }
- \bool_if:NF \l_@@_resume_bool { \int_gzero:N \g_@@_visual_line_int }
- \dim_gzero:N \g_@@_width_dim
- \int_gzero:N \g_@@_line_int
- \dim_zero:N \parindent
- \dim_zero:N \lineskip
- \dim_zero:N \parindent
- \cs_set_eq:NN \label \@@_label:n
- }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\keys_define:nn { PitonInputFile }
- {
- first-line .int_set:N = \l_@@_first_line_int ,
- first-line .value_required:n = true ,
- last-line .int_set:N = \l_@@_last_line_int ,
- last-line .value_required:n = true ,
- }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\NewDocumentCommand { \PitonInputFile } { d < > O { } m }
- {
- \tl_if_novalue:nF { #1 }
- {
- \bool_if:NTF \c_@@_beamer_bool
- { \begin { uncoverenv } < #1 > }
- { \msg_error:nn { piton } { overlay~without~beamer } }
- }
- \group_begin:
- \int_zero_new:N \l_@@_first_line_int
- \int_zero_new:N \l_@@_last_line_int
- \int_set_eq:NN \l_@@_last_line_int \c_max_int
- \keys_set:nn { PitonInputFile } { #2 }
- \@@_pre_env:
- \mode_if_vertical:TF \mode_leave_vertical: \newline
-% \end{macrocode}
-% We count with Lua the number of lines of the argument. The result will be
-% stored by Lua in |\l_@@_nb_lines_int|. That information will be used to allow
-% or disallow page breaks.
-% \begin{macrocode}
- \lua_now:n { piton.CountLinesFile(token.scan_argument()) } { #3 }
-% \end{macrocode}
-% If the final user has used both |left-margin=auto| and |line-numbers| or
-% |all-line-numbers|, we have to compute the width of the maximal number of
-% lines at the end of the composition of the listing to fix the correct value to
-% |left-margin|.
-% \begin{macrocode}
- \bool_lazy_and:nnT \l_@@_left_margin_auto_bool \l_@@_line_numbers_bool
- {
- \hbox_set:Nn \l_tmpa_box
- {
- \footnotesize
- \bool_if:NTF \l_@@_all_line_numbers_bool
- {
- \int_to_arabic:n
- { \g_@@_visual_line_int + \l_@@_nb_lines_int }
- }
- {
- \lua_now:n
- { piton.CountNonEmptyLinesFile(token.scan_argument()) }
- { #3 }
- \int_to_arabic:n
- { \g_@@_visual_line_int + \l_@@_nb_non_empty_lines_int }
- }
- }
- \dim_set:Nn \l_@@_left_margin_dim
- { \box_wd:N \l_tmpa_box + \l_@@_numbers_sep_dim + 0.1 em }
- }
-% \end{macrocode}
-% Now, the main job.
-% \begin{macrocode}
- \ttfamily
- \bool_if:NT \c_@@_footnote_bool { \begin { savenotes } }
- \vtop \bgroup
- \lua_now:e
- {
- piton.ParseFile('\l_@@_language_str',token.scan_argument() ,
- \int_use:N \l_@@_first_line_int ,
- \int_use:N \l_@@_last_line_int )
- }
- { #3 }
- \egroup
- \bool_if:NT \c_@@_footnote_bool { \end { savenotes } }
- \@@_width_to_aux:
- \group_end:
- \tl_if_novalue:nF { #1 }
- { \bool_if:NT \c_@@_beamer_bool { \end { uncoverenv } } }
- \@@_write_aux:
- }
-% \end{macrocode}
-%
-%
-% \bigskip
-% \begin{macrocode}
-\NewDocumentCommand { \NewPitonEnvironment } { m m m m }
- {
-% \end{macrocode}
-% We construct a TeX macro which will catch as argument all the tokens until
-% |\end{|\texttt{\textsl{name_env}}|}| with, in that
-% |\end{|\texttt{\textsl{name_env}}|}|, the catcodes of |\|, |{| and |}| equal to
-% 12 (``\texttt{other}''). The latter explains why the definition of that
-% function is a bit complicated.
-% \begin{macrocode}
- \use:x
- {
- \cs_set_protected:Npn
- \use:c { _@@_collect_ #1 :w }
- ####1
- \c_backslash_str end \c_left_brace_str #1 \c_right_brace_str
- }
- {
- \group_end:
- \mode_if_vertical:TF \mode_leave_vertical: \newline
-% \end{macrocode}
-% We count with Lua the number of lines of the argument. The result will be
-% stored by Lua in |\l_@@_nb_lines_int|. That information will be used to allow
-% or disallow page breaks.
-% \begin{macrocode}
- \lua_now:n { piton.CountLines(token.scan_argument()) } { ##1 }
-% \end{macrocode}
-% If the final user has used both |left-margin=auto| and |line-numbers|, we have
-% to compute the width of the maximal number of lines at the end of the
-% environment to fix the correct value to |left-margin|.
-% \begin{macrocode}
- \bool_lazy_and:nnT \l_@@_left_margin_auto_bool \l_@@_line_numbers_bool
- {
- \bool_if:NTF \l_@@_all_line_numbers_bool
- {
- \hbox_set:Nn \l_tmpa_box
- {
- \footnotesize
- \int_to_arabic:n
- { \g_@@_visual_line_int + \l_@@_nb_lines_int }
- }
- }
- {
- \lua_now:n
- { piton.CountNonEmptyLines(token.scan_argument()) }
- { ##1 }
- \hbox_set:Nn \l_tmpa_box
- {
- \footnotesize
- \int_to_arabic:n
- { \g_@@_visual_line_int + \l_@@_nb_non_empty_lines_int }
- }
- }
- \dim_set:Nn \l_@@_left_margin_dim
- { \box_wd:N \l_tmpa_box + \l_@@_numbers_sep_dim + 0.1 em }
- }
-% \end{macrocode}
-% Now, the main job.
-% \begin{macrocode}
- \ttfamily
- \bool_if:NT \c_@@_footnote_bool { \begin { savenotes } }
- \vtop \bgroup
- \lua_now:e
- {
- piton.GobbleParse
- (
- '\l_@@_language_str' ,
- \int_use:N \l_@@_gobble_int ,
- token.scan_argument()
- )
- }
- { ##1 }
- \vspace { 2.5 pt }
- \egroup
- \bool_if:NT \c_@@_footnote_bool { \end { savenotes } }
- \@@_width_to_aux:
-% \end{macrocode}
-% The following |\end{#1}| is only for the groups and the stack of environments
-% of LaTeX.
-% \begin{macrocode}
- \end { #1 }
- \@@_write_aux:
- }
-% \end{macrocode}
-%
-%
-% \bigskip
-% We can now define the new environment.
-%
-% We are still in the definition of the command |\NewPitonEnvironment|...
-% \begin{macrocode}
- \NewDocumentEnvironment { #1 } { #2 }
- {
- #3
- \@@_pre_env:
- \group_begin:
- \tl_map_function:nN
- { \ \\ \{ \} \$ \& \# \^ \_ \% \~ \^^I }
- \char_set_catcode_other:N
- \use:c { _@@_collect_ #1 :w }
- }
- { #4 }
-% \end{macrocode}
-%
-% \medskip
-% The following code is for technical reasons. We want to change the catcode of
-% |^^M| before catching the arguments of the new environment we are defining.
-% Indeed, if not, we will have problems if there is a final optional argument in
-% our environment (if that final argument is not used by the user in an
-% instance of the environment, a spurious space is inserted, probably because
-% the |^^M| is converted to space).
-% \begin{macrocode}
- \AddToHook { env / #1 / begin } { \char_set_catcode_other:N \^^M }
- }
-% \end{macrocode}
-% This is the end of the definition of the command |\NewPitonEnvironment|.
-%
-% \bigskip
-% Now, we define the environment |{Piton}|, which is the main environment
-% provided by the package \pkg{piton}. Of course, you use
-% |\NewPitonEnvironment|.
-% \begin{macrocode}
-\bool_if:NTF \c_@@_beamer_bool
- {
- \NewPitonEnvironment { Piton } { d < > }
- {
- \IfValueTF { #1 }
- { \begin { uncoverenv } < #1 > }
- { \begin { uncoverenv } }
- }
- { \end { uncoverenv } }
- }
- { \NewPitonEnvironment { Piton } { } { } { } }
-% \end{macrocode}
-%
-%
-%
-% \bigskip
-% \subsubsection{The styles}
-%
-% \medskip
-% The following command is fundamental: it will be used by the Lua code.
-% \begin{macrocode}
-\NewDocumentCommand { \PitonStyle } { m } { \use:c { pitonStyle #1 } }
-% \end{macrocode}
-%
-% \medskip
-% The following command takes in its argument by curryfication.
-% \begin{macrocode}
-\NewDocumentCommand { \SetPitonStyle } { } { \keys_set:nn { piton / Styles } }
-% \end{macrocode}
-%
-% \medskip
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_math_scantokens:n #1
- { \normalfont \scantextokens { $#1$ } }
-% \end{macrocode}
-%
-% \medskip
-% \begin{macrocode}
-\keys_define:nn { piton / Styles }
- {
- String.Interpol .tl_set:c = pitonStyle String.Interpol ,
- String.Interpol .value_required:n = true ,
- FormattingType .tl_set:c = pitonStyle FormattingType ,
- FormattingType .value_required:n = true ,
- Dict.Value .tl_set:c = pitonStyle Dict.Value ,
- Dict.Value .value_required:n = true ,
- Name.Decorator .tl_set:c = pitonStyle Name.Decorator ,
- Name.Decorator .value_required:n = true ,
- Name.Function .tl_set:c = pitonStyle Name.Function ,
- Name.Function .value_required:n = true ,
- Name.UserFunction .tl_set:c = pitonStyle Name.UserFunction ,
- Name.UserFunction .value_required:n = true ,
- Keyword .tl_set:c = pitonStyle Keyword ,
- Keyword .value_required:n = true ,
- Keyword.Constant .tl_set:c = pitonStyle Keyword.Constant ,
- Keyword.constant .value_required:n = true ,
- String.Doc .tl_set:c = pitonStyle String.Doc ,
- String.Doc .value_required:n = true ,
- Interpol.Inside .tl_set:c = pitonStyle Interpol.Inside ,
- Interpol.Inside .value_required:n = true ,
- String.Long .tl_set:c = pitonStyle String.Long ,
- String.Long .value_required:n = true ,
- String.Short .tl_set:c = pitonStyle String.Short ,
- String.Short .value_required:n = true ,
- String .meta:n = { String.Long = #1 , String.Short = #1 } ,
- Comment.Math .tl_set:c = pitonStyle Comment.Math ,
- Comment.Math .default:n = \@@_math_scantokens:n ,
- Comment.Math .initial:n = ,
- Comment .tl_set:c = pitonStyle Comment ,
- Comment .value_required:n = true ,
- InitialValues .tl_set:c = pitonStyle InitialValues ,
- InitialValues .value_required:n = true ,
- Number .tl_set:c = pitonStyle Number ,
- Number .value_required:n = true ,
- Name.Namespace .tl_set:c = pitonStyle Name.Namespace ,
- Name.Namespace .value_required:n = true ,
- Name.Class .tl_set:c = pitonStyle Name.Class ,
- Name.Class .value_required:n = true ,
- Name.Builtin .tl_set:c = pitonStyle Name.Builtin ,
- Name.Builtin .value_required:n = true ,
- TypeParameter .tl_set:c = pitonStyle TypeParameter ,
- TypeParameter .value_required:n = true ,
- Name.Type .tl_set:c = pitonStyle Name.Type ,
- Name.Type .value_required:n = true ,
- Operator .tl_set:c = pitonStyle Operator ,
- Operator .value_required:n = true ,
- Operator.Word .tl_set:c = pitonStyle Operator.Word ,
- Operator.Word .value_required:n = true ,
- Exception .tl_set:c = pitonStyle Exception ,
- Exception .value_required:n = true ,
- Comment.LaTeX .tl_set:c = pitonStyle Comment.LaTeX ,
- Comment.LaTeX .value_required:n = true ,
- Identifier .tl_set:c = pitonStyle Identifier ,
- Comment.LaTeX .value_required:n = true ,
- ParseAgain.noCR .tl_set:c = pitonStyle ParseAgain.noCR ,
- ParseAgain.noCR .value_required:n = true ,
- ParseAgain .tl_set:c = pitonStyle ParseAgain ,
- ParseAgain .value_required:n = true ,
- Prompt .tl_set:c = pitonStyle Prompt ,
- Prompt .value_required:n = true ,
- unknown .code:n =
- \msg_error:nn { piton } { Unknown~key~for~SetPitonStyle }
- }
-% \end{macrocode}
-%
-%
-% \bigskip
-% \begin{macrocode}
-\msg_new:nnn { piton } { Unknown~key~for~SetPitonStyle }
- {
- The~style~'\l_keys_key_str'~is~unknown.\\
- This~key~will~be~ignored.\\
- The~available~styles~are~(in~alphabetic~order):~
- Comment,~
- Comment.LaTeX,~
- Dict.Value,~
- Exception,~
- Identifier,~
- InitialValues,~
- Keyword,~
- Keyword.Constant,~
- Name.Builtin,~
- Name.Class,~
- Name.Decorator,~
- Name.Function,~
- Name.Namespace,~
- Number,~
- Operator,~
- Operator.Word,~
- Prompt,~
- String,~
- String.Doc,~
- String.Long,~
- String.Short,~and~
- String.Interpol.
- }
-% \end{macrocode}
-%
-% \bigskip
-% \subsubsection{The initial style}
-%
-% The initial style is inspired by the style ``manni'' of Pygments.
-%
-% \medskip
-% \begin{macrocode}
-\SetPitonStyle
- {
- Comment = \color[HTML]{0099FF} \itshape ,
- Exception = \color[HTML]{CC0000} ,
- Keyword = \color[HTML]{006699} \bfseries ,
- Keyword.Constant = \color[HTML]{006699} \bfseries ,
- Name.Builtin = \color[HTML]{336666} ,
- Name.Decorator = \color[HTML]{9999FF},
- Name.Class = \color[HTML]{00AA88} \bfseries ,
- Name.Function = \color[HTML]{CC00FF} ,
- Name.Namespace = \color[HTML]{00CCFF} ,
- Number = \color[HTML]{FF6600} ,
- Operator = \color[HTML]{555555} ,
- Operator.Word = \bfseries ,
- String = \color[HTML]{CC3300} ,
- String.Doc = \color[HTML]{CC3300} \itshape ,
- String.Interpol = \color[HTML]{AA0000} ,
- Comment.LaTeX = \normalfont \color[rgb]{.468,.532,.6} ,
- Name.Type = \color[HTML]{336666} ,
- InitialValues = \@@_piton:n ,
- Dict.Value = \@@_piton:n ,
- Interpol.Inside = \color{black}\@@_piton:n ,
- TypeParameter = \color[HTML]{008800} \itshape ,
- Identifier = \@@_identifier:n ,
- Name.UserFunction = ,
- Prompt = ,
- ParseAgain.noCR = \@@_piton_no_cr:n ,
- ParseAgain = \@@_piton:n ,
- }
-% \end{macrocode}
-% The last styles |ParseAgain.noCR| and |ParseAgain| should be considered as
-% ``internal style'' (not available for the final user). However, maybe we will
-% change that and document these styles for the final user (why not?).
-%
-% \medskip
-% If the key |math-comments| has been used at load-time, we change the style
-% |Comment.Math| which should be considered only at an ``internal style''.
-% However, maybe we will document in a future version the possibility to write
-% change the style \emph{locally} in a document)].
-% \begin{macrocode}
-\bool_if:NT \c_@@_math_comments_bool { \SetPitonStyle { Comment.Math } }
-% \end{macrocode}
-%
-% \bigskip
-%
-% \bigskip
-% \subsubsection{Highlighting some identifiers}
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_identifier:n #1
- { \cs_if_exist_use:c { PitonIdentifier _ \l_@@_language_str _ #1 } { #1 } }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\keys_define:nn { PitonOptions }
- { identifiers .code:n = \@@_set_identifiers:n { #1 } }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\keys_define:nn { Piton / identifiers }
- {
- names .clist_set:N = \l_@@_identifiers_names_tl ,
- style .tl_set:N = \l_@@_style_tl ,
- }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_set_identifiers:n #1
- {
- \clist_clear_new:N \l_@@_identifiers_names_tl
- \tl_clear_new:N \l_@@_style_tl
- \keys_set:nn { Piton / identifiers } { #1 }
- \clist_map_inline:Nn \l_@@_identifiers_names_tl
- {
- \tl_set_eq:cN
- { PitonIdentifier _ \l_@@_language_str _ ##1 }
- \l_@@_style_tl
- }
- }
-% \end{macrocode}
-%
-%
-% \bigskip
-% In particular, we have an hightlighting of the indentifiers which are the
-% names of Python functions previously defined by the user. Indeed, when a
-% Python function is defined, the style |Name.Function.Internal| is applied to
-% that name. We define now that style (you define it directly and you short-cut
-% the function |\SetPitonStyle|).
-% \begin{macrocode}
-\cs_new_protected:cpn { pitonStyle Name.Function.Internal } #1
- {
-% \end{macrocode}
-% First, the element is composed in the TeX flow with the style |Name.Function|
-% which is provided to the final user.
-% \begin{macrocode}
- { \PitonStyle { Name.Function } { #1 } }
-% \end{macrocode}
-% Now, we specify that the name of the new Python function is a known identifier
-% that will be formated with the Piton style |Name.UserFunction|. Of course,
-% here the affectation is global because we have to exit many groups and even
-% the environments |{Piton}|).
-% \begin{macrocode}
- \cs_gset_protected:cpn { PitonIdentifier _ \l_@@_language_str _ #1 }
- { \PitonStyle{ Name.UserFunction } }
-% \end{macrocode}
-% Now, we put the name of that new user function in the dedicated sequence
-% (specific of the current language). That sequence will be used only by
-% |\PitonClearUserFunctions|.
-% \begin{macrocode}
- \seq_if_exist:cF { g_@@_functions _ \l_@@_language_str _ seq }
- { \seq_new:c { g_@@_functions _ \l_@@_language_str _ seq } }
- \seq_gput_right:cn { g_@@_functions _ \l_@@_language_str _ seq } { #1 }
- }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\NewDocumentCommand \PitonClearUserFunctions { ! O { \l_@@_language_str } }
- {
- \seq_if_exist:cT { g_@@_functions _ #1 _ seq }
- {
- \seq_map_inline:cn { g_@@_functions _ #1 _ seq }
- { \cs_undefine:c { PitonIdentifier _ #1 _ ##1} }
- \seq_gclear:c { g_@@_functions _ #1 _ seq }
- }
- }
-% \end{macrocode}
-%
-% \bigskip
-% \subsubsection{Security}
-%
-% \begin{macrocode}
-\AddToHook { env / piton / begin }
- { \msg_fatal:nn { piton } { No~environment~piton } }
-
-\msg_new:nnn { piton } { No~environment~piton }
- {
- There~is~no~environment~piton!\\
- There~is~an~environment~{Piton}~and~a~command~
- \token_to_str:N \piton\ but~there~is~no~environment~
- {piton}.~This~error~is~fatal.
- }
-% \end{macrocode}
-%
-% \bigskip
-% \subsubsection{The error messages of the package}
-%
-% \begin{macrocode}
-\msg_new:nnnn { piton } { Unknown~key~for~PitonOptions }
- {
- Unknown~key. \\
- The~key~'\l_keys_key_str'~is~unknown~for~\token_to_str:N \PitonOptions.~
- It~will~be~ignored.\\
- For~a~list~of~the~available~keys,~type~H~<return>.
- }
- {
- The~available~keys~are~(in~alphabetic~order):~
- all-line-numbers,~
- auto-gobble,~
- background-color,~
- break-lines,~
- break-lines-in-piton,~
- break-lines-in-Piton,~
- continuation-symbol,~
- continuation-symbol-on-indentation,~
- end-of-broken-line,~
- env-gobble,~
- gobble,~
- identifiers,~
- indent-broken-lines,~
- language,~
- left-margin,~
- line-numbers,~
- prompt-background-color,~
- resume,~
- show-spaces,~
- show-spaces-in-strings,~
- slim,~
- splittable,~
- tabs-auto-gobble~
- and~tab-size.
- }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\msg_new:nnn { piton } { label~with~lines~numbers }
- {
- You~can't~use~the~command~\token_to_str:N \label\
- because~the~key~'line-numbers'~(or~'all-line-numbers')~
- is~not~active.\\
- If~you~go~on,~that~command~will~ignored.
- }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\msg_new:nnn { piton } { cr~not~allowed }
- {
- You~can't~put~any~carriage~return~in~the~argument~
- of~a~command~\c_backslash_str
- \l_@@_beamer_command_str\ within~an~
- environment~of~'piton'.~You~should~consider~using~the~
- corresponding~environment.\\
- That~error~is~fatal.
- }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\msg_new:nnn { piton } { overlay~without~beamer }
- {
- You~can't~use~an~argument~<...>~for~your~command~
- \token_to_str:N \PitonInputFile\ because~you~are~not~
- in~Beamer.\\
- If~you~go~on,~that~argument~will~be~ignored.
- }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\msg_new:nnn { Piton } { Python~error }
- { A~Python~error~has~been~detected. }
-% \end{macrocode}
-%
-% \bigskip
-% \subsection{The Lua part of the implementation}
-%
-% \bigskip
-% \begin{macrocode}
-\ExplSyntaxOff
-\RequirePackage{luacode}
-% \end{macrocode}
-%
-%
-% \bigskip
-% The Lua code will be loaded via a |{luacode*}| environment. The environment
-% is by itself a Lua block and the local declarations will be local to that
-% block. All the global functions (used by the L3 parts of the implementation)
-% will be put in a Lua table |piton|.
-%
-% \medskip
-% \begin{macrocode}
-\begin{luacode*}
-piton = piton or { }
-% \end{macrocode}
-%
-% \begin{macrocode}
-if piton.comment_latex == nil then piton.comment_latex = ">" end
-piton.comment_latex = "#" .. piton.comment_latex
-% \end{macrocode}
-%
-%
-% \bigskip
-% The following functions are an easy way to safely insert braces (|{| and |}|)
-% in the TeX flow.
-% \begin{macrocode}
-function piton.open_brace ()
- tex.sprint("{")
-end
-function piton.close_brace ()
- tex.sprint("}")
-end
-% \end{macrocode}
-%
-% \bigskip
-% \subsubsection{Special functions dealing with LPEG}
-%
-% \medskip
-% We will use the Lua library \pkg{lpeg} which is built in LuaTeX. That's why we
-% define first aliases for several functions of that library.
-% \begin{macrocode}
-local P, S, V, C, Ct, Cc = lpeg.P, lpeg.S, lpeg.V, lpeg.C, lpeg.Ct, lpeg.Cc
-local Cf, Cs , Cg , Cmt , Cb = lpeg.Cf, lpeg.Cs, lpeg.Cg , lpeg.Cmt , lpeg.Cb
-local R = lpeg.R
-% \end{macrocode}
-%
-%
-%
-% \bigskip
-% The function |Q| takes in as argument a pattern and returns a \textsc{lpeg}
-% \emph{which does a capture} of the pattern. That capture will be sent to LaTeX
-% with the catcode ``other'' for all the characters: it's suitable for elements
-% of the Python listings that \pkg{piton} will typeset verbatim (thanks to the
-% catcode ``other'').
-% \begin{macrocode}
-local function Q(pattern)
- return Ct ( Cc ( luatexbase.catcodetables.CatcodeTableOther ) * C ( pattern ) )
-end
-% \end{macrocode}
-%
-%
-% \bigskip
-% The function |L| takes in as argument a pattern and returns a \textsc{lpeg}
-% \emph{which does a capture} of the pattern. That capture will be sent to LaTeX
-% with standard LaTeX catcodes for all the characters: the elements captured
-% will be formatted as normal LaTeX codes. It's suitable for the ``LaTeX
-% comments'' in the environments |{Piton}| and the elements beetween
-% ``|escape-inside|''. That function won't be much used.
-% \begin{macrocode}
-local function L(pattern)
- return Ct ( C ( pattern ) )
-end
-% \end{macrocode}
-%
-% \bigskip
-% The function |Lc| (the c is for \emph{constant}) takes in as argument a string
-% and returns a \textsc{lpeg} \emph{with does a constant capture} which returns
-% that string. The elements captured will be formatted as L3 code. It will be
-% used to send to LaTeX all the formatting LaTeX instructions we have to insert
-% in order to do the syntactic highlighting (that's the main job of
-% \pkg{piton}). That function will be widely used.
-% \begin{macrocode}
-local function Lc(string)
- return Cc ( { luatexbase.catcodetables.expl , string } )
-end
-% \end{macrocode}
-%
-% \bigskip
-% The function |K| creates a \textsc{lpeg} which will return as capture the
-% whole LaTeX code corresponding to a Python chunk (that is to say with the
-% LaTeX formatting instructions corresponding to the syntactic nature of that
-% Python chunk). The first argument is a Lua string corresponding to the name of
-% a \pkg{piton} style and the second element is a pattern (that is to say a
-% \textsc{lpeg} without capture)
-% \begin{macrocode}
-local function K(style, pattern)
- return
- Lc ( "{\\PitonStyle{" .. style .. "}{" )
- * Q ( pattern )
- * Lc ( "}}" )
-end
-% \end{macrocode}
-% The formatting commands in a given \pkg{piton} style (eg. the style |Keyword|)
-% may be semi-global declarations (such as |\bfseries| or |\slshape|) or LaTeX
-% macros with an argument (such as |\fbox| or |\colorbox{yellow}|). In order to
-% deal with both syntaxes, we have used two pairs of braces:
-% |{\PitonStyle{Keyword}{|\texttt{\slshape text to format}|}}|.
-%
-%
-% \bigskip
-% \begin{macrocode}
-local function WithStyle(style,pattern)
- return
- Ct ( Cc "Open" * Cc ( "{\\PitonStyle{" .. style .. "}{" ) * Cc "}}" )
- * pattern
- * Ct ( Cc "Close" )
-end
-% \end{macrocode}
-%
-% \bigskip
-% The following \textsc{lpeg} catches the Python chunks which are in LaTeX
-% escapes (and that chunks will be considered as normal LaTeX constructions). We
-% recall that |piton.begin_espace| and |piton_end_escape| are Lua strings
-% corresponding to the key |escape-inside|\footnote{The \pkg{piton} key
-% |escape-inside| is available at load-time only.}. Since the elements that will
-% be catched must be sent to LaTeX with standard LaTeX catcodes, we put the
-% capture (done by the function |C|) in a table (by using |Ct|, which is an
-% alias for |lpeg.Ct|) without number of catcode table at the first component of
-% the table.
-% \begin{macrocode}
-local Escape =
- P(piton_begin_escape)
- * L ( ( 1 - P(piton_end_escape) ) ^ 1 )
- * P(piton_end_escape)
-% \end{macrocode}
-%
-% \vspace{1cm}
-% The following line is mandatory.
-% \begin{macrocode}
-lpeg.locale(lpeg)
-% \end{macrocode}
-%
-% \bigskip
-% \paragraph{The basic syntactic LPEG}
-%
-% \begin{macrocode}
-local alpha, digit = lpeg.alpha, lpeg.digit
-local space = P " "
-% \end{macrocode}
-%
-% Remember that, for \textsc{lpeg}, the Unicode characters such as |à|, |â|,
-% |ç|, etc. are in fact strings of length 2 (2 bytes) because \pkg{lpeg} is not
-% Unicode-aware.
-% \begin{macrocode}
-local letter = alpha + P "_"
- + P "â" + P "à" + P "ç" + P "é" + P "è" + P "ê" + P "ë" + P "ï" + P "î"
- + P "ô" + P "û" + P "ü" + P "Â" + P "À" + P "Ç" + P "É" + P "È" + P "Ê"
- + P "Ë" + P "Ï" + P "Î" + P "Ô" + P "Û" + P "Ü"
-
-local alphanum = letter + digit
-% \end{macrocode}
-%
-% \bigskip
-% The following \textsc{lpeg} |identifier| is a mere pattern (that is to say
-% more or less a regular expression) which matches the Python identifiers (hence
-% the name).
-% \begin{macrocode}
-local identifier = letter * alphanum ^ 0
-% \end{macrocode}
-%
-% \medskip
-% On the other hand, the \textsc{lpeg} |Identifier| (with a capital) also returns
-% a \emph{capture}.
-% \begin{macrocode}
-local Identifier = K ( 'Identifier' , identifier)
-% \end{macrocode}
-%
-% \bigskip
-% By convention, we will use names with an initial capital for \textsc{lpeg}
-% which return captures.
-%
-%
-% \bigskip
-% Here is the first use of our function~|K|. That function will be used to
-% construct \textsc{lpeg} which capture Python chunks for which we have a
-% dedicated \pkg{piton} style. For example, for the numbers, \pkg{piton}
-% provides a style which is called |Number|. The name of the style is provided
-% as a Lua string in the second argument of the function~|K|. By convention, we
-% use single quotes for delimiting the Lua strings which are names of
-% \pkg{piton} styles (but this is only a convention).
-% \begin{macrocode}
-local Number =
- K ( 'Number' ,
- ( digit^1 * P "." * digit^0 + digit^0 * P "." * digit^1 + digit^1 )
- * ( S "eE" * S "+-" ^ -1 * digit^1 ) ^ -1
- + digit^1
- )
-% \end{macrocode}
-%
-% \bigskip
-% We recall that |piton.begin_espace| and |piton_end_escape| are Lua strings
-% corresponding to the key |escape-inside|\footnote{The \pkg{piton} key
-% |escape-inside| is available at load-time only.}. Of course, if the final user
-% has not used the key |escape-inside|, these strings are empty.
-% \begin{macrocode}
-local Word
-if piton_begin_escape ~= ''
-then Word = Q ( ( ( 1 - space - P(piton_begin_escape) - P(piton_end_escape) )
- - S "'\"\r[()]" - digit ) ^ 1 )
-else Word = Q ( ( ( 1 - space ) - S "'\"\r[()]" - digit ) ^ 1 )
-end
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-local Space = ( Q " " ) ^ 1
-
-local SkipSpace = ( Q " " ) ^ 0
-
-local Punct = Q ( S ".,:;!" )
-
-local Tab = P "\t" * Lc ( '\\l_@@_tab_tl' )
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-local SpaceIndentation = Lc ( '\\@@_an_indentation_space:' ) * ( Q " " )
-% \end{macrocode}
-%
-%
-% \bigskip
-% \begin{macrocode}
-local Delim = Q ( S "[()]" )
-% \end{macrocode}
-%
-% \bigskip
-% The following \textsc{lpeg} catches a space (U+0020) and replace it by
-% |\l_@@_space_tl|. It will be used in the strings. Usually,
-% |\l_@@_space_tl| will contain a space and therefore there won't be difference.
-% However, when the key |show-spaces-in-strings| is in force, |\\l_@@_space_tl| will
-% contain ␣ (U+2423) in order to visualize the spaces.
-% \begin{macrocode}
-local VisualSpace = space * Lc "\\l_@@_space_tl"
-% \end{macrocode}
-%
-%
-% \bigskip
-% \subsubsection{The LPEG python}
-%
-% \bigskip
-% Some strings of length 2 are explicit because we want the corresponding
-% ligatures available in some fonts such as \emph{Fira Code} to be active.
-% \begin{macrocode}
-local Operator =
- K ( 'Operator' ,
- P "!=" + P "<>" + P "==" + P "<<" + P ">>" + P "<=" + P ">=" + P ":="
- + P "//" + P "**" + S "-~+/*%=<>&.@|"
- )
-
-local OperatorWord =
- K ( 'Operator.Word' ,P "in" + P "is" + P "and" + P "or" + P "not" )
-
-local Keyword =
- K ( 'Keyword' ,
- P "as" + P "assert" + P "break" + P "case" + P "class" + P "continue"
- + P "def" + P "del" + P "elif" + P "else" + P "except" + P "exec"
- + P "finally" + P "for" + P "from" + P "global" + P "if" + P "import"
- + P "lambda" + P "non local" + P "pass" + P "return" + P "try"
- + P "while" + P "with" + P "yield" + P "yield from" )
- + K ( 'Keyword.Constant' ,P "True" + P "False" + P "None" )
-
-local Builtin =
- K ( 'Name.Builtin' ,
- P "__import__" + P "abs" + P "all" + P "any" + P "bin" + P "bool"
- + P "bytearray" + P "bytes" + P "chr" + P "classmethod" + P "compile"
- + P "complex" + P "delattr" + P "dict" + P "dir" + P "divmod"
- + P "enumerate" + P "eval" + P "filter" + P "float" + P "format"
- + P "frozenset" + P "getattr" + P "globals" + P "hasattr" + P "hash"
- + P "hex" + P "id" + P "input" + P "int" + P "isinstance" + P "issubclass"
- + P "iter" + P "len" + P "list" + P "locals" + P "map" + P "max"
- + P "memoryview" + P "min" + P "next" + P "object" + P "oct" + P "open"
- + P "ord" + P "pow" + P "print" + P "property" + P "range" + P "repr"
- + P "reversed" + P "round" + P "set" + P "setattr" + P "slice" + P "sorted"
- + P "staticmethod" + P "str" + P "sum" + P "super" + P "tuple" + P "type"
- + P "vars" + P "zip" )
-
-
-local Exception =
- K ( 'Exception' ,
- P "ArithmeticError" + P "AssertionError" + P "AttributeError"
- + P "BaseException" + P "BufferError" + P "BytesWarning" + P "DeprecationWarning"
- + P "EOFError" + P "EnvironmentError" + P "Exception" + P "FloatingPointError"
- + P "FutureWarning" + P "GeneratorExit" + P "IOError" + P "ImportError"
- + P "ImportWarning" + P "IndentationError" + P "IndexError" + P "KeyError"
- + P "KeyboardInterrupt" + P "LookupError" + P "MemoryError" + P "NameError"
- + P "NotImplementedError" + P "OSError" + P "OverflowError"
- + P "PendingDeprecationWarning" + P "ReferenceError" + P "ResourceWarning"
- + P "RuntimeError" + P "RuntimeWarning" + P "StopIteration"
- + P "SyntaxError" + P "SyntaxWarning" + P "SystemError" + P "SystemExit"
- + P "TabError" + P "TypeError" + P "UnboundLocalError" + P "UnicodeDecodeError"
- + P "UnicodeEncodeError" + P "UnicodeError" + P "UnicodeTranslateError"
- + P "UnicodeWarning" + P "UserWarning" + P "ValueError" + P "VMSError"
- + P "Warning" + P "WindowsError" + P "ZeroDivisionError"
- + P "BlockingIOError" + P "ChildProcessError" + P "ConnectionError"
- + P "BrokenPipeError" + P "ConnectionAbortedError" + P "ConnectionRefusedError"
- + P "ConnectionResetError" + P "FileExistsError" + P "FileNotFoundError"
- + P "InterruptedError" + P "IsADirectoryError" + P "NotADirectoryError"
- + P "PermissionError" + P "ProcessLookupError" + P "TimeoutError"
- + P "StopAsyncIteration" + P "ModuleNotFoundError" + P "RecursionError" )
-
-
-local RaiseException = K ( 'Keyword' , P "raise" ) * SkipSpace * Exception * Q ( P "(" )
-
-% \end{macrocode}
-%
-% \bigskip
-% In Python, a ``decorator'' is a statement whose begins by |@| which patches
-% the function defined in the following statement.
-% \begin{macrocode}
-local Decorator = K ( 'Name.Decorator' , P "@" * letter^1 )
-% \end{macrocode}
-%
-% \bigskip
-% The following \textsc{lpeg} |DefClass| will be used to detect the definition of a
-% new class (the name of that new class will be formatted with the \pkg{piton}
-% style |Name.Class|).
-%
-% \smallskip
-% Example:\enskip \piton{class myclass:}
-% \begin{macrocode}
-local DefClass =
- K ( 'Keyword' , P "class" ) * Space * K ( 'Name.Class' , identifier )
-% \end{macrocode}
-%
-% If the word |class| is not followed by a identifier, it will be catched as
-% keyword by the \textsc{lpeg} |Keyword| (useful if we want to type a
-% list of keywords).
-%
-%
-% \bigskip
-% The following \textsc{lpeg} |ImportAs| is used for the lines beginning by |import|.
-% % We have to detect the potential keyword |as| because both the name of the
-% module and its alias must be formatted with the \pkg{piton} style |Name.Namespace|.
-%
-% \smallskip
-% Example:\enskip \piton{import numpy as np}
-%
-% \smallskip
-% Moreover, after the keyword |import|, it's possible to have a comma-separated
-% list of modules (if the keyword |as| is not used).
-%
-% \smallskip
-% Example:\enskip \piton{import math, numpy}
-% \begin{macrocode}
-local ImportAs =
- K ( 'Keyword' , P "import" )
- * Space
- * K ( 'Name.Namespace' ,
- identifier * ( P "." * identifier ) ^ 0 )
- * (
- ( Space * K ( 'Keyword' , P "as" ) * Space
- * K ( 'Name.Namespace' , identifier ) )
- +
- ( SkipSpace * Q ( P "," ) * SkipSpace
- * K ( 'Name.Namespace' , identifier ) ) ^ 0
- )
-% \end{macrocode}
-% Be careful: there is no commutativity of |+| in the previous expression.
-%
-% \bigskip
-% The \textsc{lpeg} |FromImport| is used for the lines beginning by |from|. We
-% need a special treatment because the identifier following the keyword |from|
-% must be formatted with the \pkg{piton} style |Name.Namespace| and the
-% following keyword |import| must be formatted with the \pkg{piton} style
-% |Keyword| and must \emph{not} be catched by the \textsc{lpeg} |ImportAs|.
-%
-% \smallskip
-% Example:\enskip \piton{from math import pi}
-%
-% \smallskip
-% \begin{macrocode}
-local FromImport =
- K ( 'Keyword' , P "from" )
- * Space * K ( 'Name.Namespace' , identifier )
- * Space * K ( 'Keyword' , P "import" )
-% \end{macrocode}
-%
-% \bigskip
-% \paragraph{The strings of Python}
-%
-% For the strings in Python, there are four categories of delimiters (without
-% counting the prefixes for f-strings and raw strings). We will use, in the
-% names of our \textsc{lpeg}, prefixes to distinguish the \textsc{lpeg} dealing
-% with that categories of strings, as presented in the following tabular.
-% \begin{center}
-% \begin{tabular}{ccc}
-% \toprule
-% & |Single| & |Double| \\
-% \midrule
-% |Short| & |'text'| & |"text"| \\
-% |Long| & |'''test'''| & |"""text"""| \\
-% \bottomrule
-% \end{tabular}
-% \end{center}
-%
-%
-% \bigskip
-% We have also to deal with the interpolations in the f-strings. Here
-% is an example of a f-string with an interpolation and a format
-% instruction\footnote{There is no special \pkg{piton} style for the formatting
-% instruction (after the colon): the style which will be applied will be the
-% style of the encompassing string, that is to say |String.Short| or
-% |String.Long|.} in that interpolation:
-%
-% \piton{f'Total price: {total+1:.2f} €'}
-%
-%
-% \bigskip
-% The interpolations beginning by |%| (even though there is more modern
-% technics now in Python).
-% \begin{macrocode}
-local PercentInterpol =
- K ( 'String.Interpol' ,
- P "%"
- * ( P "(" * alphanum ^ 1 * P ")" ) ^ -1
- * ( S "-#0 +" ) ^ 0
- * ( digit ^ 1 + P "*" ) ^ -1
- * ( P "." * ( digit ^ 1 + P "*" ) ) ^ -1
- * ( S "HlL" ) ^ -1
- * S "sdfFeExXorgiGauc%"
- )
-% \end{macrocode}
-%
-% \bigskip
-% We can now define the \textsc{lpeg} for the four kinds of strings. It's not
-% possible to use our function~|K| because of the interpolations which must be
-% formatted with another \pkg{piton} style that the rest of the
-% string.\footnote{The interpolations are formatted with the \pkg{piton} style
-% |Interpol.Inside|. The initial value of that style is \texttt{\textbackslash
-% @@\_piton:n} wich means that the interpolations are parsed once again by \pkg{piton}.}
-% \begin{macrocode}
-local SingleShortString =
- WithStyle ( 'String.Short' ,
-% \end{macrocode}
-% First, we deal with the f-strings of Python, which are prefixed by |f| or |F|.
-% \begin{macrocode}
- Q ( P "f'" + P "F'" )
- * (
- K ( 'String.Interpol' , P "{" )
- * K ( 'Interpol.Inside' , ( 1 - S "}':" ) ^ 0 )
- * Q ( P ":" * (1 - S "}:'") ^ 0 ) ^ -1
- * K ( 'String.Interpol' , P "}" )
- +
- VisualSpace
- +
- Q ( ( P "\\'" + P "{{" + P "}}" + 1 - S " {}'" ) ^ 1 )
- ) ^ 0
- * Q ( P "'" )
- +
-% \end{macrocode}
-% Now, we deal with the standard strings of Python, but also the ``raw strings''.
-% \begin{macrocode}
- Q ( P "'" + P "r'" + P "R'" )
- * ( Q ( ( P "\\'" + 1 - S " '\r%" ) ^ 1 )
- + VisualSpace
- + PercentInterpol
- + Q ( P "%" )
- ) ^ 0
- * Q ( P "'" ) )
-
-
-local DoubleShortString =
- WithStyle ( 'String.Short' ,
- Q ( P "f\"" + P "F\"" )
- * (
- K ( 'String.Interpol' , P "{" )
- * Q ( ( 1 - S "}\":" ) ^ 0 , 'Interpol.Inside' )
- * ( K ( 'String.Interpol' , P ":" ) * Q ( (1 - S "}:\"") ^ 0 ) ) ^ -1
- * K ( 'String.Interpol' , P "}" )
- +
- VisualSpace
- +
- Q ( ( P "\\\"" + P "{{" + P "}}" + 1 - S " {}\"" ) ^ 1 )
- ) ^ 0
- * Q ( P "\"" )
- +
- Q ( P "\"" + P "r\"" + P "R\"" )
- * ( Q ( ( P "\\\"" + 1 - S " \"\r%" ) ^ 1 )
- + VisualSpace
- + PercentInterpol
- + Q ( P "%" )
- ) ^ 0
- * Q ( P "\"" ) )
-
-local ShortString = SingleShortString + DoubleShortString
-% \end{macrocode}
-%
-% \bigskip
-% \paragraph{Beamer}
-%
-% The following \textsc{lpeg} |BalancedBraces| will be used for the (mandatory)
-% argument of the commands |\only| and \emph{al.} of Beamer. It's necessary to
-% use a \emph{grammar} because that pattern mainly checks the correct nesting of
-% the delimiters (and it's known in the theory of formal languages that this
-% can't be done with regular expressions \emph{stricto sensu} only).
-% \begin{macrocode}
-local BalancedBraces =
- P { "E" ,
- E =
- (
- P "{" * V "E" * P "}"
- +
- ShortString
- +
- ( 1 - S "{}" )
- ) ^ 0
- }
-% \end{macrocode}
-%
-%
-% \bigskip
-% If Beamer is used (or if the key |beamer| is used at load-time), the following
-% LPEG will be redefined.
-% \begin{macrocode}
-local Beamer = P ( false )
-local BeamerBeginEnvironments = P ( true )
-local BeamerEndEnvironments = P ( true )
-local BeamerNamesEnvironments =
- P "uncoverenv" + P "onlyenv" + P "visibleenv" + P "invisibleenv"
- + P "alertenv" + P "actionenv"
-
-% \end{macrocode}
-%
-% \begin{macrocode}
-UserCommands =
- Ct ( Cc "Open" * C ( "\\emph{" ) * Cc "}" )
- * ( C ( BalancedBraces ) / (function (s) return MainLoopPython:match(s) end ) )
- * P "}" * Ct ( Cc "Close" )
-% \end{macrocode}
-%
-% \begin{macrocode}
-function OneBeamerEnvironment(name)
- return
- Ct ( Cc "Open"
- * C (
- P ( "\\begin{" .. name .. "}" )
- * ( P "<" * (1 - P ">") ^ 0 * P ">" ) ^ -1
- )
- * Cc ( "\\end{" .. name .. "}" )
- )
- * (
- C ( ( 1 - P ( "\\end{" .. name .. "}" ) ) ^ 0 )
- / (function (s) return MainLoopPython:match(s) end )
- )
- * P ( "\\end{" .. name .. "}" ) * Ct ( Cc "Close" )
-end
-% \end{macrocode}
-%
-%
-% \bigskip
-% \begin{macrocode}
-if piton_beamer
-then
- Beamer =
- L ( P "\\pause" * ( P "[" * (1 - P "]") ^ 0 * P "]" ) ^ -1 )
- +
- Ct ( Cc "Open"
- * C (
- (
- P "\\uncover" + P "\\only" + P "\\alert" + P "\\visible"
- + P "\\invisible" + P "\\action"
- )
- * ( P "<" * (1 - P ">") ^ 0 * P ">" ) ^ -1
- * P "{"
- )
- * Cc "}"
- )
- * ( C ( BalancedBraces ) / (function (s) return MainLoopPython:match(s) end ) )
- * P "}" * Ct ( Cc "Close" )
- +
- OneBeamerEnvironment "uncoverenv"
- + OneBeamerEnvironment "onlyenv"
- + OneBeamerEnvironment "visibleenv"
- + OneBeamerEnvironment "invisibleenv"
- + OneBeamerEnvironment "alertenv"
- + OneBeamerEnvironment "actionenv"
- +
- L (
-% \end{macrocode}
-% For |\\alt|, the specification of the overlays (between angular brackets) is mandatory.
-% \begin{macrocode}
- ( P "\\alt" )
- * P "<" * (1 - P ">") ^ 0 * P ">"
- * P "{"
- )
- * K ( 'ParseAgain.noCR' , BalancedBraces )
- * L ( P "}{" )
- * K ( 'ParseAgain.noCR' , BalancedBraces )
- * L ( P "}" )
- +
- L (
-% \end{macrocode}
-% For |\\alt|, the specification of the overlays (between angular brackets) is mandatory.
-% \begin{macrocode}
- ( P "\\temporal" )
- * P "<" * (1 - P ">") ^ 0 * P ">"
- * P "{"
- )
- * K ( 'ParseAgain.noCR' , BalancedBraces )
- * L ( P "}{" )
- * K ( 'ParseAgain.noCR' , BalancedBraces )
- * L ( P "}{" )
- * K ( 'ParseAgain.noCR' , BalancedBraces )
- * L ( P "}" )
-% \end{macrocode}
-% Now for the environemnts.
-% \begin{macrocode}
- BeamerBeginEnvironments =
- ( space ^ 0 *
- L
- (
- P "\\begin{" * BeamerNamesEnvironments * "}"
- * ( P "<" * ( 1 - P ">") ^ 0 * P ">" ) ^ -1
- )
- * P "\r"
- ) ^ 0
- BeamerEndEnvironments =
- ( space ^ 0 *
- L ( P "\\end{" * BeamerNamesEnvironments * P "}" )
- * P "\r"
- ) ^ 0
-end
-% \end{macrocode}
-%
-% \bigskip
-% \paragraph{EOL}
-%
-% \bigskip
-% The following LPEG will detect the Python prompts when the user is typesetting
-% an interactive session of Python (directly or through |{pyconsole}| of
-% \pkg{pyluatex}). We have to detect that prompt twice. The first detection
-% (called \emph{hasty detection}) will be before the |\@@_begin_line:| because
-% you want to trigger a special background color for that row (and, after the
-% |\@@_begin_line:|, it's too late to change de background).
-% \begin{macrocode}
-local PromptHastyDetection = ( # ( P ">>>" + P "..." ) * Lc ( '\\@@_prompt:' ) ) ^ -1
-% \end{macrocode}
-% We remind that the marker |#| of \textsc{lpeg} specifies that the pattern will be
-% detected but won't consume any character.
-%
-% \medskip
-% With the following \textsc{lpeg}, a style will actually be applied to the
-% prompt (for instance, it's possible to decide to discard these prompts).
-% \begin{macrocode}
-local Prompt = K ( 'Prompt' , ( ( P ">>>" + P "..." ) * P " " ^ -1 ) ^ -1 )
-% \end{macrocode}
-%
-%
-%
-% \bigskip
-% The following \textsc{lpeg} |EOL| is for the end of lines.
-% \begin{macrocode}
-local EOL =
- P "\r"
- *
- (
- ( space^0 * -1 )
- +
-% \end{macrocode}
-% We recall that each line in the Python code we have to parse will be sent
-% back to LaTeX between a pair |\@@_begin_line:| --
-% |\@@_end_line:|\footnote{Remember that the \texttt{\textbackslash
-% @@\_end\_line:} must be explicit because it will be used as marker in order to
-% delimit the argument of the command \texttt{\textbackslash @@\_begin\_line:}}.
-% \begin{macrocode}
- Ct (
- Cc "EOL"
- *
- Ct (
- Lc "\\@@_end_line:"
- * BeamerEndEnvironments
- * BeamerBeginEnvironments
- * PromptHastyDetection
- * Lc "\\@@_newline: \\@@_begin_line:"
- * Prompt
- )
- )
- )
- *
- SpaceIndentation ^ 0
-% \end{macrocode}
-%
-%
-% \bigskip
-% \paragraph{The long strings}
-%
-%
-% \begin{macrocode}
-local SingleLongString =
- WithStyle ( 'String.Long' ,
- ( Q ( S "fF" * P "'''" )
- * (
- K ( 'String.Interpol' , P "{" )
- * K ( 'Interpol.Inside' , ( 1 - S "}:\r" - P "'''" ) ^ 0 )
- * Q ( P ":" * (1 - S "}:\r" - P "'''" ) ^ 0 ) ^ -1
- * K ( 'String.Interpol' , P "}" )
- +
- Q ( ( 1 - P "'''" - S "{}'\r" ) ^ 1 )
- +
- EOL
- ) ^ 0
- +
- Q ( ( S "rR" ) ^ -1 * P "'''" )
- * (
- Q ( ( 1 - P "'''" - S "\r%" ) ^ 1 )
- +
- PercentInterpol
- +
- P "%"
- +
- EOL
- ) ^ 0
- )
- * Q ( P "'''" ) )
-
-
-local DoubleLongString =
- WithStyle ( 'String.Long' ,
- (
- Q ( S "fF" * P "\"\"\"" )
- * (
- K ( 'String.Interpol', P "{" )
- * K ( 'Interpol.Inside' , ( 1 - S "}:\r" - P "\"\"\"" ) ^ 0 )
- * Q ( P ":" * (1 - S "}:\r" - P "\"\"\"" ) ^ 0 ) ^ -1
- * K ( 'String.Interpol' , P "}" )
- +
- Q ( ( 1 - P "\"\"\"" - S "{}\"\r" ) ^ 1 )
- +
- EOL
- ) ^ 0
- +
- Q ( ( S "rR" ) ^ -1 * P "\"\"\"" )
- * (
- Q ( ( 1 - P "\"\"\"" - S "%\r" ) ^ 1 )
- +
- PercentInterpol
- +
- P "%"
- +
- EOL
- ) ^ 0
- )
- * Q ( P "\"\"\"" )
- )
-% \end{macrocode}
-%
-% \begin{macrocode}
-local LongString = SingleLongString + DoubleLongString
-% \end{macrocode}
-%
-% \bigskip
-% We have a \textsc{lpeg} for the Python docstrings. That \textsc{lpeg} will
-% be used in the \textsc{lpeg} |DefFunction| which deals with the whole preamble
-% of a function definition (which begins with |def|).
-% \begin{macrocode}
-local StringDoc =
- K ( 'String.Doc' , P "\"\"\"" )
- * ( K ( 'String.Doc' , (1 - P "\"\"\"" - P "\r" ) ^ 0 ) * EOL
- * Tab ^ 0
- ) ^ 0
- * K ( 'String.Doc' , ( 1 - P "\"\"\"" - P "\r" ) ^ 0 * P "\"\"\"" )
-% \end{macrocode}
-%
-% \bigskip
-% \paragraph{The comments in the Python listings}
-%
-% We define different \textsc{lpeg} dealing with comments in the Python
-% listings.
-% \begin{macrocode}
-local CommentMath =
- P "$" * K ( 'Comment.Math' , ( 1 - S "$\r" ) ^ 1 ) * P "$"
-
-local Comment =
- WithStyle ( 'Comment' ,
- Q ( P "#" )
- * ( CommentMath + Q ( ( 1 - S "$\r" ) ^ 1 ) ) ^ 0 )
- * ( EOL + -1 )
-% \end{macrocode}
-%
-%
-%
-% \bigskip
-% The following \textsc{lpeg} |CommentLaTeX| is for what is called in that
-% document the ``LaTeX comments''. Since the elements that will be catched must
-% be sent to LaTeX with standard LaTeX catcodes, we put the capture (done by
-% the function~|C|) in a table (by using~|Ct|, which is an alias for |lpeg.Ct|).
-% \begin{macrocode}
-local CommentLaTeX =
- P(piton.comment_latex)
- * Lc "{\\PitonStyle{Comment.LaTeX}{\\ignorespaces"
- * L ( ( 1 - P "\r" ) ^ 0 )
- * Lc "}}"
- * ( EOL + -1 ) -- you could put EOL instead of EOL
-% \end{macrocode}
-%
-% \bigskip
-% \paragraph{DefFunction}
-%
-% The following \textsc{lpeg} |Expression| will be used for the parameters in
-% the \emph{argspec} of a Python function. It's necessary to use a \emph{grammar}
-% because that pattern mainly checks the correct nesting of the delimiters
-% (and it's known in the theory of formal languages that this can't be done with
-% regular expressions \emph{stricto sensu} only).
-% \begin{macrocode}
-local Expression =
- P { "E" ,
- E = ( 1 - S "{}()[]\r," ) ^ 0
- * (
- ( P "{" * V "F" * P "}"
- + P "(" * V "F" * P ")"
- + P "[" * V "F" * P "]" ) * ( 1 - S "{}()[]\r," ) ^ 0
- ) ^ 0 ,
- F = ( 1 - S "{}()[]\r\"'" ) ^ 0
- * ( (
- P "'" * (P "\\'" + 1 - S"'\r" )^0 * P "'"
- + P "\"" * (P "\\\"" + 1 - S"\"\r" )^0 * P "\""
- + P "{" * V "F" * P "}"
- + P "(" * V "F" * P ")"
- + P "[" * V "F" * P "]"
- ) * ( 1 - S "{}()[]\r\"'" ) ^ 0 ) ^ 0 ,
- }
-% \end{macrocode}
-%
-% \bigskip
-% We will now define a \textsc{lpeg} |Params| that will catch the list of
-% parameters (that is to say the \emph{argspec}) in the definition of a Python
-% function. For example, in the line of code
-% \begin{center}
-% \piton{def MyFunction(a,b,x=10,n:int): return n}
-% \end{center}
-% the \textsc{lpeg} |Params| will be used to catch the chunk\enskip |a,b,x=10,n:int|.
-%
-% Or course, a |Params| is simply a comma-separated list of |Param|, and that's
-% why we define first the \textsc{lpeg} |Param|.
-%
-% \medskip
-% \begin{macrocode}
-local Param =
- SkipSpace * Identifier * SkipSpace
- * (
- K ( 'InitialValues' , P "=" * Expression )
- + Q ( P ":" ) * SkipSpace * K ( 'Name.Type' , letter^1 )
- ) ^ -1
-% \end{macrocode}
-%
-% \medskip
-% \begin{macrocode}
-local Params = ( Param * ( Q "," * Param ) ^ 0 ) ^ -1
-% \end{macrocode}
-%
-% \bigskip
-% The following \textsc{lpeg} |DefFunction| catches a keyword |def| and the
-% following name of function \emph{but also everything else until a potential
-% docstring}. That's why this definition of \textsc{lpeg} must occur (in the file
-% |piton.sty|) after the definition of several other \textsc{lpeg} such as
-% |Comment|, |CommentLaTeX|, |Params|, |StringDoc|...
-% \begin{macrocode}
-local DefFunction =
- K ( 'Keyword' , P "def" )
- * Space
- * K ( 'Name.Function.Internal' , identifier )
- * SkipSpace
- * Q ( P "(" ) * Params * Q ( P ")" )
- * SkipSpace
- * ( Q ( P "->" ) * SkipSpace * K ( 'Name.Type' , identifier ) ) ^ -1
-% \end{macrocode}
-% Here, we need a \pkg{piton} style |ParseAgain| which will be linked to
-% |\@@_piton:n| (that means that the capture will be parsed once again by
-% \pkg{piton}). We could avoid that kind of trick by using a non-terminal of a
-% grammar but we have probably here a better legibility.
-% \begin{macrocode}
- * K ( 'ParseAgain' , ( 1 - S ":\r" )^0 )
- * Q ( P ":" )
- * ( SkipSpace
- * ( EOL + CommentLaTeX + Comment ) -- in all cases, that contains an EOL
- * Tab ^ 0
- * SkipSpace
- * StringDoc ^ 0 -- there may be additionnal docstrings
- ) ^ -1
-% \end{macrocode}
-% Remark that, in the previous code, |CommentLaTeX| \emph{must} appear
-% before |Comment|: there is no commutativity of the addition for the
-% \emph{parsing expression grammars} (\textsc{peg}).
-%
-% \smallskip
-% If the word |def| is not followed by an identifier and parenthesis, it will be
-% catched as keyword by the \textsc{lpeg} |Keyword| (useful if, for example, the
-% final user wants to speak of the keyword \piton{def}).
-%
-% \bigskip
-% \paragraph{The dictionaries of Python}
-%
-% We have \textsc{lpeg} dealing with dictionaries of Python because, in
-% typesettings of explicit Python dictionaries, one may prefer to have all the
-% values formatted in black (in order to see more clearly the keys which are
-% usually Python strings). That's why we have a \pkg{piton} style |Dict.Value|.
-%
-% The initial value of that \pkg{piton} style is |\@@_piton:n|, which means that
-% the value of the entry of the dictionary is parsed once again by \pkg{piton}
-% (and nothing special is done for the dictionary). In the following example, we
-% have set the \pkg{piton} style |Dict.Value| to |\color{black}|:
-%
-% \medskip
-% \begingroup
-% \SetPitonStyle{Dict.Value = \color{black}}
-% \piton{mydict = { 'name' : 'Paul', 'sex' : 'male', 'age' : 31 } }
-% \endgroup
-%
-% \medskip
-% At this time, this mechanism works only for explicit dictionaries on a single line!
-%
-% \begin{macrocode}
-local ItemDict =
- ShortString * SkipSpace * Q ( P ":" ) * K ( 'Dict.Value' , Expression )
-
-local ItemOfSet = SkipSpace * ( ItemDict + ShortString ) * SkipSpace
-
-local Set =
- Q ( P "{" )
- * ItemOfSet * ( Q ( P "," ) * ItemOfSet ) ^ 0
- * Q ( P "}" )
-% \end{macrocode}
-%
-% \paragraph{Miscellaneous}
-%
-% \begin{macrocode}
-local ExceptionInConsole = Exception * Q ( ( 1 - P "\r" ) ^ 0 ) * EOL
-% \end{macrocode}
-%
-%
-% \bigskip
-% \paragraph{The main LPEG}
-%
-% First, the main loop :
-% \begin{macrocode}
-MainLoopPython =
- ( ( space^1 * -1 )
- + EOL
- + Space
- + Tab
- + Escape
- + CommentLaTeX
- + Beamer
- + UserCommands
- + LongString
- + Comment
- + ExceptionInConsole
- + Set
- + Delim
-% \end{macrocode}
-% |Operator| must be before |Punct|.
-% \begin{macrocode}
- + Operator
- + ShortString
- + Punct
- + FromImport
- + RaiseException
- + DefFunction
- + DefClass
- + Keyword * ( Space + Punct + Delim + EOL+ -1 )
- + Decorator
- + OperatorWord * ( Space + Punct + Delim + EOL+ -1 )
- + Builtin * ( Space + Punct + Delim + EOL+ -1 )
- + Identifier
- + Number
- + Word
- ) ^ 0
-% \end{macrocode}
-%
-% \bigskip
-% We recall that each line in the Python code to parse will be sent back to
-% LaTeX between a pair |\@@_begin_line:| -- |\@@_end_line:|\footnote{Remember
-% that the \texttt{\textbackslash @@\_end\_line:} must be explicit because it
-% will be used as marker in order to delimit the argument of the command
-% \texttt{\textbackslash @@\_begin\_line:}}.
-% \begin{macrocode}
-local python = P ( true )
-
-python =
- Ct (
- ( ( space - P "\r" ) ^0 * P "\r" ) ^ -1
- * BeamerBeginEnvironments
- * PromptHastyDetection
- * Lc '\\@@_begin_line:'
- * Prompt
- * SpaceIndentation ^ 0
- * MainLoopPython
- * -1
- * Lc '\\@@_end_line:'
- )
-% \end{macrocode}
-%
-% \begin{macrocode}
-local languages = { }
-languages['python'] = python
-% \end{macrocode}
-%
-% % \bigskip
-% \subsubsection{The LPEG ocaml}
-%
-% \begin{macrocode}
-local Delim = Q ( P "[|" + P "|]" + S "[()]" )
-% \end{macrocode}
-%
-% \begin{macrocode}
-local Punct = Q ( S ",:;!" )
-% \end{macrocode}
-%
-% \begin{macrocode}
-local identifier =
- ( R "az" + R "AZ" + P "_") * ( R "az" + R "AZ" + S "_'" + digit ) ^ 0
-
-local Identifier = K ( 'Identifier' , identifier )
-
-local Operator =
- K ( 'Operator' ,
- P "!=" + P "<>" + P "==" + P "<<" + P ">>" + P "<=" + P ">=" + P ":="
- + P "||" + P "&&" + P "//" + P "**" + P ";;" + P "::" + P "->"
- + P "+." + P "-." + P "*." + P "/."
- + S "-~+/*%=<>&@|"
- )
-
-local OperatorWord =
- K ( 'Operator.Word' ,
- P "and" + P "asr" + P "land" + P "lor" + P "lsl" + P "lxor"
- + P "mod" + P "or" )
-
-local Keyword =
- K ( 'Keyword' ,
- P "as" + P "assert" + P "begin" + P "class" + P "constraint" + P "done"
- + P "do" + P "downto" + P "else" + P "end" + P "exception" + P "external"
- + P "false" + P "for" + P "function" + P "fun" + P "functor" + P "if"
- + P "in" + P "include" + P "inherit" + P "initializer" + P "lazy" + P "let"
- + P "match" + P "method" + P "module" + P "mutable" + P "new" + P "object"
- + P "of" + P "open" + P "private" + P "raise" + P "rec" + P "sig"
- + P "struct" + P "then" + P "to" + P "true" + P "try" + P "type"
- + P "value" + P "val" + P "virtual" + P "when" + P "while" + P "with" )
- + K ( 'Keyword.Constant' , P "true" + P "false" )
-
-
-local Builtin =
- K ( 'Name.Builtin' ,
- P "not" + P "incr" + P "decr" + P "fst" + P "snd"
- + P "String.length"
- + P "List.tl" + P "List.hd" + P "List.mem" + P "List.exists"
- + P "List.for_all" + P "List.filter" + P "List.length" + P "List.map"
- + P "List.iter"
- + P "Array.length" + P "Array.make" + P "Array.make_matrix"
- + P "Array.init" + P "Array.copy" + P "Array.copy" + P "Array.mem"
- + P "Array.exists" + P "Array.for_all" + P "Array.map" + P "Array.iter"
- + P "Queue.create" + P "Queue.is_empty" + P "Queue.push" + P "Queue.pop"
- + P "Stack.create" + P "Stack.is_empty" + P "Stack.push" + P "Stack.pop"
- + P "Hashtbl.create" + P "Hashtbl.add" + P "Hashtbl.remove"
- + P "Hashtbl.mem" + P "Hashtbl.find" + P "Hashtbl.find_opt"
- + P "Hashtbl.iter" )
-% \end{macrocode}
-%
-% \bigskip
-% The following exceptions are exceptions in the standard library of OCaml (Stdlib).
-% \begin{macrocode}
-local Exception =
- K ( 'Exception' ,
- P "Division_by_zero" + P "End_of_File" + P "Failure"
- + P "Invalid_argument" + P "Match_failure" + P "Not_found"
- + P "Out_of_memory" + P "Stack_overflow" + P "Sys_blocked_io"
- + P "Sys_error" + P "Undefined_recursive_module" )
-% \end{macrocode}
-%
-% \bigskip
-% \paragraph{The characters in OCaml}
-%
-% \begin{macrocode}
-local Char =
- K ( 'String.Short' , P "'" * ( ( 1 - P "'" ) ^ 0 + P "\\'" ) * P "'" )
-% \end{macrocode}
-%
-%
-% \bigskip
-% \paragraph{Beamer}
-%
-% \begin{macrocode}
-local BalancedBraces =
- P { "E" ,
- E =
- (
- P "{" * V "E" * P "}"
- +
- P "\"" * ( 1 - S "\"" ) ^ 0 * P "\"" -- OCaml strings
- +
- ( 1 - S "{}" )
- ) ^ 0
- }
-% \end{macrocode}
-%
-%
-% \begin{macrocode}
-if piton_beamer
-then
- Beamer =
- L ( P "\\pause" * ( P "[" * (1 - P "]") ^ 0 * P "]" ) ^ -1 )
- +
- ( P "\\uncover" * Lc ( '\\@@_beamer_command:n{uncover}' )
- + P "\\only" * Lc ( '\\@@_beamer_command:n{only}' )
- + P "\\alert" * Lc ( '\\@@_beamer_command:n{alert}' )
- + P "\\visible" * Lc ( '\\@@_beamer_command:n{visible}' )
- + P "\\invisible" * Lc ( '\\@@_beamer_command:n{invisible}' )
- + P "\\action" * Lc ( '\\@@_beamer_command:n{action}' )
- )
- *
- L ( ( P "<" * (1 - P ">") ^ 0 * P ">" ) ^ -1 * P "{" )
- * K ( 'ParseAgain.noCR' , BalancedBraces )
- * L ( P "}" )
- +
- L (
- ( P "\\alt" )
- * P "<" * (1 - P ">") ^ 0 * P ">"
- * P "{"
- )
- * K ( 'ParseAgain.noCR' , BalancedBraces )
- * L ( P "}{" )
- * K ( 'ParseAgain.noCR' , BalancedBraces )
- * L ( P "}" )
- +
- L (
- ( P "\\temporal" )
- * P "<" * (1 - P ">") ^ 0 * P ">"
- * P "{"
- )
- * K ( 'ParseAgain.noCR' , BalancedBraces )
- * L ( P "}{" )
- * K ( 'ParseAgain.noCR' , BalancedBraces )
- * L ( P "}{" )
- * K ( 'ParseAgain.noCR' , BalancedBraces )
- * L ( P "}" )
- BeamerBeginEnvironments =
- ( space ^ 0 *
- L
- (
- P "\\begin{" * BeamerNamesEnvironments * "}"
- * ( P "<" * ( 1 - P ">") ^ 0 * P ">" ) ^ -1
- )
- * P "\r"
- ) ^ 0
- BeamerEndEnvironments =
- ( space ^ 0 *
- L ( P "\\end{" * BeamerNamesEnvironments * P "}" )
- * P "\r"
- ) ^ 0
-end
-% \end{macrocode}
-%
-% \bigskip
-% \paragraph{EOL}
-% \begin{macrocode}
-local EOL =
- P "\r"
- *
- (
- ( space^0 * -1 )
- +
- Ct (
- Cc "EOL"
- *
- Ct (
- Lc "\\@@_end_line:"
- * BeamerEndEnvironments
- * BeamerBeginEnvironments
- * PromptHastyDetection
- * Lc "\\@@_newline: \\@@_begin_line:"
- * Prompt
- )
- )
- )
- *
- SpaceIndentation ^ 0
-% \end{macrocode}
-%
-%
-% \begin{macrocode}
-%
-% \paragraph{The strings}
-%
-% We need a pattern |string| without captures because it will be used within the
-% comments of OCaml.
-% \begin{macrocode}
-local string =
- Q ( P "\"" )
- * (
- VisualSpace
- +
- Q ( ( 1 - S " \"\r" ) ^ 1 )
- +
- EOL
- ) ^ 0
- * Q ( P "\"" )
-% \end{macrocode}
-%
-% \begin{macrocode}
-local String = WithStyle ( 'String.Long' , string )
-% \end{macrocode}
-%
-%
-% \bigskip
-% Now, the ``quoted strings'' of OCaml (for example \verb+{ext|Essai|ext}+).
-%
-% For those strings, we will do two consecutive analysis. First an analysis to
-% determine the whole string and, then, an analysis for the potential visual
-% spaces and the EOL in the string.
-%
-% The first analysis require a match-time capture. For explanations about that
-% programmation, see the paragraphe \emph{Lua's long % strings} in
-% |www.inf.puc-rio.br/~roberto/lpeg|.
-% \begin{macrocode}
-local ext = ( R "az" + P "_" ) ^ 0
-local open = "{" * Cg(ext, 'init') * "|"
-local close = "|" * C(ext) * "}"
-local closeeq =
- Cmt ( close * Cb('init'),
- function (s, i, a, b) return a==b end )
-% \end{macrocode}
-%
-% \medskip
-% The \textsc{lpeg} |QuotedStringBis| will do the second analysis.
-% \begin{macrocode}
-local QuotedStringBis =
- WithStyle ( 'String.Long' ,
- (
- VisualSpace
- +
- Q ( ( 1 - S " \r" ) ^ 1 )
- +
- EOL
- ) ^ 0 )
-
-% \end{macrocode}
-%
-% \medskip
-% We use a ``function capture'' (as called in the official documentation of the
-% \textsc{lpeg}) in order to do the second analysis on the result of the first one.
-% \begin{macrocode}
-local QuotedString =
- C ( open * ( 1 - closeeq ) ^ 0 * close ) /
- ( function (s) return QuotedStringBis : match(s) end )
-% \end{macrocode}
-%
-%
-% \bigskip
-% \paragraph{The comments in the OCaml listings}
-%
-% In OCaml, the delimiters for the comments are |(*| and |*)|. There are
-% unsymmetrical and, therefore, the comments may be nested. That's why we need a
-% grammar.
-%
-% In these comments, we embed the math comments (between |$| and |$|) and we
-% embed also a treatment for the end of lines (since the comments may be multi-lines).
-%
-% \begin{macrocode}
-local Comment =
- WithStyle ( 'Comment' ,
- P {
- "A" ,
- A = Q "(*"
- * ( V "A"
- + Q ( ( 1 - P "(*" - P "*)" - S "\r$\"" ) ^ 1 ) -- $
- + string
- + P "$" * K ( 'Comment.Math' , ( 1 - S "$\r" ) ^ 1 ) * P "$" -- $
- + EOL
- ) ^ 0
- * Q "*)"
- } )
-% \end{macrocode}
-%
-% \bigskip
-% \paragraph{The DefFunction}
-%
-% \begin{macrocode}
-local DefFunction =
- K ( 'Keyword' , P "let rec" + P "let" + P "and" )
- * Space
- * K ( 'Name.Function.Internal' , identifier )
- * Space
- * # ( P "=" * space * P "function" + ( 1 - P "=" ) )
-% \end{macrocode}
-%
-% \bigskip
-% \paragraph{The parameters of the types}
-%
-% \begin{macrocode}
-local TypeParameter = K ( 'TypeParameter' , P "'" * alpha * # ( 1 - P "'" ) )
-% \end{macrocode}
-%
-% \bigskip
-% \paragraph{The main LPEG}
-%
-% First, the main loop :
-% \begin{macrocode}
-MainLoopOCaml =
- ( ( space^1 * -1 )
- + EOL
- + Space
- + Tab
- + Escape
- + Beamer
- + TypeParameter
- + String + QuotedString + Char
- + Comment
- + Delim
- + Operator
- + Punct
- + FromImport
- + ImportAs
- + Exception
- + DefFunction
- + Keyword * ( Space + Punct + Delim + EOL + -1 )
- + OperatorWord * ( Space + Punct + Delim + EOL + -1 )
- + Builtin * ( Space + Punct + Delim + EOL + -1 )
- + Identifier
- + Number
- + Word
- ) ^ 0
-% \end{macrocode}
-%
-% \bigskip
-% We recall that each line in the Python code to parse will be sent back to
-% LaTeX between a pair |\@@_begin_line:| -- |\@@_end_line:|\footnote{Remember
-% that the \texttt{\textbackslash @@\_end\_line:} must be explicit because it
-% will be used as marker in order to delimit the argument of the command
-% \texttt{\textbackslash @@\_begin\_line:}}.
-% \begin{macrocode}
-local ocaml = P ( true )
-
-ocaml =
- Ct (
- ( ( space - P "\r" ) ^0 * P "\r" ) ^ -1
- * BeamerBeginEnvironments
- * Lc ( '\\@@_begin_line:' )
- * SpaceIndentation ^ 0
- * MainLoopOCaml
- * -1
- * Lc ( '\\@@_end_line:' )
- )
-% \end{macrocode}
-%
-% \begin{macrocode}
-languages['ocaml'] = ocaml
-% \end{macrocode}
-%
-% \bigskip
-% \subsubsection{The function Parse}
-%
-%
-% The function |Parse| is the main function of the package \pkg{piton}.
-% It parses its argument and sends back to LaTeX the code with interlaced
-% formatting LaTeX instructions. In fact, everything is done by the
-% \textsc{lpeg} |python| which returns as capture a Lua table containing
-% data to send to LaTeX.
-%
-% \bigskip
-% \begin{macrocode}
-function piton.Parse(language,code)
- local t = languages[language] : match ( code )
- local left_stack = {}
- local right_stack = {}
- for _ , one_item in ipairs(t)
- do
- if one_item[1] == "EOL"
- then
- for _ , s in ipairs(right_stack)
- do tex.sprint( s )
- end
- for _ , s in ipairs(one_item[2])
- do tex.tprint(s)
- end
- for _ , s in ipairs(left_stack)
- do tex.sprint( s )
- end
- else
- if one_item[1] == "Open"
- then
- tex.sprint( one_item[2] )
- table.insert(left_stack,one_item[2])
- table.insert(right_stack,one_item[3])
- else
- if one_item[1] == "Close"
- then
- tex.sprint( right_stack[#right_stack] )
- left_stack[#left_stack] = nil
- right_stack[#right_stack] = nil
- else
- tex.tprint(one_item)
- end
- end
- end
- end
-end
-% \end{macrocode}
-%
-%
-%
-% \bigskip
-% The function |ParseFile| will be used by the LaTeX command |\PitonInputFile|.
-% That function merely reads the whole file (that is to say all its lines) and
-% then apply the function~|Parse| to the resulting Lua string.
-% \begin{macrocode}
-function piton.ParseFile(language,name,first_line,last_line)
- s = ''
- local i = 0
- for line in io.lines(name)
- do i = i + 1
- if i >= first_line
- then s = s .. '\r' .. line
- end
- if i >= last_line then break end
- end
- piton.Parse(language,s)
-end
-% \end{macrocode}
-%
-% \bigskip
-% \subsubsection{Two variants of the function Parse with integrated preprocessors}
-%
-% The following command will be used by the user command |\piton|.
-% For that command, we have to undo the duplication of the symbols |#|.
-% \begin{macrocode}
-function piton.ParseBis(language,code)
- local s = ( Cs ( ( P '##' / '#' + 1 ) ^ 0 ) ) : match ( code )
- return piton.Parse(language,s)
-end
-% \end{macrocode}
-%
-% \bigskip
-% The following command will be used when we have to parse some small chunks of
-% code that have yet been parsed. They are re-scanned by LaTeX because it has
-% been required by |\@@_piton:n| in the \pkg{piton} style of the syntaxic
-% element. In that case, you have to remove the potential |\@@_breakable_space:|
-% that have been inserted when the key |break-lines| is in force.
-% \begin{macrocode}
-function piton.ParseTer(language,code)
- local s = ( Cs ( ( P '\\@@_breakable_space:' / ' ' + 1 ) ^ 0 ) )
- : match ( code )
- return piton.Parse(language,s)
-end
-% \end{macrocode}
-%
-%
-% \bigskip
-% \subsubsection{Preprocessors of the function Parse for gobble}
-%
-% We deal now with preprocessors of the function |Parse| which are needed when
-% the ``gobble mechanism'' is used.
-%
-%
-% \bigskip
-% The function |gobble| gobbles $n$ characters on the left of the code. It uses
-% a \textsc{lpeg} that we have to compute dynamically because if depends on the
-% value of~$n$.
-% \begin{macrocode}
-local function gobble(n,code)
- function concat(acc,new_value)
- return acc .. new_value
- end
- if n==0
- then return code
- else
- return Cf (
- Cc ( "" ) *
- ( 1 - P "\r" ) ^ (-n) * C ( ( 1 - P "\r" ) ^ 0 )
- * ( C ( P "\r" )
- * ( 1 - P "\r" ) ^ (-n)
- * C ( ( 1 - P "\r" ) ^ 0 )
- ) ^ 0 ,
- concat
- ) : match ( code )
- end
-end
-% \end{macrocode}
-%
-%
-%
-% \bigskip
-% The following function |add| will be used in the following \textsc{lpeg}
-% |AutoGobbleLPEG|, |TabsAutoGobbleLPEG| and |EnvGobbleLPEG|.
-% \begin{macrocode}
-local function add(acc,new_value)
- return acc + new_value
-end
-% \end{macrocode}
-%
-% \bigskip
-% The following \textsc{lpeg} returns as capture the minimal number of spaces at
-% the beginning of the lines of code. The main work is done by two \emph{fold
-% captures} (|lpeg.Cf|), one using |add| and the other (encompassing the
-% previous one) using |math.min| as folding operator.
-% \begin{macrocode}
-local AutoGobbleLPEG =
- ( space ^ 0 * P "\r" ) ^ -1
- * Cf (
- (
-% \end{macrocode}
-% We don't take into account the empty lines (with only spaces).
-% \begin{macrocode}
- ( P " " ) ^ 0 * P "\r"
- +
- Cf ( Cc(0) * ( P " " * Cc(1) ) ^ 0 , add )
- * ( 1 - P " " ) * ( 1 - P "\r" ) ^ 0 * P "\r"
- ) ^ 0
-% \end{macrocode}
-% Now for the last line of the Python code...
-% \begin{macrocode}
- *
- ( Cf ( Cc(0) * ( P " " * Cc(1) ) ^ 0 , add )
- * ( 1 - P " " ) * ( 1 - P "\r" ) ^ 0 ) ^ -1 ,
- math.min
- )
-% \end{macrocode}
-%
-% \bigskip
-% The following \textsc{lpeg} is similar but works with the indentations.
-% \begin{macrocode}
-local TabsAutoGobbleLPEG =
- ( space ^ 0 * P "\r" ) ^ -1
- * Cf (
- (
- ( P "\t" ) ^ 0 * P "\r"
- +
- Cf ( Cc(0) * ( P "\t" * Cc(1) ) ^ 0 , add )
- * ( 1 - P "\t" ) * ( 1 - P "\r" ) ^ 0 * P "\r"
- ) ^ 0
- *
- ( Cf ( Cc(0) * ( P "\t" * Cc(1) ) ^ 0 , add )
- * ( 1 - P "\t" ) * ( 1 - P "\r" ) ^ 0 ) ^ -1 ,
- math.min
- )
-% \end{macrocode}
-%
-%
-%
-% \bigskip
-% The following \textsc{lpeg} returns as capture the number of spaces at the
-% last line, that is to say before the |\end{Piton}| (and usually it's also the
-% number of spaces before the corresponding |\begin{Piton}| because that's the
-% traditionnal way to indent in LaTeX). The main work is done by a \emph{fold
-% capture} (|lpeg.Cf|) using the function |add| as folding operator.
-% \begin{macrocode}
-local EnvGobbleLPEG =
- ( ( 1 - P "\r" ) ^ 0 * P "\r" ) ^ 0
- * Cf ( Cc(0) * ( P " " * Cc(1) ) ^ 0 , add ) * -1
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-function piton.GobbleParse(language,n,code)
- if n==-1
- then n = AutoGobbleLPEG : match(code)
- else if n==-2
- then n = EnvGobbleLPEG : match(code)
- else if n==-3
- then n = TabsAutoGobbleLPEG : match(code)
- end
- end
- end
- piton.Parse(language,gobble(n,code))
-end
-% \end{macrocode}
-%
-% \bigskip
-% \subsubsection{To count the number of lines}
-%
-% \medskip
-% \begin{macrocode}
-function piton.CountLines(code)
- local count = 0
- for i in code : gmatch ( "\r" ) do count = count + 1 end
- tex.sprint(
- luatexbase.catcodetables.expl ,
- '\\int_set:Nn \\l_@@_nb_lines_int {' .. count .. '}' )
-end
-% \end{macrocode}
-%
-% \begin{macrocode}
-function piton.CountNonEmptyLines(code)
- local count = 0
- count =
- ( Cf ( Cc(0) *
- (
- ( P " " ) ^ 0 * P "\r"
- + ( 1 - P "\r" ) ^ 0 * P "\r" * Cc(1)
- ) ^ 0
- * (1 - P "\r" ) ^ 0 ,
- add
- ) * -1 ) : match (code)
- tex.sprint(
- luatexbase.catcodetables.expl ,
- '\\int_set:Nn \\l_@@_nb_non_empty_lines_int {' .. count .. '}' )
-end
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-function piton.CountLinesFile(name)
- local count = 0
- for line in io.lines(name) do count = count + 1 end
- tex.sprint(
- luatexbase.catcodetables.expl ,
- '\\int_set:Nn \\l_@@_nb_lines_int {' .. count .. '}' )
-end
-% \end{macrocode}
-%
-%
-% \bigskip
-% \begin{macrocode}
-function piton.CountNonEmptyLinesFile(name)
- local count = 0
- for line in io.lines(name)
- do if not ( ( ( P " " ) ^ 0 * -1 ) : match ( line ) )
- then count = count + 1
- end
- end
- tex.sprint(
- luatexbase.catcodetables.expl ,
- '\\int_set:Nn \\l_@@_nb_non_empty_lines_int {' .. count .. '}' )
-end
-% \end{macrocode}
-%
-% \begin{macrocode}
-\end{luacode*}
-% \end{macrocode}
-%
-%
-% \vspace{1cm}
-% \section{History}
-%
-% % \subsection*{Changes between versions 1.4 and 1.5}
-%
-% New key |numbers-sep|.
-%
-%
-% \subsection*{Changes between versions 1.3 and 1.4}
-%
-% New key |identifiers| in |\PitonOptions|.
-%
-% New command |\PitonStyle|.
-%
-% |background-color| now accepts as value a \emph{list} of colors.
-%
-% \subsection*{Changes between versions 1.2 and 1.3}
-%
-% When the class Beamer is used, the environment |{Piton}| and the command
-% |\PitonInputFile| are ``overlay-aware'' (that is to say, they accept a
-% specification of overlays between angular brackets).
-%
-% New key |prompt-background-color|
-%
-% It's now possible to use the command |\label| to reference a line of code in
-% an environment |{Piton}|.
-%
-% A new command |\|␣ is available in the argument of the command |\piton{...}| to
-% insert a space (otherwise, several spaces are replaced by a single space).
-%
-% \subsection*{Changes between versions 1.1 and 1.2}
-%
-% New keys |break-lines-in-piton| and |break-lines-in-Piton|.
-%
-% New key |show-spaces-in-string| and modification of the key |show-spaces|.
-%
-% When the class \cls{beamer} is used, the environements |{uncoverenv}|,
-% |{onlyenv}|, |{visibleenv}| and |{invisibleenv}|
-%
-%
-% \subsection*{Changes between versions 1.0 and 1.1}
-%
-% The extension \pkg{piton} detects the class \cls{beamer} and activates the
-% commands |\action|, |\alert|, |\invisible|, |\only|, |\uncover| and |\visible|
-% in the environments |{Piton}| when the class \cls{beamer} is used.
-%
-% \subsection*{Changes between versions 0.99 and 1.0}
-%
-% New key |tabs-auto-gobble|.
-%
-% \subsection*{Changes between versions 0.95 and 0.99}
-%
-% New key |break-lines| to allow breaks of the lines of code (and other keys to
-% customize the appearance).
-%
-% \subsection*{Changes between versions 0.9 and 0.95}
-%
-% New key |show-spaces|.
-%
-% The key |left-margin| now accepts the special value |auto|.
-%
-% New key |latex-comment| at load-time and replacement of |##| by |#>|
-%
-% New key |math-comments| at load-time.
-%
-% New keys |first-line| and |last-line| for the command |\InputPitonFile|.
-%
-% \subsection*{Changes between versions 0.8 and 0.9}
-%
-% New key |tab-size|.
-%
-% Integer value for the key |splittable|.
-%
-% \subsection*{Changes between versions 0.7 and 0.8}
-%
-% New keys |footnote| and |footnotehyper| at load-time.
-%
-% New key |left-margin|.
-%
-% \subsection*{Changes between versions 0.6 and 0.7}
-%
-% New keys |resume|, |splittable| and |background-color| in |\PitonOptions|.
-%
-% The file |piton.lua| has been embedded in the file |piton.sty|. That means
-% that the extension \pkg{piton} is now entirely contained in the file |piton.sty|.
-%
-%
-%
-% \tableofcontents
-%
-% \end{document}
-%
-%
-% Local Variables:
-% TeX-fold-mode: t
-% TeX-fold-preserve-comments: nil
-% flyspell-mode: nil
-% fill-column: 80
-% End:
-
-
-
-
-
-
+% \iffalse -*- coding: utf-8 ; -*- \fi \iffalse meta-comment
+%
+% Copyright (C) 2023 by F. Pantigny
+% -----------------------------------
+%
+% This file may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in:
+%
+% http://www.latex-project.org/lppl.txt
+%
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% \fi
+% \iffalse
+\def\myfileversion{1.5a}
+\def\myfiledate{2023/04/11}
+%
+%
+%<*batchfile>
+\begingroup
+\input l3docstrip.tex
+\keepsilent
+\usedir{tex/latex/cascade}
+\preamble
+
+Copyright (C) 2022-2023 by F. Pantigny
+-----------------------------------
+
+This file may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either version 1.3
+of this license or (at your option) any later version.
+The latest version of this license is in:
+
+http://www.latex-project.org/lppl.txt
+
+and version 1.3 or later is part of all distributions of LaTeX
+version 2005/12/01 or later.
+
+\endpreamble
+\askforoverwritefalse
+\endgroup
+%</batchfile>
+%
+%<@@=piton>
+%<*driver>
+\documentclass{l3doc}
+\usepackage{geometry}
+\geometry{left=2.8cm,right=2.8cm,top=2.5cm,bottom=2.5cm,papersize={21cm,29.7cm}}
+\usepackage{fontspec}
+\usepackage[dvipsnames]{xcolor}
+\usepackage{caption,tabularx,tcolorbox,luacolor,lua-ul}
+\def\emphase{\bgroup\color{RoyalPurple}\let\next=}
+\fvset{commandchars=\~\#\@,formatcom=\color{gray}}
+\captionsetup{labelfont = bf}
+\usepackage{ragged2e}
+\usepackage[footnotehyper,escape-inside=$$,math-comments]{piton} % $$
+
+\parindent 0pt
+\skip\footins = 2\bigskipamount
+
+\PitonOptions{gobble=2}
+
+\EnableCrossrefs
+
+\begin{document}
+\DocInput{piton.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \catcode`\" = 11
+%
+% \title{The package \pkg{piton}\thanks{This document corresponds to the
+% version~\myfileversion\space of \pkg{piton}, at the date of~\myfiledate.}}
+% \author{F. Pantigny \\ \texttt{fpantigny@wanadoo.fr}}
+%
+% \maketitle
+%
+% \begin{abstract}
+% The package \pkg{piton} provides tools to typeset Python listings with
+% syntactic highlighting by using the Lua library LPEG. It requires LuaLaTeX.
+% \end{abstract}
+%
+%
+%
+% \section{Presentation}
+%
+%
+% The package \pkg{piton} uses the Lua library LPEG\footnote{LPEG is a
+% pattern-matching library for Lua, written in C, based on \emph{parsing
+% expression grammars}: \url{http://www.inf.puc-rio.br/~roberto/lpeg/}} for
+% parsing Python listings and typeset them with syntactic highlighting. Since it
+% uses Lua code, it works with |lualatex| only (and won't work with the other
+% engines: |latex|, |pdflatex| and |xelatex|). It does not use external program
+% and the compilation does not require |--shell-escape|. The compilation is very
+% fast since all the parsing is done by the library LPEG, written in C.
+%
+% \bigskip
+% Here is an example of code typeset by \pkg{piton}, with the environment |{Piton}|.
+%
+% \bigskip
+%
+% \begin{Piton}
+% from math import pi
+%
+% def arctan(x,n=10):
+% """Compute the mathematical value of arctan(x)
+%
+% n is the number of terms in the sum
+% """
+% if x < 0:
+% return -arctan(-x) # recursive call
+% elif x > 1:
+% return pi/2 - arctan(1/x)
+% #> (we have used that $\arctan(x)+\arctan(1/x)=\frac{\pi}{2}$ for $x>0$)\footnote{This LaTeX escape has been done by beginning the comment by \ttfamily\#>.}
+% else:
+% s = 0
+% for k in range(n):
+% s += (-1)**k/(2*k+1)*x**(2*k+1)
+% return s
+% \end{Piton}
+%
+%
+% \bigskip
+% The package \pkg{piton} is entirely contained in the file
+% |piton.sty|. This file may be put in the current directory or in a
+% |texmf| tree. However, the best is to install \pkg{piton} with a TeX
+% distribution such as MiKTeX, TeX Live or MacTeX.
+%
+%
+% \section{Use of the package}
+%
+%
+% \subsection{Loading the package}
+%
+% The package \pkg{piton} should be loaded with the classical command
+% |\usepackage|: |\usepackage{piton}|.
+%
+% \smallskip
+% Nevertheless, we have two remarks:
+% \begin{itemize}
+% \item the package \pkg{piton} uses the package \pkg{xcolor} (but \pkg{piton}
+% does \emph{not} load \pkg{xcolor}: if \pkg{xcolor} is not loaded before the
+% |\begin{document}|, a fatal error will be raised).
+% \item the package \pkg{piton} must be used with LuaLaTeX exclusively: if
+% another LaTeX engine (|latex|, |pdflatex|, |xelatex|,\dots ) is used, a
+% fatal error will be raised.
+% \end{itemize}
+%
+% \subsection{The tools provided to the user}
+%
+% The package \pkg{piton} provides several tools to typeset Python code: the
+% command |\piton|, the environment |{Piton}| and the command |\PitonInputFile|.
+%
+% \begin{itemize}\setlength{\fboxsep}{1pt}
+% \item The command \colorbox{gray!20}{\texttt\textbackslash piton} should be
+% used to typeset small pieces of code inside a paragraph. For example:
+%
+% {\color{gray}\verb|\piton{def square(x): return x*x}|}\qquad
+% \piton{def square(x): return x*x}
+%
+% The syntax and particularities of the command |\piton| are detailed below.
+%
+% \item The environment \colorbox{gray!20}{\ttfamily\{Piton\}} should be used to
+% typeset multi-lines code. Since it takes its argument in a verbatim mode, it
+% can't be used within the argument of a LaTeX command. For sake of
+% customization, it's possible to define new environments similar to the
+% environment |{Piton}| with the command |\NewPitonEnvironment|:
+% cf.~\ref{NewPitonEnvironment} p.~\pageref{NewPitonEnvironment}.
+%
+% \item The command \colorbox{gray!20}{\ttfamily\textbackslash PitonInputFile}
+% is used to insert and typeset a whole external file.
+%
+% That command takes in as optional argument (between square brackets) two keys
+% |first-line| and |last-line|: only the part between the corresponding lines
+% will be inserted.
+% \end{itemize}
+%
+% \subsection{The syntax of the command \textbackslash piton}
+%
+% In fact, the command |\piton| is provided with a double syntax. It may be used
+% as a standard command of LaTeX taking its argument between curly braces
+% (|\piton{...}|) but it may also be used with a syntax similar to the syntax of
+% the command
+% |\verb|, that is to say with the argument delimited by two identical characters (e.g.: \verb!\piton|...|!).
+%
+% \begin{itemize}
+% \item {\color{blue} \textsf{Syntax} \verb|\piton{...}|}\par\nobreak
+% When its argument is given between curly braces, the command |\piton| does not
+% take its argument in verbatim mode. In particular:
+% \begin{itemize}
+% \item several consecutive spaces will be replaced by only one space,
+%
+% {\color{cyan} but the command |\|␣ is provided to force the insertion of a space};
+%
+% \item it's not possible to use |%| inside the argument,
+%
+% {\color{cyan} but the command |\%| is provided to insert a |%|};
+%
+% \item the braces must be appear by pairs correctly nested
+%
+% {\color{cyan} but the commands |\{| and |\}| are also provided for individual braces};
+%
+% \item the LaTeX commands\footnote{That concerns the commands beginning with a
+% backslash but also the active characters.} are fully expanded and not
+% executed,
+%
+% {\color{cyan} so it's possible to use |\\| to insert a backslash}.
+% \end{itemize}
+%
+%
+% The other characters (including |#|, |^|, |_|, |&|, |$| and |@|)
+% must be inserted without backslash.
+%
+% \bigskip
+%\begin{tabular}{>{\color{gray}}w{l}{75mm}@{\hspace*{1cm}}l}
+% \omit Examples : \hfil \\
+% \noalign{\vskip1mm}
+% \verb|\piton{MyString = '\\n'}| &
+% \piton{MyString = '\\n'} \\
+% \verb|\piton{def even(n): return n\%2==0}| &
+% \piton{def even(n): return n\%2==0} \\
+% \verb|\piton{c="#" # an affectation }| &
+% \piton{c="#" # an affectation } \\
+% \verb|\piton{c="#" \ \ \ # an affectation }| &
+% \piton{c="#" \ \ \ # an affectation } \\
+% \verb|\piton{MyDict = {'a': 3, 'b': 4 }}| &
+% \piton{MyDict = {'a': 3, 'b': 4 }}
+% \end{tabular}
+%
+% \bigskip
+% It's possible to use the command |\piton| in the arguments of a
+% LaTeX command.\footnote{For example, it's possible to use the command
+% \texttt{\textbackslash piton} in a footnote. Example :
+% \piton{s = 'A string'}.}
+%
+% \bigskip
+% \item {\color{blue} \textsf{Syntaxe} \verb!\piton|...|!}\par\nobreak
+%
+% When the argument of the command |\piton| is provided between two identical
+% characters, that argument is taken in a \emph{verbatim mode}. Therefore, with
+% that syntax, the command |\piton| can't be used within the argument of another
+% command.
+%
+% \medskip
+%
+% \begin{tabular}{>{\color{gray}}w{l}{75mm}@{\hspace*{1cm}}l}
+% \omit Examples : \hfil \\
+% \noalign{\vskip1mm}
+% \verb!\piton|MyString = '\n'|! &
+% \piton|MyString = '\n'| \\
+% \verb|\piton!def even(n): return n%2==0!| &
+% \piton!def even(n): return n%2==0! \\
+% \verb|\piton+c="#" # an affectation +| &
+% \piton+c="#" # an affectation + \\
+% \verb|\piton?MyDict = {'a': 3, 'b': 4}?| &
+% \piton!MyDict = {'a': 3, 'b': 4}!
+% \end{tabular}
+%
+% \end{itemize}
+%
+% \section{Customization}
+%
+% \subsection{The command \textbackslash PitonOptions}
+%
+%
+% \NewDocumentCommand{\Definition}{m}
+% {{\setlength{\fboxsep}{1pt}\colorbox{gray!20}{\ttfamily \vphantom{gl}#1}}}
+%
+% The command |\PitonOptions| takes in as argument a comma-separated list of
+% \textsl{key=value} pairs. The scope of the settings done by that command is
+% the current TeX group.\footnote{We remind that a LaTeX environment is, in
+% particular, a TeX group.}
+%
+% \begin{itemize}
+% \item The key \Definition{gobble} takes in as value a
+% positive integer~$n$: the first $n$ characters are discarded (before the
+% process of highlightning of the code) for each line of the environment
+% |{Piton}|. These characters are not necessarily spaces.
+%
+% \item When the key \Definition{auto-gobble} is in force, the
+% extension \pkg{piton} computes the minimal value $n$ of the number of
+% consecutive spaces beginning each (non empty) line of the environment
+% |{Piton}| and applies |gobble| with that value of~$n$.
+%
+% \item When the key \Definition{env-gobble} is in force, \pkg{piton} analyzes the last
+% line of the environment |{Piton}|, that is to say the line which contains
+% |\end{Piton}| and determines whether that line contains only spaces followed
+% by the |\end{Piton}|. If we are in that situation, \pkg{piton} computes the
+% number~$n$ of spaces on that line and applies |gobble| with that value of~$n$.
+% The name of that key comes from \emph{environment gobble}: the effect of
+% gobble is set by the position of the commands |\begin{Piton}| and
+% |\end{Piton}| which delimit the current environment.
+%
+% \item With the key \Definition{line-numbers}, the \emph{non empty} lines (and
+% all the lines of the \emph{docstrings}, even the empty ones) are numbered in
+% the environments |{Piton}| and in the listings resulting from the use of
+% |\PitonInputFile|.
+%
+% \item With the key \Definition{all-line-numbers}, \emph{all} the lines are numbered,
+% including the empty ones.
+%
+% \item \colorbox{yellow!50}{\bfseries{New 1.5}}\par\nobreak
+%
+% The key \Definition{numbers-sep} is the horizontal distance between the
+% numbers of lines (inserted by |line-numbers| of |all-line-numbers|) and the
+% beginning of the lines of code. The initial value is 0.7~em.
+%
+% \item With the key \Definition{resume}, the counter of lines is not set to zero
+% at the beginning of each environment |{Piton}| or use of |\PitonInputFile| as
+% it is otherwise. That allows a numbering of the lines across several
+% environments.
+%
+% \item The key \Definition{left-margin} corresponds to a margin on the left.
+% That key may be useful in conjonction with the key |line-numbers| or the key
+% |line-all-numbers| if one does not want the numbers in an overlapping position
+% on the left.
+%
+% It's possible to use the key |left-margin| with the value |auto|. With that
+% value, if the key |line-numbers| or the key |all-line-numbers| is used, a
+% margin will be automatically inserted to fit the numbers of lines. See an
+% example part \ref{example-numbering} on page~\pageref{example-numbering}.
+%
+% \item The key \Definition{background-color} sets the background color of the
+% environments |{Piton}| and the listings produced by |\PitonInputFile| (that
+% background has a width of |\linewidth|).
+%
+% \smallskip
+% \colorbox{yellow!50}{\textbf{New 1.4}}\enskip The key |background-color|
+% supports also as value a \emph{list} of colors. In this case, the successive
+% rows are colored by using the colors of the list in a cyclic way.
+%
+% \emph{Example} : |\PitonOptions{background-color = {gray!5,white}}|
+%
+%
+% The key |background-color| accepts a color defined «on the fly». For example,
+% it's possible to write |background-color = [cmyk]{0.1,0.05,0,0}|.
+%
+% \item With the key \Definition{prompt-background-color}, \pkg{piton} adds a
+% color background to the lines beginning with the prompt ``|>>>|'' (and its
+% continuation ``|...|'') characteristic of the Python consoles with
+% \textsc{repl} (\emph{read-eval-print loop}).
+%
+% \item When the key \Definition{show-spaces-in-strings} is activated, the
+% spaces in the short strings (that is to say those delimited by |'| or |"|) are
+% replaced by the character~␣ (U+2423 : \textsc{open box}). Of course, that
+% character~U+2423 must be present in the monospaced font which is
+% used.\footnote{The package \pkg{piton} simply uses the current monospaced
+% font. The best way to change that font is to use the command
+% \texttt{\textbackslash setmonofont} of the package \pkg{fontspec}.}\par\nobreak
+% \begingroup \PitonOptions{show-spaces-in-strings} Example :
+% \piton|my_string = 'Very good answer'| \endgroup
+%
+% With the key \Definition{show-spaces}, all the spaces are replaced by U+2423
+% (and no line break can occur on those ``visible spaces'', even when the key
+% |break-lines|\footnote{cf. \ref{line-breaks} p.~\pageref{line-breaks}} is in
+% force).
+% \end{itemize}
+%
+% \bigskip
+%
+% \begingroup
+% \fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
+% \begin{Verbatim}
+% ~emphase&\PitonOptions{line-numbers,auto-gobble,background-color = gray!15}@
+% \begin{Piton}
+% from math import pi
+% def arctan(x,n=10):
+% """Compute the mathematical value of arctan(x)
+%
+% n is the number of terms in the sum
+% """
+% if x < 0:
+% return -arctan(-x) # recursive call
+% elif x > 1:
+% return pi/2 - arctan(1/x)
+% #> (we have used that $\arctan(x)+\arctan(1/x)=\frac{\pi}{2}$ pour $x>0$)
+% else
+% s = 0
+% for k in range(n):
+% s += (-1)**k/(2*k+1)*x**(2*k+1)
+% return s
+% \end{Piton}
+% \end{Verbatim}
+% \endgroup
+%
+% \begingroup
+% \PitonOptions{line-numbers,background-color = gray!15}
+% \begin{Piton}
+% from math import pi
+%
+% def arctan(x,n=10):
+% """Compute the mathematical value of arctan(x)
+%
+% n is the number of terms in the sum
+% """
+% if x < 0:
+% return -arctan(-x) # recursive call
+% elif x > 1:
+% return pi/2 - arctan(1/x)
+% #> (we have used that $\arctan(x)+\arctan(1/x)=\frac{\pi}{2}$ for $x>0$)
+% else
+% s = 0
+% for k in range(n):
+% s += (-1)**k/(2*k+1)*x**(2*k+1)
+% return s
+% \end{Piton}
+% \endgroup
+%
+% \bigskip
+% The command |\PitonOptions| provides in fact several other keys which will be
+% described further (see in particular the ``Pages breaks and line breaks''
+% p.~\pageref{breakable}).
+%
+% \subsection{The styles}
+%
+% \label{styles}
+%
+% The package \pkg{piton} provides the command |\SetPitonStyle| to customize the
+% different styles used to format the syntactic elements of the Python listings.
+% The customizations done by that command are limited to the current TeX
+% group.\footnote{We remind that a LaTeX environment is, in particular, a TeX group.}
+%
+% \bigskip
+% The command |\SetPitonStyle| takes in as argument a comma-separated list of
+% \textsl{key=value} pairs. The keys are names of styles and the value are LaTeX
+% formatting instructions.
+%
+% \bigskip
+% These LaTeX instructions must be formatting instructions such as
+% |\color{...}|, |\bfseries|, |\slshape|, etc. (the commands of this kind are
+% sometimes called \emph{semi-global} commands). It's also possible to put,
+% \emph{at the end of the list of instructions}, a LaTeX command taking exactly
+% one argument.
+%
+% \bigskip
+% Here an example which changes the style used to highlight, in the definition
+% of a Python function, the name of the function which is defined. That code
+% uses the command |\highLight| of \pkg{lua-ul} (that package requires also the
+% package \pkg{luacolor}).
+%
+% \begin{verbatim}
+% \SetPitonStyle{ Name.Function = \bfseries \highLight[red!50] }
+% \end{verbatim}
+%
+% In that example, |\highLight[red!50]| must be considered as the name of a
+% LaTeX command which takes in exactly one argument, since, usually, it is used
+% with |\highLight[red!50]{...}|.
+%
+% \medskip
+% \begingroup
+% \SetPitonStyle
+% { Name.Function = \bfseries \highLight[red!50] }
+% With that setting, we will have : \piton{def cube(x) : return x * x * x }
+% \endgroup
+%
+% \bigskip
+% The different styles are described in the table \ref{Semantic}. The initial
+% settings done by \pkg{piton} in |piton.sty| are inspired by the style
+% \pkg{manni} de Pygments.\footnote{See:
+% \url{https://pygments.org/styles/}. Remark that, by default, Pygments provides for its style \pkg{manni} a colored background whose color is the HTML color \texttt{\#F0F3F3}. It's possible to have the same color in \texttt{\{Pion\}} with the instruction \texttt{\textbackslash PitonOptions\{background-color = [HTML]\{F0F3F3\}\}}.}
+%
+% \bigskip
+% \colorbox{yellow!50}{\textbf{New 1.4}}\enskip The command |\PitonStyle| takes
+% in as argument the name of a style and allows to retrieve the value (as a list
+% of LaTeX instructions) of that style.
+%
+% \smallskip
+% For example, it's possible to write |{\PitonStyle{Keyword}{function}}| and we
+% will have the word {\PitonStyle{Keyword}{function}} formatted as a keyword.
+%
+% \smallskip
+% The syntax |{\PitonStyle{|\textsl{\texttt{style}}|}{...}}| is mandatory in
+% order to be able to deal both with the semi-global commands and the commands
+% with arguments which may be present in the definition of the style
+% \texttt{\textsl{style}}.
+%
+% \begin{table}[b]
+% \centering
+% \caption{Usage of the different styles}
+% \label{Semantic}
+% \begin{tabular}{@{}>{\ttfamily}l>{\RaggedRight\arraybackslash}p{9cm}@{}}
+% \toprule
+% \normalfont Style & Usage \\
+% \midrule
+% Number & the numbers \\
+% String.Short & the short strings (between \texttt{'} or \verb|"|) \\
+% String.Long & the long strings (between \texttt{'''} or \verb|"""|) except the
+% documentation strings \\
+% String & that keys sets both |String.Short| and |String.Long| \\
+% String.Doc & the documentation strings (only between \texttt{"""} following
+% PEP~257) \\
+% String.Interpol & the syntactic elements of the fields of the f-strings (that
+% is to say the characters \texttt{\{} and \texttt{\}}) \\
+% Operator & the following operators : \texttt{!= == << >> - \~{} + / * \% = < > \& .} \verb+|+ \verb|@|\\
+% Operator.Word & the following operators : \texttt{in}, \texttt{is},
+% \texttt{and}, \texttt{or} and \texttt{not} \\
+% Name.Builtin & the predefined functions of Python \\
+% Name.Function & the name of the functions defined by the user, at the point of
+% their definition (that is to say after the keyword |def|) \\
+% Name.Decorator & the decorators (instructions beginning by \verb|@|) \\
+% Name.Namespace & the name of the modules (= external libraries) \\
+% Name.Class & the name of the classes at the point of their definition (that is
+% to say after the keyword |class|) \\
+% Exception & the names of the exceptions (eg: \texttt{SyntaxError}) \\
+% Comment & the comments beginning with \verb|#| \\
+% Comment.LaTeX & the comments beginning by \verb|#>|, which are composed in LaTeX by
+% \pkg{piton} (and simply called ``LaTeX comments'' in this document) \\
+% Keyword.Constant & |True|, |False| and |None| \\
+% Keyword & the following keywords :
+% \ttfamily as, assert, break, case, continue, def, del,
+% elif, else, except, exec, finally, for, from,
+% global, if, import, lambda, non local,
+% pass, raise, return, try, while,
+% with, yield, yield from.\\
+% \bottomrule
+% \end{tabular}
+% \end{table}
+%
+%
+%
+%
+% \subsection{Creation of new environments}
+%
+% \label{NewPitonEnvironment}
+%
+% Since the environment |{Piton}| has to catch its body in a special way (more
+% or less as verbatim text), it's not possible to construct new environments
+% directly over the environment |{Piton}| with the classical commands
+% |\newenvironment| or |\NewDocumentEnvironment|.
+%
+% That's why \pkg{piton} provides a command |\NewPitonEnvironment|. That
+% command takes in three mandatory arguments.
+
+% That command has the same syntax as the classical environment
+% |\NewDocumentEnvironment|.
+%
+% \bigskip
+% With the following instruction, a new environment |{Python}| will be
+% constructed with the same behaviour as |{Piton}|:
+%
+% {\color{gray}\verb|\NewPitonEnvironment{Python}{}{}{}|}
+%
+% \bigskip
+% If one wishes an environment |{Python}| with takes in as optional argument
+% (between square brackets) the keys of the command |\PitonOptions|, it's
+% possible to program as follows:
+%
+% {\color{gray}\verb|\NewPitonEnvironment{Python}{O{}}{\PitonOptions{#1}}{}|}
+%
+% \bigskip
+% If one wishes to format Python code in a box of \pkg{tcolorbox}, it's possible
+% to define an environment |{Python}| with the following code (of course, the
+% package \pkg{tcolorbox} must be loaded).
+%
+%\begin{verbatim}
+% \NewPitonEnvironment{Python}{}
+% {\begin{tcolorbox}}
+% {\end{tcolorbox}}
+% \end{verbatim}
+%
+% \bigskip
+% With this new environment |{Python}|, it's possible to write:
+%
+% \begin{Verbatim}
+% ~emphase#\begin{Python}@
+% def square(x):
+% """Compute the square of a number"""
+% return x*x
+% ~emphase#\end{Python}@
+% \end{Verbatim}
+%
+% \NewPitonEnvironment{Python}{}
+% {\begin{tcolorbox}}
+% {\end{tcolorbox}}
+%
+% \begin{Python}
+% def square(x):
+% """Compute the square of a number"""
+% return x*x
+% \end{Python}
+%
+%
+% \section{Advanced features}
+%
+% \subsection{Highlighting some identifiers}
+%
+% \colorbox{yellow!50}{\textbf{New 1.4}} It's possible to require a changement
+% of formating for some identifiers with the key |identifiers| of
+% |\PitonOptions|.
+%
+% \smallskip
+% That key takes in as argument a value of the following format:
+%
+% \quad |{ names = |\textsl{\ttfamily names}|, style = |\textsl{\ttfamily
+% instructions}| }|
+%
+% \begin{itemize}
+% \item \textsl{\ttfamily names} is a (comma-separated) list of identifiers
+% names;
+%
+% \item \textsl{\ttfamily instructions} is a list of LaTeX instructions of the
+% same type that \pkg{piton} ``styles'' previously presented (cf~\ref{styles}
+% p.~\pageref{styles}).
+% \end{itemize}
+%
+% \emph{Caution}: Only the identifiers may be concerned by that key. The
+% keywords and the built-in functions won't be affected, even if their name is
+% in the list |\textsl{\ttfamily names}|.
+%
+% \begin{Verbatim}
+% \PitonOptions
+% {
+% ~emphase#identifiers@ =
+% {
+% ~emphase#names@ = { l1 , l2 } ,
+% ~emphase#style@ = \color{red}
+% }
+% }
+%
+% \begin{Piton}
+% def tri(l):
+% """Segmentation sort"""
+% if len(l) <= 1:
+% return l
+% else:
+% a = l[0]
+% l1 = [ x for x in l[1:] if x < a ]
+% l2 = [ x for x in l[1:] if x >= a ]
+% return tri(l1) + [a] + tri(l2)
+% \end{Piton}
+% \end{Verbatim}
+%
+%
+% \bigskip
+%
+% \begingroup
+%
+% \PitonOptions
+% {
+% identifiers =
+% {
+% names = { l1 , l2 } ,
+% style = \color{red}
+% }
+% }
+%
+% \begin{Piton}
+% def tri(l):
+% """Segmentation sort"""
+% if len(l) <= 1:
+% return l
+% else:
+% a = l[0]
+% l1 = [ x for x in l[1:] if x < a ]
+% l2 = [ x for x in l[1:] if x >= a ]
+% return tri(l1) + [a] + tri(l2)
+% \end{Piton}
+%
+% \endgroup
+%
+% \bigskip
+% By using the key |identifier|, it's possible to add other built-in functions
+% (or other new keywords, etc.) that will be detected by \pkg{piton}.
+%
+%
+% \begin{Verbatim}
+% \PitonOptions
+% {
+% ~emphase#identifiers@ =
+% {
+% names = { cos, sin, tan, floor, ceil, trunc, pow, exp, ln, factorial } ,
+% style = \PitonStyle{Name.Builtin}
+% }
+% }
+%
+% \begin{Piton}
+% from math import *
+% cos(pi/2)
+% factorial(5)
+% ceil(-2.3)
+% floor(5.4)
+% \end{Piton}
+% \end{Verbatim}
+%
+% \begingroup
+%
+% \PitonOptions
+% {
+% identifiers =
+% {
+% names = { cos, sin, tan, floor, ceil, trunc, pow, exp, ln, factorial } ,
+% style = \PitonStyle{Name.Builtin}
+% }
+% }
+%
+% \begin{Piton}
+% from math import *
+% cos(pi/2)
+% factorial(5)
+% ceil(-2.3)
+% floor(5.4)
+% \end{Piton}
+%
+%
+% \endgroup
+%
+%
+% \subsection{Mechanisms to escape to LaTeX}
+%
+% The package \pkg{piton} provides several mechanisms for escaping to LaTeX:
+% \begin{itemize}
+% \item It's possible to compose comments entirely in LaTeX.
+% \item It's possible to have the elements between \texttt{\$} in the comments
+% composed in LateX mathematical mode.
+% \item It's also possible to insert LaTeX code almost everywhere in a Python listing.
+% \end{itemize}
+%
+% One should aslo remark that, when the extension \pkg{piton} is used with the
+% class \cls{beamer}, \pkg{piton} detects in |{Piton}| many commands and
+% environments of Beamer: cf. \ref{beamer} p.~\pageref{beamer}.
+%
+% \subsubsection{The ``LaTeX comments''}
+%
+% In this document, we call ``LaTeX comments'' the comments which begins by
+% |#>|. The code following those characters, until the end of the line, will be
+% composed as standard LaTeX code. There is two tools to customize those
+% comments.
+%
+% \begin{itemize}
+% \item It's possible to change the syntatic mark (which, by default, is |#>|).
+% For this purpose, there is a key |comment-latex| available at load-time (that
+% is to say at the |\usepackage|) which allows to choice the characters which,
+% preceded by |#|, will be the syntatic marker.
+%
+% For example, with the following loading:
+%
+% \quad \verb|\usepackage[comment-latex = LaTeX]{piton}|
+%
+% the LaTeX comments will begin by |#LaTeX|.
+%
+% If the key |comment-latex| is used with the empty value, all the Python
+% comments (which begins by |#|) will, in fact, be ``LaTeX comments''.
+%
+% \smallskip
+% \item It's possible to change the formatting of the LaTeX comment itself by
+% changing the \pkg{piton} style |Comment.LaTeX|.
+%
+% For example, with |\SetPitonStyle{Comment.LaTeX = \normalfont\color{blue}}|,
+% the LaTeX comments will be composed in blue.
+%
+% If you want to have a character |#| at the beginning of the LaTeX comment in
+% the \textsc{pdf}, you can use set |Comment.LaTeX| as follows:
+%
+% \begin{Verbatim}
+% \SetPitonStyle{Comment.LaTeX = \color{gray}\~#\normalfont\space }
+% \end{Verbatim}
+%
+% For other examples of customization of the LaTeX comments, see the part
+% \ref{example-comments} p.~\pageref{example-comments}
+% \end{itemize}
+%
+% \bigskip
+% If the user has required line numbers in the left margin (with the
+% key |line-numbers| or the key |all-line-numbers| of |\PitonOptions|), it's
+% possible to refer to a number of line with the command |\label| used in a
+% LaTeX comment.\footnote{That feature is implemented by using a redefinition of
+% the standard command \texttt{\textbackslash label} in the environments
+% \texttt{\{Piton\}}. Therefore, incompatibilities may occur with extensions
+% which redefine (globally) that command \texttt{\textbackslash label} (for
+% example: \pkg{varioref}, \pkg{refcheck}, \pkg{showlabels}, etc.)}
+%
+% \subsubsection{The key ``math-comments''}
+%
+% It's possible to request that, in the standard Python comments (that is to say
+% those beginning by |#| and not |#>|), the elements between \texttt{\$} be
+% composed in LaTeX mathematical mode (the other elements of the comment being
+% composed verbatim).
+%
+% That feature is activated by the key |math-comments| at load-time (that is to
+% say with the |\usepackage|).
+%
+% \medskip
+% In the following example, we assume that the key |math-comments| has been used
+% when loading \pkg{piton}.
+%
+% \begin{Verbatim}
+% \begin{Piton}
+% def square(x):
+% return x*x ~# compute $x^2$
+% \end{Piton}
+% \end{Verbatim}
+%
+% \begin{Piton}
+% def square(x):
+% return x*x # compute $x^2$
+% \end{Piton}
+%
+% \subsubsection{The mechanism ``escape-inside''}
+%
+% It's also possible to overwrite the Python listings to insert LaTeX code
+% almost everywhere (but between lexical units, of course). By default,
+% \pkg{piton} does not fix any character for that kind of escape.
+%
+% In order to use this mechanism, it's necessary to specify two characters which
+% will delimit the escape (one for the beginning and one for the end) by using
+% the key |escape-inside| at load-time (that is to say at the
+% |\begin{docuemnt}|).
+%
+% \medskip
+% In the following example, we assume that the extension \pkg{piton} has been
+% loaded by the following instruction.
+%
+% \begin{Verbatim}
+% \usepackage[~emphase#escape-inside=$$@]{piton}
+% \end{Verbatim}
+%
+% \medskip
+% In the following code, which is a recursive programmation of the mathematical
+% factorial, we decide to highlight in yellow the instruction which contains the
+% recursive call. That example uses the command |\highLight| of \pkg{lua-ul}
+% (that package requires itself the package \pkg{luacolor}).
+% \begin{Verbatim}
+% \begin{Piton}
+% def fact(n):
+% if n==0:
+% return 1
+% else:
+% ~emphase#$\highLight{$@return n*fact(n-1)~emphase#$}$@
+% \end{Piton}
+% \end{Verbatim}
+%
+% \begin{Piton}
+% def fact(n):
+% if n==0:
+% return 1
+% else:
+% $\highLight{$return n*fact(n-1)$}$
+% \end{Piton}
+%
+% \bigskip
+% In fact, in that case, it's probably easier to use the command |\@highLight|
+% of \pkg{lua-ul}: that command sets a yellow background until the end of the
+% current TeX group. Since the name of that command contains the character |@|,
+% it's necessary to define a synonym without |@| in order to be able to use it
+% directly in |{Piton}|.
+% \begingroup
+% \fvset{commandchars=\~\#\+,formatcom=\color{gray}}
+% \begin{Verbatim}
+% \makeatletter
+% ~emphase#\let\Yellow\@highLight+
+% \makeatother
+% \end{Verbatim}
+% \endgroup
+%
+% \begin{Verbatim}
+% \begin{Piton}
+% def fact(n):
+% if n==0:
+% return 1
+% else:
+% ~emphase#$\Yellow$@return n*fact(n-1)
+% \end{Piton}
+% \end{Verbatim}
+%
+% \makeatletter
+% \let\Yellow\@highLight
+% \makeatother
+%
+%
+% \begin{Piton}
+% def fact(n):
+% if n==0:
+% return 1
+% else:
+% $\Yellow$return n*fact(n-1)
+% \end{Piton}
+%
+%
+%
+% \bigskip
+% \emph{Caution} : The escape to LaTeX allowed by the characters of
+% |escape-inside| is not active in the strings nor in the Python comments
+% (however, it's possible to have a whole Python comment composed in LaTeX by
+% beginning it with |#>|; such comments are merely called ``LaTeX comments'' in
+% this document).
+%
+%
+% \subsection{Behaviour in the class Beamer}
+%
+% \label{beamer}
+%
+% \emph{First remark}\par\nobreak
+% Since the environment |{Piton}| catches its body with a verbatim mode,
+% it's necessary to use the environments |{Piton}| within environments |{frame}|
+% of Beamer protected by the key |fragile|.\footnote{Remind that for an
+% environment \texttt{\{frame\}} of Beamer using the key |fragile|, the
+% instruction \texttt{\textbackslash end\{frame\}} must be alone on a single
+% line (except for any leading whitespace).}
+%
+%
+% \bigskip
+% When the package \pkg{piton} is used within the class
+% \cls{beamer}\footnote{The extension \pkg{piton} detects the class \cls{beamer}
+% but, if needed, it's also possible to activate that mechanism with the key
+% |beamer| provided by \pkg{piton} at load-time: |\textbackslash
+% usepackage[beamer]\{piton\}|}, the behaviour of \pkg{piton} is slightly
+% modified, as described now.
+%
+% \subsubsection{\{Piton\} et \textbackslash PitonInputFile are
+% ``overlay-aware''}
+%
+% When \pkg{piton} is used in the class \cls{beamer}, the environment |{Piton}|
+% and the command |\PitonInputFile| accept the optional argument |<...>| of
+% Beamer for the overlays which are involved.
+%
+% For example, it's possible to write:
+%
+% \begin{Verbatim}
+% \begin{Piton}~emphase#<2-5>@
+% ...
+% \end{Piton}
+% \end{Verbatim}
+%
+% and
+%
+% \begin{Verbatim}
+% \PitonInputFile~emphase#<2-5>@{my_file.py}
+% \end{Verbatim}
+%
+% \subsubsection{Commands of Beamer allowed in \{Piton\} and \textbackslash PitonInputFile}
+%
+% When \pkg{piton} is used in the class \cls{beamer} , the following commands of
+% \cls{beamer} (classified upon their number of arguments) are automatically
+% detected in the environments |{Piton}| (and in the listings processed by
+% |\PitonInputFile|):
+% \begin{itemize}
+% \item no mandatory argument : |\pause|\footnote{One should remark that it's
+% also possible to use the command \texttt{\textbackslash pause} in a ``LaTeX
+% comment'', that is to say by writing \texttt{\#> \textbackslash pause}. By
+% this way, if the Python code is copied, it's still executable by Python}. ;
+% \item one mandatory argument : |\action|, |\alert|, |\invisible|, |\only|, |\uncover| and |\visible| ;
+% \item two mandatory arguments : |\alt| ;
+% \item three mandatory arguments : |\temporal|.
+% \end{itemize}
+
+% \medskip
+% In the mandatory arguments of these commands, the braces must be balanced.
+% However, the braces included in short strings\footnote{The short strings of
+% Python are the strings delimited by characters \texttt{'} or the characters
+% \texttt{"} and not \texttt{'''} nor \texttt{"""}. In Python, the short strings
+% can't extend on several lines.} of Python are not considered.
+%
+% \medskip
+% Regarding the fonctions |\alt| and |\temporal| there should be no carriage
+% returns in the mandatory arguments of these functions.
+%
+% \medskip
+% Here is a complete example of file:
+%
+% \begin{Verbatim}[formatcom = \small\color{gray}]
+% \documentclass{beamer}
+% \usepackage{piton}
+% \begin{document}
+% \begin{frame}[fragile]
+% \begin{Piton}
+% def string_of_list(l):
+% """Convert a list of numbers in string"""
+% ~emphase# \only<2->{s = "{" + str(l[0])}@
+% ~emphase# \only<3->{for x in l[1:]: s = s + "," + str(x)}@
+% ~emphase# \only<4->{s = s + "}"}@
+% return s
+% \end{Piton}
+% \end{frame}
+% \end{document}
+% \end{Verbatim}
+%
+% In the previous example, the braces in the Python strings |"{"| and |"}"| are
+% correctly interpreted (without any escape character).
+%
+%
+%
+%
+% \bigskip
+% \subsubsection{Environments of Beamer allowed in \{Piton\} and \textbackslash PitonInputFile}
+%
+% When \pkg{piton} is used in the class \pkg{beamer}, the following environments
+% of Beamer are directly detected in the environments |{Piton}| (and in the
+% listings processed by |\PitonInputFile|): |{actionenv}|, |{alertenv}|,
+% |{invisibleenv}|, |{onlyenv}|, |{uncoverenv}| and |{visibleenv}|.
+%
+% However, there is a restriction: these environments must contain only \emph{whole
+% lines of Python code} in their body.
+%
+%\medskip
+% Here is an example:
+%
+% \begin{Verbatim}[formatcom = \small\color{gray}]
+% \documentclass{beamer}
+% \usepackage{piton}
+% \begin{document}
+% \begin{frame}[fragile]
+% \begin{Piton}
+% def square(x):
+% """Compure the square of its argument"""
+% ~emphase#\begin{uncoverenv}<2>@
+% return x*x
+% ~emphase#\end{uncoverenv}@
+% \end{Piton}
+% \end{frame}
+% \end{document}
+% \end{Verbatim}
+%
+%
+% \vspace{1cm}
+% \textbf{Remark concerning the command \textbackslash alert and the environment
+% \{alertenv\} of Beamer}\par\nobreak
+%
+% \smallskip
+% Beamer provides an easy way to change the color used by the environment
+% |{alertenv}| (and by the command |\alert| which relies upon it) to highlight
+% its argument. Here is an example:
+%
+% \begin{Verbatim}
+% \setbeamercolor{~emphase#alerted text@}{fg=blue}
+% \end{Verbatim}
+%
+% However, when used inside an environment |{Piton}|, such tuning will probably
+% not be the best choice because \pkg{piton} will, by design, change (most of
+% the time) the color the different elements of text. One may prefer an environment
+% |{alertenv}| that will change the background color for the elements to be
+% hightlighted.
+%
+% \smallskip
+% Here is a code that will do that job and add a yellow background. That code
+% uses the command |\@highLight| of \pkg{lua-ul} (that extension requires also
+% the package \pkg{luacolor}).
+%
+% \begingroup
+% \fvset{commandchars=\~\#\+,formatcom=\color{gray}}
+% \begin{Verbatim}
+% \setbeamercolor{alerted text}{bg=yellow!50}
+% \makeatletter
+% \AddToHook{env/Piton/begin}
+% {\renewenvironment<>{alertenv}{\only~#1{~emphase#\@highLight+[alerted text.bg]}}{}}
+% \makeatother
+% \end{Verbatim}
+% \endgroup
+%
+% That code redefines locally the environment |{alertenv}| within the
+% environments |{Piton}| (we recall that the command |\alert| relies upon that
+% environment |{alertenv}|).
+%
+% \subsection{Page breaks and line breaks}
+%
+% \label{breakable}
+%
+% \subsubsection{Page breaks}
+%
+% By default, the listings produced by the environment |{Piton}| and the command
+% |\PitonInputFile| are not breakable.
+%
+% However, the command |\PitonOptions| provides the key |splittable| to allow such
+% breaks.
+%
+% \begin{itemize}
+% \item If the key |splittable| is used without any value, the listings are
+% breakable everywhere.
+% \item If the key |splittable| is used with a numeric value~$n$ (which must be
+% a non-negative integer number), the listings are breakable but no break will
+% occur within the first $n$ lines and within the last $n$ lines. Therefore,
+% |splittable=1| is equivalent to |splittable|.
+% \end{itemize}
+%
+% \medskip
+% Even with a background color (set by the key |background-color|), the pages
+% breaks are allowed, as soon as the key |splittable| is in force.\footnote{With
+% the key |splittable|, the environments \texttt{\{Piton\}} are breakable, even
+% within a (breakable) environment of \pkg{tcolorbox}. Remind that an
+% environment of \pkg{tcolorbox} included in another environment of
+% \pkg{tcolorbox} is \emph{not} breakable, even when both environments use the
+% key |breakable| of \pkg{tcolorbox}.}
+%
+% \subsubsection{Line breaks}
+%
+% \label{line-breaks}
+%
+% By default, the elements produced by \pkg{piton} can't be broken by an end on
+% line. However, there are keys to allow such breaks (the possible breaking
+% points are the spaces, even the spaces in the Python strings).
+% \begin{itemize}
+% \item With the key |break-lines-in-piton|, the line breaks are allowed in the
+% command |\piton{...}| (but not in the command \verb+\piton|...|+, that is to say
+% the command |\piton| in verbatim mode).
+% \item With the key |break-lines-in-Piton|, the line breaks are allowed in the
+% environment |{Piton}| (hence the capital letter |P| in the name) and in the
+% listings produced by |\PitonInputFile|.
+% \item The key |break-lines| is a conjonction of the two previous keys.
+% \end{itemize}
+%
+% \bigskip
+% The package \pkg{piton} provides also several keys to control the appearance
+% on the line breaks allowed by |break-lines-in-Piton|.
+%
+% \begin{itemize}
+% \item With the key |indent-broken-lines|, the indentation of a broken line is
+% respected at carriage return.
+%
+% \item The key |end-of-broken-line| corresponds to the symbol placed at the end
+% of a broken line. The initial value is: |\hspace*{0.5em}\textbackslash|.
+%
+% \item The key |continuation-symbol| corresponds to the symbol placed at each
+% carriage return. The initial value is: |+\;|.
+%
+% \item The key |continuation-symbol-on-indentation| coresponds to the symbol
+% placed at each carriage return, on the position of the indentation (only when
+% the key |indent-broken-line| is in force). The initial value is:
+% |$\hookrightarrow\;$|.
+% \end{itemize}
+%
+%
+% \bigskip
+% The following code has been composed in a standard LaTeX |{minipage}| of width
+% 12~cm with the following tuning:
+%
+% \begin{Verbatim}
+% \PitonOptions{break-lines,indent-broken-lines,background-color=gray!15}
+% \end{Verbatim}
+%
+% \begin{center}
+% \PitonOptions{break-lines,indent-broken-lines,background-color=gray!15}
+% \begin{minipage}{12cm}
+% \begin{Piton}
+% def dict_of_list(l):
+% """Converts a list of subrs and descriptions of glyphs in a dictionary"""
+% our_dict = {}
+% for list_letter in l:
+% if (list_letter[0][0:3] == 'dup'): # if it's a subr
+% name = list_letter[0][4:-3]
+% print("We treat the subr of number " + name)
+% else:
+% name = list_letter[0][1:-3] # if it's a glyph
+% print("We treat the glyph of number " + name)
+% our_dict[name] = [treat_Postscript_line(k) for k in list_letter[1:-1]]
+% return dict
+% \end{Piton}
+% \end{minipage}
+% \end{center}
+%
+% \subsection{Footnotes in the environments of piton}
+%
+% \label{footnote}
+% If you want to put footnotes in an environment |{Piton}| or
+% (or, more unlikely, in a listing produced by |\PitonInputFile|), you can use a
+% pair |\footnotemark|--|\footnotetext|.
+%
+% \smallskip
+% However, it's also possible to extract the footnotes with the help of the
+% package \pkg{footnote} or the package \pkg{footnotehyper}.
+%
+% \smallskip
+% If \pkg{piton} is loaded with the option |footnote| (with
+% |\usepackage[footnote]{piton}| or with |\PassOptionsToPackage|), the
+% package \pkg{footnote} is loaded (if it is not yet loaded) and it is used to
+% extract the footnotes.
+%
+% \smallskip
+% If \pkg{piton} is loaded with the option |footnotehyper|, the package
+% \pkg{footnotehyper} is loaded (if it is not yet loaded) ant it is used to
+% extract footnotes.
+%
+% \smallskip
+% Caution: The packages \pkg{footnote} and \pkg{footnotehyper} are incompatible.
+% The package \pkg{footnotehyper} is the successor of the package \pkg{footnote}
+% and should be used preferently. The package \pkg{footnote} has some drawbacks,
+% in particular: it must be loaded after the package \pkg{xcolor} and it is not
+% perfectly compatible with \pkg{hyperref}.
+%
+% \medskip
+% In this document, the package \pkg{piton} has been loaded with the
+% option |footnotehyper|. For examples of notes, cf. \ref{notes-examples},
+% p.~\pageref{notes-examples}.
+%
+% \subsection{Tabulations}
+%
+% \smallskip
+% Even though it's recommended to indent the Python listings with spaces (see
+% PEP~8), \pkg{piton} accepts the characters of tabulation (that is to say the
+% characters U+0009) at the beginning of the lines. Each character U+0009 is
+% replaced by $n$~spaces. The initial value of $n$ is $4$ but it's possible to
+% change it with the key |tab-size| of |\PitonOptions|.
+%
+% \smallskip
+% There exists also a key |tabs-auto-gobble| which computes the minimal value
+% $n$ of the number of consecutive characters U+0009 beginning each (non empty)
+% line of the environment |{Piton}| and applies |gobble| with that value of~$n$
+% (before replacement of the tabulations by spaces, of course). Hence, that key
+% is similar to the key |auto-gobble| but acts on U+0009 instead of U+0020
+% (spaces).
+%
+% \section{Examples}
+%
+% \subsection{Line numbering}
+%
+% \label{example-numbering}
+%
+% We remind that it's possible to have an automatic numbering of the lines in
+% the Python listings by using the key |line-numbers| or the key |all-line-numbers|.
+%
+% By default, the numbers of the lines are composed by \pkg{piton} in an
+% overlapping position on the left (by using internally the command |\llap| of LaTeX).
+%
+% In order to avoid that overlapping, it's possible to use the option |left-margin=auto|
+% which will insert automatically a margin adapted to the numbers of lines that
+% will be written (that margin is larger when the numbers are greater than~10).
+%
+%
+% \begingroup
+% \fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
+% \begin{Verbatim}
+% ~emphase&\PitonOptions{background-color=gray!10, left-margin = auto, line-numbers}@
+% \begin{Piton}
+% def arctan(x,n=10):
+% if x < 0:
+% return -arctan(-x) #> (appel récursif)
+% elif x > 1:
+% return pi/2 - arctan(1/x) #> (autre appel récursif)
+% else:
+% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+% \end{Piton}
+% \end{Verbatim}
+% \endgroup
+%
+%
+%
+% \begingroup
+% \PitonOptions{background-color=gray!10,left-margin = auto, line-numbers}
+% \begin{Piton}
+% def arctan(x,n=10):
+% if x < 0:
+% return -arctan(-x) #> (appel récursif)
+% elif x > 1:
+% return pi/2 - arctan(1/x) #> (autre appel récursif)
+% else:
+% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+% \end{Piton}
+% \endgroup
+%
+%
+%
+% \bigskip
+% \subsection{Formatting of the LaTeX comments}
+%
+% \label{example-comments}
+%
+% It's possible to modify the style |Comment.LaTeX| (with |\SetPitonStyle|) in
+% order to display the LaTeX comments (which begin with |#>|) aligned on the
+% right margin.
+%
+%
+% \begingroup
+% \fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
+% \begin{Verbatim}
+% \PitonOptions{background-color=gray!10}
+% ~emphase&\SetPitonStyle{Comment.LaTeX = \hfill \normalfont\color{gray}}@
+% \begin{Piton}
+% def arctan(x,n=10):
+% if x < 0:
+% return -arctan(-x) #> appel récursif
+% elif x > 1:
+% return pi/2 - arctan(1/x) #> autre appel récursif
+% else:
+% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+% \end{Piton}
+% \end{Verbatim}
+% \endgroup
+%
+% \begingroup
+% \PitonOptions{background-color=gray!10}
+% \SetPitonStyle{Comment.LaTeX = \hfill \normalfont\color{gray}}
+% \begin{Piton}
+% def arctan(x,n=10):
+% if x < 0:
+% return -arctan(-x) #> appel récursif
+% elif x > 1:
+% return pi/2 - arctan(1/x) #> autre appel récursif
+% else:
+% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+% \end{Piton}
+% \endgroup
+%
+%
+% \vspace{1cm}
+% It's also possible to display these LaTeX comments in a kind of second column
+% by limiting the width of the Python code by an environment |{minipage}| of LaTeX.
+%
+%
+% \begingroup
+% \fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
+% \begin{Verbatim}
+% \PitonOptions{background-color=gray!10}
+% ~emphase&\NewDocumentCommand{\MyLaTeXCommand}{m}{\hfill \normalfont\itshape\rlap{\quad #1}}@
+% ~emphase&\SetPitonStyle{Comment.LaTeX = \MyLaTeXCommand}@
+% ~emphase&\begin{minipage}{12cm}@
+% \begin{Piton}
+% def arctan(x,n=10):
+% if x < 0:
+% return -arctan(-x) #> appel récursif
+% elif x > 1:
+% return pi/2 - arctan(1/x) #> autre appel récursif
+% else:
+% s = 0
+% for k in range(n):
+% s += (-1)**k/(2*k+1)*x**(2*k+1)
+% return s
+% \end{Piton}
+% ~emphase&\end{minipage}@
+% \end{Verbatim}
+% \endgroup
+%
+%
+%
+% \begingroup
+% \PitonOptions{background-color=gray!10}
+% \NewDocumentCommand{\MyLaTeXCommand}{m}{\hfill \normalfont\itshape\rlap{\quad #1}}
+% \SetPitonStyle{Comment.LaTeX = \MyLaTeXCommand}
+% \begin{minipage}{12cm}
+% \begin{Piton}
+% def arctan(x,n=10):
+% if x < 0:
+% return -arctan(-x) #> appel récursif
+% elif x > 1:
+% return pi/2 - arctan(1/x) #> autre appel récursif
+% else:
+% s = 0
+% for k in range(n):
+% s += (-1)**k/(2*k+1)*x**(2*k+1)
+% return s
+% \end{Piton}
+% \end{minipage}
+% \endgroup
+%
+%
+% \bigskip
+% \subsection{Notes in the listings}
+%
+% \label{notes-examples}
+%
+% In order to be able to extract the notes (which are typeset with the command
+% |\footnote|), the extension \pkg{piton} must be loaded with the key |footnote|
+% or the key |footenotehyper| as explained in the section \ref{footnote}
+% p.~\pageref{footnote}. In this document, the extension \pkg{piton} has been
+% loaded with the key |footnotehyper|.
+%
+% Of course, in an environment |{Piton}|, a command |\footnote| may appear only
+% within a LaTeX comment (which begins with |#>|). It's possible to have comments
+% which contain only that command |\footnote|. That's the case in the following example.
+%
+%
+%
+% \begingroup
+% \fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
+% \begin{Verbatim}
+% \PitonOptions{background-color=gray!10}
+% \begin{Piton}
+% def arctan(x,n=10):
+% if x < 0:
+% return -arctan(-x)~emphase&#>\footnote{First recursive call.}]@
+% elif x > 1:
+% return pi/2 - arctan(1/x)~emphase&#>\footnote{Second recursive call.}@
+% else:
+% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+% \end{Piton}
+% \end{Verbatim}
+% \endgroup
+%
+% \begingroup
+% \PitonOptions{background-color=gray!10}
+% \begin{Piton}
+% def arctan(x,n=10):
+% if x < 0:
+% return -arctan(-x)#>\footnote{First recursive call.}
+% elif x > 1:
+% return pi/2 - arctan(1/x)#>\footnote{Second recursive call.}
+% else:
+% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+% \end{Piton}
+% \endgroup
+%
+%
+% \vspace{1cm}
+%
+% If an environment |{Piton}| is used in an environment |{minipage}| of LaTeX,
+% the notes are composed, of course, at the foot of the environment
+% |{minipage}|. Recall that such |{minipage}| can't be broken by a page break.
+%
+%
+% \begingroup
+% \fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
+% \begin{Verbatim}
+% \PitonOptions{background-color=gray!10}
+% \emphase\begin{minipage}{\linewidth}
+% \begin{Piton}
+% def arctan(x,n=10):
+% if x < 0:
+% return -arctan(-x)~emphase&#>\footnote{First recursive call.}@
+% elif x > 1:
+% return pi/2 - arctan(1/x)~emphase&#>\footnote{Second recursive call.}@
+% else:
+% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+% \end{Piton}
+% \end{minipage}
+% \end{Verbatim}
+% \endgroup
+%
+% \begingroup
+% \PitonOptions{background-color=gray!10}
+% \begin{minipage}{\linewidth}
+% \begin{Piton}
+% def arctan(x,n=10):
+% if x < 0:
+% return -arctan(-x)#>\footnote{First recursive call.}
+% elif x > 1:
+% return pi/2 - arctan(1/x)#>\footnote{Second recursive call.}
+% else:
+% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+% \end{Piton}
+% \end{minipage}
+% \endgroup
+%
+%
+% \vspace{1cm}
+% If we embed an environment |{Piton}| in an environment |{minipage}|
+% (typically in order to limit the width of a colored background), it's
+% necessary to embed the whole environment |{minipage}| in an environment
+% |{savenotes}| (of \pkg{footnote} or \pkg{footnotehyper}) in order to have the
+% footnotes composed at the bottom of the page.
+%
+% \begingroup
+% \fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
+% \begin{Verbatim}
+% \PitonOptions{background-color=gray!10}
+% ~emphase&\begin{savenotes}@
+% \begin{minipage}{13cm}
+% \begin{Piton}
+% def arctan(x,n=10):
+% if x < 0:
+% return -arctan(-x)~emphase&#>\footnote{First recursive call.}@
+% elif x > 1:
+% return pi/2 - arctan(1/x)~emphase&#>\footnote{Second recursive call.}@
+% else:
+% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+% \end{Piton}
+% \end{minipage}
+% ~emphase&\end{savenotes}@
+% \end{Verbatim}
+% \endgroup
+%
+%
+%
+% \begin{savenotes}
+% \PitonOptions{background-color=gray!10}
+% \begin{minipage}{13cm}
+% \begin{Piton}
+% def arctan(x,n=10):
+% if x < 0:
+% return -arctan(-x)#>\footnote{First recursive call.}
+% elif x > 1:
+% return pi/2 - arctan(1/x)#>\footnote{Second recursive call.}
+% else:
+% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+% \end{Piton}
+% \end{minipage}
+% \end{savenotes}
+%
+% \bigskip
+%
+% \subsection{An example of tuning of the styles}
+%
+% The graphical styles have been presented in the section \ref{styles},
+% p.~\pageref{styles}.
+%
+% \smallskip
+% We present now an example of tuning of these styles adapted to the documents
+% in black and white. We use the font \emph{DejaVu Sans Mono}\footnote{See:
+% \url{https://dejavu-fonts.github.io}} specified by the command |\setmonofont| of
+% \pkg{fontspec}.
+%
+% That tuning uses the command |\highLight| of \pkg{lua-ul} (that package
+% requires itself the package \pkg{luacolor}).
+%
+% \begin{Verbatim}
+% \setmonofont[Scale=0.85]{DejaVu Sans Mono}
+%
+% \SetPitonStyle
+% {
+% Number = ,
+% String = \itshape ,
+% String.Doc = \color{gray} \slshape ,
+% Operator = ,
+% Operator.Word = \bfseries ,
+% Name.Builtin = ,
+% Name.Function = \bfseries \highLight[gray!20] ,
+% Comment = \color{gray} ,
+% Comment.LaTeX = \normalfont \color{gray},
+% Keyword = \bfseries ,
+% Name.Namespace = ,
+% Name.Class = ,
+% Name.Type = ,
+% InitialValues = \color{gray}
+% }
+% \end{Verbatim}
+%
+%
+% \begingroup
+%
+% \setmonofont[Scale=0.85]{DejaVu Sans Mono}
+%
+% \PitonOptions{splittable}
+%
+% \SetPitonStyle
+% {
+% Number = ,
+% String = \itshape ,
+% String.Doc = \color{gray} \slshape ,
+% Operator.Word = \bfseries ,
+% Operator = ,
+% Name.Builtin = ,
+% Name.Function = \bfseries \highLight[gray!20] ,
+% Comment = \color{gray} ,
+% Comment.LaTeX = \normalfont \color{gray} ,
+% Keyword = \bfseries ,
+% Name.Namespace = ,
+% Name.Class = ,
+% Name.Type = ,
+% InitialValues = \color{gray}
+% }
+%
+%
+% \bigskip
+%
+% \begin{Piton}
+% from math import pi
+%
+% def arctan(x,n=10):
+% """Compute the mathematical value of arctan(x)
+%
+% n is the number of terms in the sum
+% """
+% if x < 0:
+% return -arctan(-x) # appel récursif
+% elif x > 1:
+% return pi/2 - arctan(1/x)
+% #> (we have used that $\arctan(x)+\arctan(1/x)=\pi/2$ for $x>0$)
+% else:
+% s = 0
+% for k in range(n):
+% s += (-1)**k/(2*k+1)*x**(2*k+1)
+% return s
+% \end{Piton}
+%
+% \endgroup
+%
+% \subsection{Use with pyluatex}
+%
+% The package \pkg{pyluatex} is an extension which allows the execution of some
+% Python code from |lualatex| (provided that Python is installed on the machine
+% and that the compilation is done with |lualatex| and |--shell-escape|).
+%
+% Here is, for example, an environment |{PitonExecute}| which formats a Python
+% listing (with \pkg{piton}) but display also the output of the execution of the
+% code with Python (for technical reasons, the |!| is mandatory in the signature
+% of the environment).
+%
+%
+% \begin{Verbatim}
+% \ExplSyntaxOn
+% \NewDocumentEnvironment { ~emphase#PitonExecute@ } { ! O { } } % the ! is mandatory
+% {
+% \PyLTVerbatimEnv
+% \begin{pythonq}
+% }
+% {
+% \end{pythonq}
+% \directlua
+% {
+% tex.print("\\PitonOptions{~#1}")
+% tex.print("\\begin{Piton}")
+% tex.print(pyluatex.get_last_code())
+% tex.print("\\end{Piton}")
+% tex.print("")
+% }
+% \begin{center}
+% \directlua{tex.print(pyluatex.get_last_output())}
+% \end{center}
+% }
+% \ExplSyntaxOff
+% \end{Verbatim}
+%
+% \ExplSyntaxOn
+% \NewDocumentEnvironment { PitonExecute } { ! O { } }
+% {
+% \PyLTVerbatimEnv
+% \begin{pythonq}
+% }
+% {
+% \end{pythonq}
+% \directlua
+% {
+% tex.print("\\PitonOptions{#1}")
+% tex.print("\\begin{Piton}")
+% tex.print(pyluatex.get_last_code())
+% tex.print("\\end{Piton}")
+% tex.print("")
+% }
+% \begin{center}
+% \directlua{tex.print(pyluatex.get_last_output())}
+% \end{center}
+% }
+% \ExplSyntaxOff
+%
+% This environment |{PitonExecute}| takes in as optional argument (between
+% square brackets) the options of the command |\PitonOptions|.
+%
+%
+% \bigskip
+% \clearpage
+%
+% \section{Implementation}
+%
+% \subsection{Introduction}
+%
+% The main job of the package \pkg{piton} is to take in as input a Python
+% listing and to send back to LaTeX as output that code \emph{with interlaced LaTeX
+% instructions of formatting}.
+%
+% In fact, all that job is done by a \textsc{lpeg} called |python|. That
+% \textsc{lpeg}, when matched against the string of a Python listing,
+% returns as capture a Lua table containing data to send to LaTeX.
+% The only thing to do after will be to apply |tex.tprint| to each element of
+% that table.\footnote{Recall that |tex.tprint| takes in as argument a Lua table whose
+% first component is a ``catcode table'' and the second element a string. The
+% string will be sent to LaTeX with the regime of catcodes specified by the
+% catcode table. If no catcode table is provided, the standard catcodes of LaTeX
+% will be used.}
+%
+% \bigskip
+% Consider, for example, the following Python code:
+%
+% \begin{Piton}
+% def parity(x):
+% return x%2
+% \end{Piton}
+%
+% The capture returned by the \pkg{lpeg} |python| against that code is the
+% Lua table containing the following elements :
+%
+% \bigskip
+% \begin{minipage}{\linewidth}
+% \color{gray}
+%
+% |{ "\\__piton_begin_line:" }|\footnote{Each line of the Python listings will
+% be encapsulated in a pair: \texttt{\textbackslash_@@_begin_line:} --
+% \texttt{\textbackslash@@_end_line:}. The token
+% \texttt{\textbackslash@@_end_line:} must be explicit because it will be used as
+% marker in order to delimit the argument of the command \texttt{\textbackslash
+% @@\_begin\_line:}. Both tokens \texttt{\textbackslash_@@_begin_line:} and
+% \texttt{\textbackslash@@_end_line:} will be nullified in the command
+% \texttt{\textbackslash piton} (since there can't be lines breaks in the
+% argument of a command \texttt{\textbackslash piton}).}
+%
+% \texttt{\{ "\{\textbackslash PitonStyle\{Keyword\}\{" \}}\footnote{The
+% lexical elements of Python for which we have a \pkg{piton} style will be
+% formatted via the use of the command \texttt{\textbackslash PitonStyle}.
+% Such an element is typeset in LaTeX via the syntax \texttt{\{\textbackslash
+% PitonStyle\{\textsl{style}\}\{...\}\}} because the instructions inside an \texttt{\textbackslash
+% PitonStyle} may be both semi-global declarations like
+% \texttt{\textbackslash bfseries} and commands with one argument like
+% \texttt{\textbackslash fbox}.}
+%
+% \texttt{\{
+% luatexbase.catcodetables.CatcodeTableOther\footnote{\texttt{luatexbase.catcodetables.CatcodeTableOther} is a mere number which corresponds to the ``catcode table'' whose all characters have the catcode ``other'' (which means that they will be typeset by LaTeX verbatim).}, "def" \} }
+%
+% |{ "}}" }|
+%
+% |{ luatexbase.catcodetables.CatcodeTableOther, " " }|
+%
+% |{ "{\PitonStyle{Name.Function}{" }|
+%
+% |{ luatexbase.catcodetables.CatcodeTableOther, "parity" }|
+%
+% |{ "}}" }|
+%
+% |{ luatexbase.catcodetables.CatcodeTableOther, "(" }|
+%
+% |{ luatexbase.catcodetables.CatcodeTableOther, "x" }|
+%
+% |{ luatexbase.catcodetables.CatcodeTableOther, ")" }|
+%
+% |{ luatexbase.catcodetables.CatcodeTableOther, ":" }|
+%
+% |{ "\\__piton_end_line: \\__piton_newline: \\__piton_begin_line:" }|
+%
+% |{ luatexbase.catcodetables.CatcodeTableOther, " " }|
+%
+% |{ "{\PitonStyle{Keyword}{" }|
+%
+% |{ luatexbase.catcodetables.CatcodeTableOther, "return" }|
+%
+% |{ "}}" }|
+%
+% |{ luatexbase.catcodetables.CatcodeTableOther, " " }|
+%
+% |{ luatexbase.catcodetables.CatcodeTableOther, "x" }|
+%
+% |{ "{\PitonStyle{Operator}{" }|
+%
+% |{ luatexbase.catcodetables.CatcodeTableOther, "&" }|
+%
+% |{ "}}" }|
+%
+% |{ "{\PitonStyle{Number}{" }|
+%
+% |{ luatexbase.catcodetables.CatcodeTableOther, "2" }|
+%
+% |{ "}}" }|
+%
+% |{ "\\__piton_end_line:" }|
+%
+% \end{minipage}
+%
+% \bigskip
+% We give now the LaTeX code which is sent back by Lua to TeX (we have written
+% on several lines for legibility but no character |\r| will be sent to LaTeX). The
+% characters which are greyed-out are sent to LaTeX with the catcode ``other''
+% (=12). All the others characters are sent with the regime of catcodes of L3
+% (as set by |\ExplSyntaxOn|)
+%
+%
+% \begingroup
+% \def\gbox#1{\colorbox{gray!20}{\strut #1}}
+% \setlength{\fboxsep}{1pt}
+%
+% \begin{Verbatim*}[formatcom = \color{black}]
+% \__piton_begin_line:{\PitonStyle{Keyword}{~gbox#def@}}
+% ~gbox# @{\PitonStyle{Name.Function}{~gbox#parity@}}~gbox#(x):@\__piton_end_line:\__piton_newline:
+% \__piton_begin_line:~gbox# @{\PitonStyle{Keyword}{~gbox#return@}}
+% ~gbox# x@{\PitonStyle{Operator}{~gbox#%@}}{\PitonStyle{Number}{~gbox#2@}}\__piton_end_line:
+% \end{Verbatim*}
+% \endgroup
+%
+%
+%
+%
+% \subsection{The L3 part of the implementation}
+%
+% \subsubsection{Declaration of the package}
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\RequirePackage{l3keys2e}
+\ProvidesExplPackage
+ {piton}
+ {\myfiledate}
+ {\myfileversion}
+ {Highlight Python codes with LPEG on LuaLaTeX}
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\msg_new:nnn { piton } { LuaLaTeX~mandatory }
+ {
+ LuaLaTeX~is~mandatory.\\
+ The~package~'piton'~requires~the~engine~LuaLaTeX.\\
+ \str_if_eq:VnT \c_sys_jobname_str { output }
+ { If~you~use~Overleaf,~you~can~switch~to~LuaLaTeX~in~the~"Menu". \\}
+ If~you~go~on,~the~package~'piton'~won't~be~loaded.
+ }
+\sys_if_engine_luatex:F { \msg_critical:nn { piton } { LuaLaTeX~mandatory } }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\RequirePackage { luatexbase }
+% \end{macrocode}
+%
+% \bigskip
+% The boolean |\c_@@_footnotehyper_bool| will indicate if the option
+% |footnotehyper| is used.
+% \begin{macrocode}
+\bool_new:N \c_@@_footnotehyper_bool
+% \end{macrocode}
+%
+% \medskip
+% The boolean |\c_@@_footnote_bool| will indicate if the option |footnote| is
+% used, but quicky, it will also be set to |true| if the option |footnotehyper|
+% is used.
+% \begin{macrocode}
+\bool_new:N \c_@@_footnote_bool
+% \end{macrocode}
+%
+% \medskip
+% The following boolean corresponds to the key |math-comments| (only at load-time).
+% \begin{macrocode}
+\bool_new:N \c_@@_math_comments_bool
+% \end{macrocode}
+%
+% \medskip
+% The following boolean corresponds to the key |beamer|.
+% \begin{macrocode}
+\bool_new:N \c_@@_beamer_bool
+% \end{macrocode}
+%
+% \bigskip
+% We define a set of keys for the options at load-time.
+% \begin{macrocode}
+\keys_define:nn { piton / package }
+ {
+ footnote .bool_set:N = \c_@@_footnote_bool ,
+ footnotehyper .bool_set:N = \c_@@_footnotehyper_bool ,
+ escape-inside .tl_set:N = \c_@@_escape_inside_tl ,
+ escape-inside .initial:n = ,
+ comment-latex .code:n = { \lua_now:n { comment_latex = "#1" } } ,
+ comment-latex .value_required:n = true ,
+ math-comments .bool_set:N = \c_@@_math_comments_bool ,
+ math-comments .default:n = true ,
+ beamer .bool_set:N = \c_@@_beamer_bool ,
+ beamer .default:n = true ,
+ unknown .code:n = \msg_error:nn { piton } { unknown~key~for~package }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\msg_new:nnn { piton } { unknown~key~for~package }
+ {
+ Unknown~key.\\
+ You~have~used~the~key~'\l_keys_key_str'~but~the~only~keys~available~here~
+ are~'beamer',~'comment-latex',~'escape-inside',~'footnote',~'footnotehyper'~and~
+ 'math-comments'.~Other~keys~are~available~in~\token_to_str:N \PitonOptions.\\
+ That~key~will~be~ignored.
+ }
+% \end{macrocode}
+%
+% \bigskip
+% We process the options provided by the user at load-time.
+% \begin{macrocode}
+\ProcessKeysOptions { piton / package }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\begingroup
+\cs_new_protected:Npn \@@_set_escape_char:nn #1 #2
+ {
+ \lua_now:n { piton_begin_escape = "#1" }
+ \lua_now:n { piton_end_escape = "#2" }
+ }
+\cs_generate_variant:Nn \@@_set_escape_char:nn { x x }
+\@@_set_escape_char:xx
+ { \tl_head:V \c_@@_escape_inside_tl }
+ { \tl_tail:V \c_@@_escape_inside_tl }
+\endgroup
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\@ifclassloaded { beamer } { \bool_set_true:N \c_@@_beamer_bool } { }
+\bool_if:NT \c_@@_beamer_bool { \lua_now:n { piton_beamer = true } }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\hook_gput_code:nnn { begindocument } { . }
+ {
+ \@ifpackageloaded { xcolor }
+ { }
+ { \msg_fatal:nn { piton } { xcolor~not~loaded } }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\msg_new:nnn { piton } { xcolor~not~loaded }
+ {
+ xcolor~not~loaded \\
+ The~package~'xcolor'~is~required~by~'piton'.\\
+ This~error~is~fatal.
+ }
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\msg_new:nnn { piton } { footnote~with~footnotehyper~package }
+ {
+ Footnote~forbidden.\\
+ You~can't~use~the~option~'footnote'~because~the~package~
+ footnotehyper~has~already~been~loaded.~
+ If~you~want,~you~can~use~the~option~'footnotehyper'~and~the~footnotes~
+ within~the~environments~of~piton~will~be~extracted~with~the~tools~
+ of~the~package~footnotehyper.\\
+ If~you~go~on,~the~package~footnote~won't~be~loaded.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\msg_new:nnn { piton } { footnotehyper~with~footnote~package }
+ {
+ You~can't~use~the~option~'footnotehyper'~because~the~package~
+ footnote~has~already~been~loaded.~
+ If~you~want,~you~can~use~the~option~'footnote'~and~the~footnotes~
+ within~the~environments~of~piton~will~be~extracted~with~the~tools~
+ of~the~package~footnote.\\
+ If~you~go~on,~the~package~footnotehyper~won't~be~loaded.
+ }
+% \end{macrocode}
+%
+% \medskip
+% \begin{macrocode}
+\bool_if:NT \c_@@_footnote_bool
+ {
+% \end{macrocode}
+% The class \cls{beamer} has its own system to extract footnotes and that's why
+% we have nothing to do if \cls{beamer} is used.
+% \begin{macrocode}
+ \@ifclassloaded { beamer }
+ { \bool_set_false:N \c_@@_footnote_bool }
+ {
+ \@ifpackageloaded { footnotehyper }
+ { \@@_error:n { footnote~with~footnotehyper~package } }
+ { \usepackage { footnote } }
+ }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\bool_if:NT \c_@@_footnotehyper_bool
+ {
+% \end{macrocode}
+% The class \cls{beamer} has its own system to extract footnotes and that's why
+% we have nothing to do if \cls{beamer} is used.
+% \begin{macrocode}
+ \@ifclassloaded { beamer }
+ { \bool_set_false:N \c_@@_footnote_bool }
+ {
+ \@ifpackageloaded { footnote }
+ { \@@_error:n { footnotehyper~with~footnote~package } }
+ { \usepackage { footnotehyper } }
+ \bool_set_true:N \c_@@_footnote_bool
+ }
+ }
+% \end{macrocode}
+% The flag |\c_@@_footnote_bool| is raised and so, we will only have to test
+% |\c_@@_footnote_bool| in order to know if we have to insert an environment
+% |{savenotes}|.
+%
+% \bigskip
+% \subsubsection{Parameters and technical definitions}
+%
+% The following string will contain the name of the informatic language
+% considered (the initial value is |python|).
+%
+% \begin{macrocode}
+\str_new:N \l_@@_language_str
+\str_set:Nn \l_@@_language_str { python }
+% \end{macrocode}
+%
+% We will compute (with Lua) the numbers of lines of the Python code and store
+% it in the following counter.
+% \begin{macrocode}
+\int_new:N \l_@@_nb_lines_int
+% \end{macrocode}
+%
+% The same for the number of non-empty lines of the Python codes.
+% \begin{macrocode}
+\int_new:N \l_@@_nb_non_empty_lines_int
+% \end{macrocode}
+%
+% The following counter will be used to count the lines during the composition.
+% It will count all the lines, empty or not empty. It won't be used to print the
+% numbers of the lines.
+% \begin{macrocode}
+\int_new:N \g_@@_line_int
+% \end{macrocode}
+%
+% \medskip
+% The following token list will contains the (potential) informations to write
+% on the |aux| (to be used in the next compilation).
+% \begin{macrocode}
+\tl_new:N \g_@@_aux_tl
+% \end{macrocode}
+%
+% \medskip
+% The following counter corresponds to the key |splittable| of |\PitonOptions|.
+% If the value of |\l_@@_splittable_int| is equal to $n$, then no line break can
+% occur within the first $n$~lines or the last $n$~lines of the listings.
+% \begin{macrocode}
+\int_new:N \l_@@_splittable_int
+% \end{macrocode}
+%
+% \medskip
+% An initial value of |splittable| equal to 100 is equivalent to say that the
+% environments |{Piton}| are unbreakable.
+% \begin{macrocode}
+\int_set:Nn \l_@@_splittable_int { 100 }
+% \end{macrocode}
+%
+% \medskip
+% The following string corresponds to the key |background-color| of |\PitonOptions|.
+% \begin{macrocode}
+\clist_new:N \l_@@_bg_color_clist
+% \end{macrocode}
+%
+% \medskip
+% The package \pkg{piton} will also detect the lines of code which correspond to
+% the user input in a Python console, that is to say the lines of code beginning
+% with |>>>| and |...|. It's possible, with the key |prompt-background-color|,
+% to require a background for these lines of code (and the other lines of code
+% will have the standard background color specified by |background-color|).
+% \begin{macrocode}
+\tl_new:N \l_@@_prompt_bg_color_tl
+% \end{macrocode}
+%
+% \medskip
+% We will compute the maximal width of the lines of an environment |{Piton}| in
+% |\g_@@_width_dim|. We need a global variable because, when the key |footnote|
+% is in force, each line when be composed in an environment |{savenotes}| and
+% (when |slim| is in force) we need to exit |\g_@@_width_dim| from that
+% environment.
+% \begin{macrocode}
+\dim_new:N \g_@@_width_dim
+% \end{macrocode}
+% The value of that dimension as written on the |aux| file will be stored in
+% |\l_@@_width_on_aux_dim|.
+% \begin{macrocode}
+\dim_new:N \l_@@_width_on_aux_dim
+% \end{macrocode}
+%
+% \medskip
+% We will count the environments |{Piton}| (and, in fact, also the commands
+% |\PitonInputFile|, despite the name |\g_@@_env_int|).
+% \begin{macrocode}
+\int_new:N \g_@@_env_int
+% \end{macrocode}
+%
+% \medskip
+% The following boolean corresponds to the key |show-spaces|.
+% \begin{macrocode}
+\bool_new:N \l_@@_show_spaces_bool
+% \end{macrocode}
+%
+% \medskip
+% The following booleans correspond to the keys |break-lines| and
+% |indent-broken-lines|.
+% \begin{macrocode}
+\bool_new:N \l_@@_break_lines_in_Piton_bool
+\bool_new:N \l_@@_indent_broken_lines_bool
+% \end{macrocode}
+%
+% \medskip
+% The following token list corresponds to the key |continuation-symbol|.
+% \begin{macrocode}
+\tl_new:N \l_@@_continuation_symbol_tl
+\tl_set:Nn \l_@@_continuation_symbol_tl { + }
+% \end{macrocode}
+%
+% \medskip
+% \begin{macrocode}
+% The following token list corresponds to the key
+% |continuation-symbol-on-indentation|. The name has been shorten to |csoi|.
+\tl_new:N \l_@@_csoi_tl
+\tl_set:Nn \l_@@_csoi_tl { $ \hookrightarrow \; $ }
+% \end{macrocode}
+%
+% \medskip
+% The following token list corresponds to the key |end-of-broken-line|.
+% \begin{macrocode}
+\tl_new:N \l_@@_end_of_broken_line_tl
+\tl_set:Nn \l_@@_end_of_broken_line_tl { \hspace*{0.5em} \textbackslash }
+% \end{macrocode}
+%
+% \medskip
+% The following boolean corresponds to the key |break-lines-in-piton|.
+% \begin{macrocode}
+\bool_new:N \l_@@_break_lines_in_piton_bool
+% \end{macrocode}
+%
+% \medskip
+% The following boolean corresponds to the key |slim| of |\PitonOptions|.
+% \begin{macrocode}
+\bool_new:N \l_@@_slim_bool
+% \end{macrocode}
+%
+% \medskip
+% The following dimension corresponds to the key |left-margin| of |\PitonOptions|.
+% \begin{macrocode}
+\dim_new:N \l_@@_left_margin_dim
+% \end{macrocode}
+%
+% \medskip
+% The following boolean will be set when the key |left-margin=auto|
+% is used.
+% \begin{macrocode}
+\bool_new:N \l_@@_left_margin_auto_bool
+% \end{macrocode}
+%
+% \medskip
+% The following dimension corresponds to the key |numbers-sep| of
+% |\PitonOptions|.
+% \begin{macrocode}
+\dim_new:N \l_@@_numbers_sep_dim
+\dim_set:Nn \l_@@_numbers_sep_dim { 0.7 em }
+% \end{macrocode}
+%
+% \medskip
+% The tabulators will be replaced by the content of the following token list.
+% \begin{macrocode}
+\tl_new:N \l_@@_tab_tl
+% \end{macrocode}
+%
+% \medskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_set_tab_tl:n #1
+ {
+ \tl_clear:N \l_@@_tab_tl
+ \prg_replicate:nn { #1 }
+ { \tl_put_right:Nn \l_@@_tab_tl { ~ } }
+ }
+\@@_set_tab_tl:n { 4 }
+% \end{macrocode}
+%
+% \medskip
+% The following integer corresponds to the key |gobble|.
+% \begin{macrocode}
+\int_new:N \l_@@_gobble_int
+% \end{macrocode}
+%
+% \medskip
+% \begin{macrocode}
+\tl_new:N \l_@@_space_tl
+\tl_set:Nn \l_@@_space_tl { ~ }
+% \end{macrocode}
+%
+%
+% \medskip
+% At each line, the following counter will count the spaces at the beginning.
+% \begin{macrocode}
+\int_new:N \g_@@_indentation_int
+% \end{macrocode}
+%
+% \medskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_an_indentation_space:
+ { \int_gincr:N \g_@@_indentation_int }
+% \end{macrocode}
+%
+% \medskip
+% The following command |\@@_beamer_command:n| executes the argument
+% corresponding to its argument but also stores it in |\l_@@_beamer_command_str|.
+% That string is used only in the error message ``|cr~not~allowed|'' raised when
+% there is a carriage return in the mandatory argument of that command.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_beamer_command:n #1
+ {
+ \str_set:Nn \l_@@_beamer_command_str { #1 }
+ \use:c { #1 }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% In the environment |{Piton}|, the command |\label| will be linked to the
+% following command.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_label:n #1
+ {
+ \bool_if:NTF \l_@@_line_numbers_bool
+ {
+ \@bsphack
+ \protected@write \@auxout { }
+ {
+ \string \newlabel { #1 }
+ {
+% \end{macrocode}
+% Remember that the content of a line is typeset in a box \emph{before} the
+% composition of the potential number of line.
+% \begin{macrocode}
+ { \int_eval:n { \g_@@_visual_line_int + 1 } }
+ { \thepage }
+ }
+ }
+ \@esphack
+ }
+ { \msg_error:nn { piton } { label~with~lines~numbers } }
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% The following commands are a easy way to insert safely braces (|{| and |}|) in
+% the TeX flow.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_open_brace:
+ { \directlua { piton.open_brace() } }
+\cs_new_protected:Npn \@@_close_brace:
+ { \directlua { piton.close_brace() } }
+% \end{macrocode}
+%
+% \bigskip
+% The following token list will be evaluated at the beginning of
+% |\@@_begin_line:|... |\@@_end_line:| and cleared at the end. It will be used
+% by LPEG acting between the lines of the Python code in order to add
+% instructions to be executed at the beginning of the line.
+% \begin{macrocode}
+\tl_new:N \g_@@_begin_line_hook_tl
+% \end{macrocode}
+%
+% \smallskip
+% For example, the LPEG |Prompt| will trigger the following command which will
+% insert an instruction in the hook |\g_@@_begin_line_hook| to specify that a
+% background must be inserted to the current line of code.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_prompt:
+ {
+ \tl_gset:Nn \g_@@_begin_line_hook_tl
+ { \clist_set:NV \l_@@_bg_color_clist \l_@@_prompt_bg_color_tl }
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% You will keep track of the current style for the treatment of EOL (for the
+% multi-line syntactic elements).
+% \begin{macrocode}
+\clist_new:N \g_@@_current_style_clist
+\clist_set:Nn \g_@@_current_style_clist { __end }
+% \end{macrocode}
+% The element |__end| is an arbitrary syntactic marker.
+%
+% \medskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_close_current_styles:
+ {
+ \int_set:Nn \l_tmpa_int { \clist_count:N \g_@@_current_style_clist - 1 }
+ \exp_args:NV \@@_close_n_styles:n \l_tmpa_int
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_close_n_styles:n #1
+ {
+ \int_compare:nNnT { #1 } > 0
+ {
+ \@@_close_brace:
+ \@@_close_brace:
+ \@@_close_n_styles:n { #1 - 1 }
+ }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_open_current_styles:
+ { \exp_last_unbraced:NV \@@_open_styles:w \g_@@_current_style_clist , }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_open_styles:w #1 ,
+ {
+ \tl_if_eq:nnF { #1 } { __end }
+ { \@@_open_brace: #1 \@@_open_brace: \@@_open_styles:w }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_pop_style:
+ {
+ \clist_greverse:N \g_@@_current_style_clist
+ \clist_gpop:NN \g_@@_current_style_clist \l_tmpa_tl
+ \clist_gpop:NN \g_@@_current_style_clist \l_tmpa_tl
+ \clist_gpush:Nn \g_@@_current_style_clist { __end }
+ \clist_greverse:N \g_@@_current_style_clist
+ }
+% \end{macrocode}
+%
+% \medskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_push_style:n #1
+ {
+ \clist_greverse:N \g_@@_current_style_clist
+ \clist_gpop:NN \g_@@_current_style_clist \l_tmpa_tl
+ \clist_gpush:Nn \g_@@_current_style_clist { #1 }
+ \clist_gpush:Nn \g_@@_current_style_clist { __end }
+ \clist_greverse:N \g_@@_current_style_clist
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_push_and_exec:n #1
+ {
+ \@@_push_style:n { #1 }
+ \@@_open_brace: #1 \@@_open_brace:
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \subsubsection{Treatment of a line of code}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_replace_spaces:n #1
+ {
+ \tl_set:Nn \l_tmpa_tl { #1 }
+ \bool_if:NTF \l_@@_show_spaces_bool
+ { \regex_replace_all:nnN { \x20 } { ␣ } \l_tmpa_tl } % U+2423
+ {
+% \end{macrocode}
+% If the key |break-lines-in-Piton| is in force, we replace all the characters
+% U+0020 (that is to say the spaces) by |\@@_breakable_space:|. Remark that,
+% except the spaces inserted in the LaTeX comments (and maybe in the math
+% comments), all these spaces are of catcode ``other'' (=12) and are
+% unbreakable.
+% \begin{macrocode}
+ \bool_if:NT \l_@@_break_lines_in_Piton_bool
+ {
+ \regex_replace_all:nnN
+ { \x20 }
+ { \c { @@_breakable_space: } }
+ \l_tmpa_tl
+ }
+ }
+ \l_tmpa_tl
+ }
+\cs_generate_variant:Nn \@@_replace_spaces:n { x }
+% \end{macrocode}
+%
+% \bigskip
+% In the contents provided by Lua, each line of the Python code will be
+% surrounded by |\@@_begin_line:| and |\@@_end_line:|. |\@@_begin_line:| is a
+% LaTeX command that we will define now but |\@@_end_line:| is only a syntactic
+% marker that has no definition.
+%
+% \begin{macrocode}
+\cs_set_protected:Npn \@@_begin_line: #1 \@@_end_line:
+ {
+ \group_begin:
+ \g_@@_begin_line_hook_tl
+ \int_gzero:N \g_@@_indentation_int
+% \end{macrocode}
+%
+%
+% Be careful: there is curryfication in the following lines.
+% \begin{macrocode}
+ \bool_if:NTF \l_@@_slim_bool
+ { \hcoffin_set:Nn \l_tmpa_coffin }
+ {
+ \clist_if_empty:NTF \l_@@_bg_color_clist
+ {
+ \vcoffin_set:Nnn \l_tmpa_coffin
+ { \dim_eval:n { \linewidth - \l_@@_left_margin_dim } }
+ }
+ {
+ \vcoffin_set:Nnn \l_tmpa_coffin
+ { \dim_eval:n { \linewidth - \l_@@_left_margin_dim - 0.5 em } }
+ }
+ }
+ {
+ \language = -1
+ \raggedright
+ \strut
+ \@@_replace_spaces:n { #1 }
+ \strut \hfil
+ }
+ \hbox_set:Nn \l_tmpa_box
+ {
+ \skip_horizontal:N \l_@@_left_margin_dim
+ \bool_if:NT \l_@@_line_numbers_bool
+ {
+ \bool_if:NF \l_@@_all_line_numbers_bool
+ { \tl_if_eq:nnF { #1 } { \PitonStyle {Prompt}{} } } % corrected 2023/04/10
+ \@@_print_number:
+ }
+ \clist_if_empty:NF \l_@@_bg_color_clist
+ {
+ \dim_compare:nNnT \l_@@_left_margin_dim = \c_zero_dim
+ {
+ \bool_if:NF \l_@@_left_margin_auto_bool
+ { \skip_horizontal:n { 0.5 em } }
+ }
+ }
+ \coffin_typeset:Nnnnn \l_tmpa_coffin T l \c_zero_dim \c_zero_dim
+ }
+% \end{macrocode}
+% We compute in |\g_@@_width_dim| the maximal width of the lines of the
+% environment.
+% \begin{macrocode}
+ \dim_compare:nNnT { \box_wd:N \l_tmpa_box } > \g_@@_width_dim
+ { \dim_gset:Nn \g_@@_width_dim { \box_wd:N \l_tmpa_box } }
+ \box_set_dp:Nn \l_tmpa_box { \box_dp:N \l_tmpa_box + 1.25 pt }
+ \box_set_ht:Nn \l_tmpa_box { \box_ht:N \l_tmpa_box + 1.25 pt }
+ \clist_if_empty:NTF \l_@@_bg_color_clist
+ { \box_use_drop:N \l_tmpa_box }
+ {
+ \vbox_top:n
+ {
+ \hbox:n
+ {
+ \@@_color:N \l_@@_bg_color_clist
+ \vrule height \box_ht:N \l_tmpa_box
+ depth \box_dp:N \l_tmpa_box
+ width \l_@@_width_on_aux_dim
+ }
+ \skip_vertical:n { - \box_ht_plus_dp:N \l_tmpa_box }
+ \box_set_wd:Nn \l_tmpa_box \l_@@_width_on_aux_dim
+ \box_use_drop:N \l_tmpa_box
+ }
+ }
+ \vspace { - 2.5 pt }
+ \group_end:
+ \tl_gclear:N \g_@@_begin_line_hook_tl
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The command |\@@_color:N| will take in as argument a reference to a
+% comma-separated list of colors. A color will be picked by using the value of
+% |\g_@@_line_int| (modulo the number of colors in the list).
+% \begin{macrocode}
+\cs_set_protected:Npn \@@_color:N #1
+ {
+ \int_set:Nn \l_tmpa_int { \clist_count:N #1 }
+ \int_set:Nn \l_tmpb_int { \int_mod:nn \g_@@_line_int \l_tmpa_int + 1 }
+ \tl_set:Nx \l_tmpa_tl { \clist_item:Nn #1 \l_tmpb_int }
+ \tl_if_eq:NnTF \l_tmpa_tl { none }
+% \end{macrocode}
+% By setting |\l_@@_width_on_aux_dim| to zero, the colored rectangle will be
+% drawn with zero width and, thus, it will be a mere strut (and we need that strut).
+% \begin{macrocode}
+ { \dim_zero:N \l_@@_width_on_aux_dim }
+ { \exp_args:NV \@@_color_i:n \l_tmpa_tl }
+ }
+% \end{macrocode}
+%
+% The following command |\@@_color:n| will accept both the instruction
+% |\@@_color:n { red!15 }| and the instruction |\@@_color:n { [rgb]{0.9,0.9,0} }|.
+% \begin{macrocode}
+\cs_set_protected:Npn \@@_color_i:n #1
+ {
+ \tl_if_head_eq_meaning:nNTF { #1 } [
+ {
+ \tl_set:Nn \l_tmpa_tl { #1 }
+ \tl_set_rescan:Nno \l_tmpa_tl { } \l_tmpa_tl
+ \exp_last_unbraced:NV \color \l_tmpa_tl
+ }
+ { \color { #1 } }
+ }
+\cs_generate_variant:Nn \@@_color:n { V }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_newline:
+ {
+ \int_gincr:N \g_@@_line_int
+ \int_compare:nNnT \g_@@_line_int > { \l_@@_splittable_int - 1 }
+ {
+ \int_compare:nNnT
+ { \l_@@_nb_lines_int - \g_@@_line_int } > \l_@@_splittable_int
+ {
+ \egroup
+ \bool_if:NT \c_@@_footnote_bool { \end { savenotes } }
+ \newline
+ \bool_if:NT \c_@@_footnote_bool { \begin { savenotes } }
+ \vtop \bgroup
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\cs_set_protected:Npn \@@_breakable_space:
+ {
+ \discretionary
+ { \hbox:n { \color { gray } \l_@@_end_of_broken_line_tl } }
+ {
+ \hbox_overlap_left:n
+ {
+ {
+ \normalfont \footnotesize \color { gray }
+ \l_@@_continuation_symbol_tl
+ }
+ \skip_horizontal:n { 0.3 em }
+ \clist_if_empty:NF \l_@@_bg_color_clist
+ { \skip_horizontal:n { 0.5 em } }
+ }
+ \bool_if:NT \l_@@_indent_broken_lines_bool
+ {
+ \hbox:n
+ {
+ \prg_replicate:nn { \g_@@_indentation_int } { ~ }
+ { \color { gray } \l_@@_csoi_tl }
+ }
+ }
+ }
+ { \hbox { ~ } }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \subsubsection{PitonOptions}
+%
+% \medskip
+% The following parameters correspond to the keys |line-numbers| and
+% |all-line-numbers|.
+% \begin{macrocode}
+\bool_new:N \l_@@_line_numbers_bool
+\bool_new:N \l_@@_all_line_numbers_bool
+% \end{macrocode}
+%
+% \medskip
+% The following flag corresponds to the key |resume|.
+% \begin{macrocode}
+\bool_new:N \l_@@_resume_bool
+% \end{macrocode}
+%
+% \bigskip
+% Be careful! The name of the following set of keys must be considered as
+% public! Hence, it should \emph{not} be changed.
+%
+% \begin{macrocode}
+\keys_define:nn { PitonOptions }
+ {
+ language .str_set:N = \l_@@_language_str ,
+ language .value_required:n = true ,
+ gobble .int_set:N = \l_@@_gobble_int ,
+ gobble .value_required:n = true ,
+ auto-gobble .code:n = \int_set:Nn \l_@@_gobble_int { -1 } ,
+ auto-gobble .value_forbidden:n = true ,
+ env-gobble .code:n = \int_set:Nn \l_@@_gobble_int { -2 } ,
+ env-gobble .value_forbidden:n = true ,
+ tabs-auto-gobble .code:n = \int_set:Nn \l_@@_gobble_int { -3 } ,
+ tabs-auto-gobble .value_forbidden:n = true ,
+ line-numbers .bool_set:N = \l_@@_line_numbers_bool ,
+ line-numbers .default:n = true ,
+ all-line-numbers .code:n =
+ \bool_set_true:N \l_@@_line_numbers_bool
+ \bool_set_true:N \l_@@_all_line_numbers_bool ,
+ all-line-numbers .value_forbidden:n = true ,
+ resume .bool_set:N = \l_@@_resume_bool ,
+ resume .value_forbidden:n = true ,
+ splittable .int_set:N = \l_@@_splittable_int ,
+ splittable .default:n = 1 ,
+ background-color .clist_set:N = \l_@@_bg_color_clist ,
+ background-color .value_required:n = true ,
+ prompt-background-color .tl_set:N = \l_@@_prompt_bg_color_tl ,
+ prompt-background-color .value_required:n = true ,
+ slim .bool_set:N = \l_@@_slim_bool ,
+ slim .default:n = true ,
+ left-margin .code:n =
+ \str_if_eq:nnTF { #1 } { auto }
+ {
+ \dim_zero:N \l_@@_left_margin_dim
+ \bool_set_true:N \l_@@_left_margin_auto_bool
+ }
+ { \dim_set:Nn \l_@@_left_margin_dim { #1 } } ,
+ left-margin .value_required:n = true ,
+ numbers-sep .dim_set:N = \l_@@_numbers_sep_dim ,
+ numbers-sep .value_required:n = true ,
+ tab-size .code:n = \@@_set_tab_tl:n { #1 } ,
+ tab-size .value_required:n = true ,
+ show-spaces .bool_set:N = \l_@@_show_spaces_bool ,
+ show-spaces .default:n = true ,
+ show-spaces-in-strings .code:n = \tl_set:Nn \l_@@_space_tl { ␣ } , % U+2423
+ show-spaces-in-strings .value_forbidden:n = true ,
+ break-lines-in-Piton .bool_set:N = \l_@@_break_lines_in_Piton_bool ,
+ break-lines-in-Piton .default:n = true ,
+ break-lines-in-piton .bool_set:N = \l_@@_break_lines_in_piton_bool ,
+ break-lines-in-piton .default:n = true ,
+ break-lines .meta:n = { break-lines-in-piton , break-lines-in-Piton } ,
+ break-lines .value_forbidden:n = true ,
+ indent-broken-lines .bool_set:N = \l_@@_indent_broken_lines_bool ,
+ indent-broken-lines .default:n = true ,
+ end-of-broken-line .tl_set:N = \l_@@_end_of_broken_line_tl ,
+ end-of-broken-line .value_required:n = true ,
+ continuation-symbol .tl_set:N = \l_@@_continuation_symbol_tl ,
+ continuation-symbol .value_required:n = true ,
+ continuation-symbol-on-indentation .tl_set:N = \l_@@_csoi_tl ,
+ continuation-symbol-on-indentation .value_required:n = true ,
+ unknown .code:n =
+ \msg_error:nn { piton } { Unknown~key~for~PitonOptions }
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+%
+% \bigskip
+% The argument of |\PitonOptions| is provided by curryfication.
+% \begin{macrocode}
+\NewDocumentCommand \PitonOptions { } { \keys_set:nn { PitonOptions } }
+% \end{macrocode}
+%
+% \bigskip
+% \subsubsection{The numbers of the lines}
+%
+% \medskip
+% The following counter will be used to count the lines in the code when the
+% user requires the numbers of the lines to be printed (with |line-numbers| or
+% |all-line-numbers|).
+%
+% \begin{macrocode}
+\int_new:N \g_@@_visual_line_int
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_print_number:
+ {
+ \int_gincr:N \g_@@_visual_line_int
+ \hbox_overlap_left:n
+ {
+ { \color { gray } \footnotesize \int_to_arabic:n \g_@@_visual_line_int }
+ \skip_horizontal:N \l_@@_numbers_sep_dim
+ }
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% \subsubsection{The command to write on the aux file}
+%
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_write_aux:
+ {
+ \tl_if_empty:NF \g_@@_aux_tl
+ {
+ \iow_now:Nn \@mainaux { \ExplSyntaxOn }
+ \iow_now:Nx \@mainaux
+ {
+ \tl_gset:cn { c_@@_ \int_use:N \g_@@_env_int _ tl }
+ { \exp_not:V \g_@@_aux_tl }
+ }
+ \iow_now:Nn \@mainaux { \ExplSyntaxOff }
+ }
+ \tl_gclear:N \g_@@_aux_tl
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_width_to_aux:
+ {
+ \bool_if:NT \l_@@_slim_bool
+ {
+ \clist_if_empty:NF \l_@@_bg_color_clist
+ {
+ \tl_gput_right:Nx \g_@@_aux_tl
+ {
+ \dim_set:Nn \l_@@_width_on_aux_dim
+ { \dim_eval:n { \g_@@_width_dim + 0.5 em } }
+ }
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \subsubsection{The main commands and environments for the final user}
+%
+% \bigskip
+% \begin{macrocode}
+\NewDocumentCommand { \piton } { }
+ { \peek_meaning:NTF \bgroup \@@_piton_standard \@@_piton_verbatim }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\NewDocumentCommand { \@@_piton_standard } { m }
+ {
+ \group_begin:
+ \ttfamily
+% \end{macrocode}
+% The following tuning of LuaTeX in order to avoid all break of lines on the
+% hyphens.
+% \begin{macrocode}
+ \automatichyphenmode = 1
+ \cs_set_eq:NN \\ \c_backslash_str
+ \cs_set_eq:NN \% \c_percent_str
+ \cs_set_eq:NN \{ \c_left_brace_str
+ \cs_set_eq:NN \} \c_right_brace_str
+ \cs_set_eq:NN \$ \c_dollar_str
+ \cs_set_eq:cN { ~ } \space
+ \cs_set_protected:Npn \@@_begin_line: { }
+ \cs_set_protected:Npn \@@_end_line: { }
+ \tl_set:Nx \l_tmpa_tl
+ {
+ \lua_now:e
+ { piton.ParseBis('\l_@@_language_str',token.scan_string()) }
+ { #1 }
+ }
+ \bool_if:NTF \l_@@_show_spaces_bool
+ { \regex_replace_all:nnN { \x20 } { ␣ } \l_tmpa_tl } % U+2423
+% \end{macrocode}
+% The following code replaces the characters U+0020 (spaces) by characters
+% U+0020 of catcode~10: thus, they become breakable by an end of line.
+% \begin{macrocode}
+ {
+ \bool_if:NT \l_@@_break_lines_in_piton_bool
+ { \regex_replace_all:nnN { \x20 } { \x20 } \l_tmpa_tl }
+ }
+ \l_tmpa_tl
+ \group_end:
+ }
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\NewDocumentCommand { \@@_piton_verbatim } { v }
+ {
+ \group_begin:
+ \ttfamily
+ \automatichyphenmode = 1
+ \cs_set_protected:Npn \@@_begin_line: { }
+ \cs_set_protected:Npn \@@_end_line: { }
+ \tl_set:Nx \l_tmpa_tl
+ {
+ \lua_now:e
+ { piton.Parse('\l_@@_language_str',token.scan_string()) }
+ { #1 }
+ }
+ \bool_if:NT \l_@@_show_spaces_bool
+ { \regex_replace_all:nnN { \x20 } { ␣ } \l_tmpa_tl } % U+2423
+ \l_tmpa_tl
+ \group_end:
+ }
+% \end{macrocode}
+%
+
+% \bigskip
+%
+%
+% \bigskip
+% The following command is not a user command. It will be used when we will
+% have to ``rescan'' some chunks of Python code. For example, it will be the
+% initial value of the Piton style |InitialValues| (the default values of the
+% arguments of a Python function).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_piton:n #1
+ {
+ \group_begin:
+ \cs_set_protected:Npn \@@_begin_line: { }
+ \cs_set_protected:Npn \@@_end_line: { }
+ \bool_lazy_or:nnTF
+ \l_@@_break_lines_in_piton_bool
+ \l_@@_break_lines_in_Piton_bool
+ {
+ \tl_set:Nx \l_tmpa_tl
+ {
+ \lua_now:e
+ { piton.ParseTer('\l_@@_language_str',token.scan_string()) }
+ { #1 }
+ }
+ }
+ {
+ \tl_set:Nx \l_tmpa_tl
+ {
+ \lua_now:e
+ { piton.Parse('\l_@@_language_str',token.scan_string()) }
+ { #1 }
+ }
+ }
+ \bool_if:NT \l_@@_show_spaces_bool
+ { \regex_replace_all:nnN { \x20 } { ␣ } \l_tmpa_tl } % U+2423
+ \l_tmpa_tl
+ \group_end:
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The following command is similar to the previous one but raise a fatal error if
+% its argument contains a carriage return.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_piton_no_cr:n #1
+ {
+ \group_begin:
+ \cs_set_protected:Npn \@@_begin_line: { }
+ \cs_set_protected:Npn \@@_end_line: { }
+ \cs_set_protected:Npn \@@_newline:
+ { \msg_fatal:nn { piton } { cr~not~allowed } }
+ \bool_lazy_or:nnTF
+ \l_@@_break_lines_in_piton_bool
+ \l_@@_break_lines_in_Piton_bool
+ {
+ \tl_set:Nx \l_tmpa_tl
+ {
+ \lua_now:e
+ { piton.ParseTer('\l_@@_language_str',token.scan_string()) }
+ { #1 }
+ }
+ }
+ {
+ \tl_set:Nx \l_tmpa_tl
+ {
+ \lua_now:e
+ { piton.Parse('\l_@@_language_str',token.scan_string()) }
+ { #1 }
+ }
+ }
+ \bool_if:NT \l_@@_show_spaces_bool
+ { \regex_replace_all:nnN { \x20 } { ␣ } \l_tmpa_tl } % U+2423
+ \l_tmpa_tl
+ \group_end:
+ }
+% \end{macrocode}
+%
+% \bigskip
+% Despite its name, |\@@_pre_env:| will be used both in |\PitonInputFile| and
+% in the environments such as |{Piton}|.
+% \begin{macrocode}
+\cs_new:Npn \@@_pre_env:
+ {
+ \automatichyphenmode = 1
+ \int_gincr:N \g_@@_env_int
+ \tl_gclear:N \g_@@_aux_tl
+ \cs_if_exist_use:c { c_@@ _ \int_use:N \g_@@_env_int _ tl }
+ \dim_compare:nNnT \l_@@_width_on_aux_dim = \c_zero_dim
+ { \dim_set_eq:NN \l_@@_width_on_aux_dim \linewidth }
+ \bool_if:NF \l_@@_resume_bool { \int_gzero:N \g_@@_visual_line_int }
+ \dim_gzero:N \g_@@_width_dim
+ \int_gzero:N \g_@@_line_int
+ \dim_zero:N \parindent
+ \dim_zero:N \lineskip
+ \dim_zero:N \parindent
+ \cs_set_eq:NN \label \@@_label:n
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\keys_define:nn { PitonInputFile }
+ {
+ first-line .int_set:N = \l_@@_first_line_int ,
+ first-line .value_required:n = true ,
+ last-line .int_set:N = \l_@@_last_line_int ,
+ last-line .value_required:n = true ,
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\NewDocumentCommand { \PitonInputFile } { d < > O { } m }
+ {
+ \tl_if_novalue:nF { #1 }
+ {
+ \bool_if:NTF \c_@@_beamer_bool
+ { \begin { uncoverenv } < #1 > }
+ { \msg_error:nn { piton } { overlay~without~beamer } }
+ }
+ \group_begin:
+ \int_zero_new:N \l_@@_first_line_int
+ \int_zero_new:N \l_@@_last_line_int
+ \int_set_eq:NN \l_@@_last_line_int \c_max_int
+ \keys_set:nn { PitonInputFile } { #2 }
+ \@@_pre_env:
+ \mode_if_vertical:TF \mode_leave_vertical: \newline
+% \end{macrocode}
+% We count with Lua the number of lines of the argument. The result will be
+% stored by Lua in |\l_@@_nb_lines_int|. That information will be used to allow
+% or disallow page breaks.
+% \begin{macrocode}
+ \lua_now:n { piton.CountLinesFile(token.scan_argument()) } { #3 }
+% \end{macrocode}
+% If the final user has used both |left-margin=auto| and |line-numbers| or
+% |all-line-numbers|, we have to compute the width of the maximal number of
+% lines at the end of the composition of the listing to fix the correct value to
+% |left-margin|.
+% \begin{macrocode}
+ \bool_lazy_and:nnT \l_@@_left_margin_auto_bool \l_@@_line_numbers_bool
+ {
+ \hbox_set:Nn \l_tmpa_box
+ {
+ \footnotesize
+ \bool_if:NTF \l_@@_all_line_numbers_bool
+ {
+ \int_to_arabic:n
+ { \g_@@_visual_line_int + \l_@@_nb_lines_int }
+ }
+ {
+ \lua_now:n
+ { piton.CountNonEmptyLinesFile(token.scan_argument()) }
+ { #3 }
+ \int_to_arabic:n
+ { \g_@@_visual_line_int + \l_@@_nb_non_empty_lines_int }
+ }
+ }
+ \dim_set:Nn \l_@@_left_margin_dim
+ { \box_wd:N \l_tmpa_box + \l_@@_numbers_sep_dim + 0.1 em }
+ }
+% \end{macrocode}
+% Now, the main job.
+% \begin{macrocode}
+ \ttfamily
+ \bool_if:NT \c_@@_footnote_bool { \begin { savenotes } }
+ \vtop \bgroup
+ \lua_now:e
+ {
+ piton.ParseFile('\l_@@_language_str',token.scan_argument() ,
+ \int_use:N \l_@@_first_line_int ,
+ \int_use:N \l_@@_last_line_int )
+ }
+ { #3 }
+ \egroup
+ \bool_if:NT \c_@@_footnote_bool { \end { savenotes } }
+ \@@_width_to_aux:
+ \group_end:
+ \tl_if_novalue:nF { #1 }
+ { \bool_if:NT \c_@@_beamer_bool { \end { uncoverenv } } }
+ \@@_write_aux:
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% \begin{macrocode}
+\NewDocumentCommand { \NewPitonEnvironment } { m m m m }
+ {
+% \end{macrocode}
+% We construct a TeX macro which will catch as argument all the tokens until
+% |\end{|\texttt{\textsl{name_env}}|}| with, in that
+% |\end{|\texttt{\textsl{name_env}}|}|, the catcodes of |\|, |{| and |}| equal to
+% 12 (``\texttt{other}''). The latter explains why the definition of that
+% function is a bit complicated.
+% \begin{macrocode}
+ \use:x
+ {
+ \cs_set_protected:Npn
+ \use:c { _@@_collect_ #1 :w }
+ ####1
+ \c_backslash_str end \c_left_brace_str #1 \c_right_brace_str
+ }
+ {
+ \group_end:
+ \mode_if_vertical:TF \mode_leave_vertical: \newline
+% \end{macrocode}
+% We count with Lua the number of lines of the argument. The result will be
+% stored by Lua in |\l_@@_nb_lines_int|. That information will be used to allow
+% or disallow page breaks.
+% \begin{macrocode}
+ \lua_now:n { piton.CountLines(token.scan_argument()) } { ##1 }
+% \end{macrocode}
+% If the final user has used both |left-margin=auto| and |line-numbers|, we have
+% to compute the width of the maximal number of lines at the end of the
+% environment to fix the correct value to |left-margin|.
+% \begin{macrocode}
+ \bool_lazy_and:nnT \l_@@_left_margin_auto_bool \l_@@_line_numbers_bool
+ {
+ \bool_if:NTF \l_@@_all_line_numbers_bool
+ {
+ \hbox_set:Nn \l_tmpa_box
+ {
+ \footnotesize
+ \int_to_arabic:n
+ { \g_@@_visual_line_int + \l_@@_nb_lines_int }
+ }
+ }
+ {
+ \lua_now:n
+ { piton.CountNonEmptyLines(token.scan_argument()) }
+ { ##1 }
+ \hbox_set:Nn \l_tmpa_box
+ {
+ \footnotesize
+ \int_to_arabic:n
+ { \g_@@_visual_line_int + \l_@@_nb_non_empty_lines_int }
+ }
+ }
+ \dim_set:Nn \l_@@_left_margin_dim
+ { \box_wd:N \l_tmpa_box + \l_@@_numbers_sep_dim + 0.1 em }
+ }
+% \end{macrocode}
+% Now, the main job.
+% \begin{macrocode}
+ \ttfamily
+ \bool_if:NT \c_@@_footnote_bool { \begin { savenotes } }
+ \vtop \bgroup
+ \lua_now:e
+ {
+ piton.GobbleParse
+ (
+ '\l_@@_language_str' ,
+ \int_use:N \l_@@_gobble_int ,
+ token.scan_argument()
+ )
+ }
+ { ##1 }
+ \vspace { 2.5 pt }
+ \egroup
+ \bool_if:NT \c_@@_footnote_bool { \end { savenotes } }
+ \@@_width_to_aux:
+% \end{macrocode}
+% The following |\end{#1}| is only for the groups and the stack of environments
+% of LaTeX.
+% \begin{macrocode}
+ \end { #1 }
+ \@@_write_aux:
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% We can now define the new environment.
+%
+% We are still in the definition of the command |\NewPitonEnvironment|...
+% \begin{macrocode}
+ \NewDocumentEnvironment { #1 } { #2 }
+ {
+ #3
+ \@@_pre_env:
+ \group_begin:
+ \tl_map_function:nN
+ { \ \\ \{ \} \$ \& \# \^ \_ \% \~ \^^I }
+ \char_set_catcode_other:N
+ \use:c { _@@_collect_ #1 :w }
+ }
+ { #4 }
+% \end{macrocode}
+%
+% \medskip
+% The following code is for technical reasons. We want to change the catcode of
+% |^^M| before catching the arguments of the new environment we are defining.
+% Indeed, if not, we will have problems if there is a final optional argument in
+% our environment (if that final argument is not used by the user in an
+% instance of the environment, a spurious space is inserted, probably because
+% the |^^M| is converted to space).
+% \begin{macrocode}
+ \AddToHook { env / #1 / begin } { \char_set_catcode_other:N \^^M }
+ }
+% \end{macrocode}
+% This is the end of the definition of the command |\NewPitonEnvironment|.
+%
+% \bigskip
+% Now, we define the environment |{Piton}|, which is the main environment
+% provided by the package \pkg{piton}. Of course, you use
+% |\NewPitonEnvironment|.
+% \begin{macrocode}
+\bool_if:NTF \c_@@_beamer_bool
+ {
+ \NewPitonEnvironment { Piton } { d < > }
+ {
+ \IfValueTF { #1 }
+ { \begin { uncoverenv } < #1 > }
+ { \begin { uncoverenv } }
+ }
+ { \end { uncoverenv } }
+ }
+ { \NewPitonEnvironment { Piton } { } { } { } }
+% \end{macrocode}
+%
+%
+%
+% \bigskip
+% \subsubsection{The styles}
+%
+% \medskip
+% The following command is fundamental: it will be used by the Lua code.
+% \begin{macrocode}
+\NewDocumentCommand { \PitonStyle } { m } { \use:c { pitonStyle #1 } }
+% \end{macrocode}
+%
+% \medskip
+% The following command takes in its argument by curryfication.
+% \begin{macrocode}
+\NewDocumentCommand { \SetPitonStyle } { } { \keys_set:nn { piton / Styles } }
+% \end{macrocode}
+%
+% \medskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_math_scantokens:n #1
+ { \normalfont \scantextokens { $#1$ } }
+% \end{macrocode}
+%
+% \medskip
+% \begin{macrocode}
+\keys_define:nn { piton / Styles }
+ {
+ String.Interpol .tl_set:c = pitonStyle String.Interpol ,
+ String.Interpol .value_required:n = true ,
+ FormattingType .tl_set:c = pitonStyle FormattingType ,
+ FormattingType .value_required:n = true ,
+ Dict.Value .tl_set:c = pitonStyle Dict.Value ,
+ Dict.Value .value_required:n = true ,
+ Name.Decorator .tl_set:c = pitonStyle Name.Decorator ,
+ Name.Decorator .value_required:n = true ,
+ Name.Function .tl_set:c = pitonStyle Name.Function ,
+ Name.Function .value_required:n = true ,
+ Name.UserFunction .tl_set:c = pitonStyle Name.UserFunction ,
+ Name.UserFunction .value_required:n = true ,
+ Keyword .tl_set:c = pitonStyle Keyword ,
+ Keyword .value_required:n = true ,
+ Keyword.Constant .tl_set:c = pitonStyle Keyword.Constant ,
+ Keyword.constant .value_required:n = true ,
+ String.Doc .tl_set:c = pitonStyle String.Doc ,
+ String.Doc .value_required:n = true ,
+ Interpol.Inside .tl_set:c = pitonStyle Interpol.Inside ,
+ Interpol.Inside .value_required:n = true ,
+ String.Long .tl_set:c = pitonStyle String.Long ,
+ String.Long .value_required:n = true ,
+ String.Short .tl_set:c = pitonStyle String.Short ,
+ String.Short .value_required:n = true ,
+ String .meta:n = { String.Long = #1 , String.Short = #1 } ,
+ Comment.Math .tl_set:c = pitonStyle Comment.Math ,
+ Comment.Math .default:n = \@@_math_scantokens:n ,
+ Comment.Math .initial:n = ,
+ Comment .tl_set:c = pitonStyle Comment ,
+ Comment .value_required:n = true ,
+ InitialValues .tl_set:c = pitonStyle InitialValues ,
+ InitialValues .value_required:n = true ,
+ Number .tl_set:c = pitonStyle Number ,
+ Number .value_required:n = true ,
+ Name.Namespace .tl_set:c = pitonStyle Name.Namespace ,
+ Name.Namespace .value_required:n = true ,
+ Name.Class .tl_set:c = pitonStyle Name.Class ,
+ Name.Class .value_required:n = true ,
+ Name.Builtin .tl_set:c = pitonStyle Name.Builtin ,
+ Name.Builtin .value_required:n = true ,
+ TypeParameter .tl_set:c = pitonStyle TypeParameter ,
+ TypeParameter .value_required:n = true ,
+ Name.Type .tl_set:c = pitonStyle Name.Type ,
+ Name.Type .value_required:n = true ,
+ Operator .tl_set:c = pitonStyle Operator ,
+ Operator .value_required:n = true ,
+ Operator.Word .tl_set:c = pitonStyle Operator.Word ,
+ Operator.Word .value_required:n = true ,
+ Exception .tl_set:c = pitonStyle Exception ,
+ Exception .value_required:n = true ,
+ Comment.LaTeX .tl_set:c = pitonStyle Comment.LaTeX ,
+ Comment.LaTeX .value_required:n = true ,
+ Identifier .tl_set:c = pitonStyle Identifier ,
+ Comment.LaTeX .value_required:n = true ,
+ ParseAgain.noCR .tl_set:c = pitonStyle ParseAgain.noCR ,
+ ParseAgain.noCR .value_required:n = true ,
+ ParseAgain .tl_set:c = pitonStyle ParseAgain ,
+ ParseAgain .value_required:n = true ,
+ Prompt .tl_set:c = pitonStyle Prompt ,
+ Prompt .value_required:n = true ,
+ unknown .code:n =
+ \msg_error:nn { piton } { Unknown~key~for~SetPitonStyle }
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% \begin{macrocode}
+\msg_new:nnn { piton } { Unknown~key~for~SetPitonStyle }
+ {
+ The~style~'\l_keys_key_str'~is~unknown.\\
+ This~key~will~be~ignored.\\
+ The~available~styles~are~(in~alphabetic~order):~
+ Comment,~
+ Comment.LaTeX,~
+ Dict.Value,~
+ Exception,~
+ Identifier,~
+ InitialValues,~
+ Keyword,~
+ Keyword.Constant,~
+ Name.Builtin,~
+ Name.Class,~
+ Name.Decorator,~
+ Name.Function,~
+ Name.Namespace,~
+ Number,~
+ Operator,~
+ Operator.Word,~
+ Prompt,~
+ String,~
+ String.Doc,~
+ String.Long,~
+ String.Short,~and~
+ String.Interpol.
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \subsubsection{The initial style}
+%
+% The initial style is inspired by the style ``manni'' of Pygments.
+%
+% \medskip
+% \begin{macrocode}
+\SetPitonStyle
+ {
+ Comment = \color[HTML]{0099FF} \itshape ,
+ Exception = \color[HTML]{CC0000} ,
+ Keyword = \color[HTML]{006699} \bfseries ,
+ Keyword.Constant = \color[HTML]{006699} \bfseries ,
+ Name.Builtin = \color[HTML]{336666} ,
+ Name.Decorator = \color[HTML]{9999FF},
+ Name.Class = \color[HTML]{00AA88} \bfseries ,
+ Name.Function = \color[HTML]{CC00FF} ,
+ Name.Namespace = \color[HTML]{00CCFF} ,
+ Number = \color[HTML]{FF6600} ,
+ Operator = \color[HTML]{555555} ,
+ Operator.Word = \bfseries ,
+ String = \color[HTML]{CC3300} ,
+ String.Doc = \color[HTML]{CC3300} \itshape ,
+ String.Interpol = \color[HTML]{AA0000} ,
+ Comment.LaTeX = \normalfont \color[rgb]{.468,.532,.6} ,
+ Name.Type = \color[HTML]{336666} ,
+ InitialValues = \@@_piton:n ,
+ Dict.Value = \@@_piton:n ,
+ Interpol.Inside = \color{black}\@@_piton:n ,
+ TypeParameter = \color[HTML]{008800} \itshape ,
+ Identifier = \@@_identifier:n ,
+ Name.UserFunction = ,
+ Prompt = ,
+ ParseAgain.noCR = \@@_piton_no_cr:n ,
+ ParseAgain = \@@_piton:n ,
+ }
+% \end{macrocode}
+% The last styles |ParseAgain.noCR| and |ParseAgain| should be considered as
+% ``internal style'' (not available for the final user). However, maybe we will
+% change that and document these styles for the final user (why not?).
+%
+% \medskip
+% If the key |math-comments| has been used at load-time, we change the style
+% |Comment.Math| which should be considered only at an ``internal style''.
+% However, maybe we will document in a future version the possibility to write
+% change the style \emph{locally} in a document)].
+% \begin{macrocode}
+\bool_if:NT \c_@@_math_comments_bool { \SetPitonStyle { Comment.Math } }
+% \end{macrocode}
+%
+% \bigskip
+%
+% \bigskip
+% \subsubsection{Highlighting some identifiers}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_identifier:n #1
+ { \cs_if_exist_use:c { PitonIdentifier _ \l_@@_language_str _ #1 } { #1 } }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\keys_define:nn { PitonOptions }
+ { identifiers .code:n = \@@_set_identifiers:n { #1 } }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\keys_define:nn { Piton / identifiers }
+ {
+ names .clist_set:N = \l_@@_identifiers_names_tl ,
+ style .tl_set:N = \l_@@_style_tl ,
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_set_identifiers:n #1
+ {
+ \clist_clear_new:N \l_@@_identifiers_names_tl
+ \tl_clear_new:N \l_@@_style_tl
+ \keys_set:nn { Piton / identifiers } { #1 }
+ \clist_map_inline:Nn \l_@@_identifiers_names_tl
+ {
+ \tl_set_eq:cN
+ { PitonIdentifier _ \l_@@_language_str _ ##1 }
+ \l_@@_style_tl
+ }
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% In particular, we have an hightlighting of the indentifiers which are the
+% names of Python functions previously defined by the user. Indeed, when a
+% Python function is defined, the style |Name.Function.Internal| is applied to
+% that name. We define now that style (you define it directly and you short-cut
+% the function |\SetPitonStyle|).
+% \begin{macrocode}
+\cs_new_protected:cpn { pitonStyle Name.Function.Internal } #1
+ {
+% \end{macrocode}
+% First, the element is composed in the TeX flow with the style |Name.Function|
+% which is provided to the final user.
+% \begin{macrocode}
+ { \PitonStyle { Name.Function } { #1 } }
+% \end{macrocode}
+% Now, we specify that the name of the new Python function is a known identifier
+% that will be formated with the Piton style |Name.UserFunction|. Of course,
+% here the affectation is global because we have to exit many groups and even
+% the environments |{Piton}|).
+% \begin{macrocode}
+ \cs_gset_protected:cpn { PitonIdentifier _ \l_@@_language_str _ #1 }
+ { \PitonStyle{ Name.UserFunction } }
+% \end{macrocode}
+% Now, we put the name of that new user function in the dedicated sequence
+% (specific of the current language). That sequence will be used only by
+% |\PitonClearUserFunctions|.
+% \begin{macrocode}
+ \seq_if_exist:cF { g_@@_functions _ \l_@@_language_str _ seq }
+ { \seq_new:c { g_@@_functions _ \l_@@_language_str _ seq } }
+ \seq_gput_right:cn { g_@@_functions _ \l_@@_language_str _ seq } { #1 }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\NewDocumentCommand \PitonClearUserFunctions { ! O { \l_@@_language_str } }
+ {
+ \seq_if_exist:cT { g_@@_functions _ #1 _ seq }
+ {
+ \seq_map_inline:cn { g_@@_functions _ #1 _ seq }
+ { \cs_undefine:c { PitonIdentifier _ #1 _ ##1} }
+ \seq_gclear:c { g_@@_functions _ #1 _ seq }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \subsubsection{Security}
+%
+% \begin{macrocode}
+\AddToHook { env / piton / begin }
+ { \msg_fatal:nn { piton } { No~environment~piton } }
+
+\msg_new:nnn { piton } { No~environment~piton }
+ {
+ There~is~no~environment~piton!\\
+ There~is~an~environment~{Piton}~and~a~command~
+ \token_to_str:N \piton\ but~there~is~no~environment~
+ {piton}.~This~error~is~fatal.
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \subsubsection{The error messages of the package}
+%
+% \begin{macrocode}
+\msg_new:nnnn { piton } { Unknown~key~for~PitonOptions }
+ {
+ Unknown~key. \\
+ The~key~'\l_keys_key_str'~is~unknown~for~\token_to_str:N \PitonOptions.~
+ It~will~be~ignored.\\
+ For~a~list~of~the~available~keys,~type~H~<return>.
+ }
+ {
+ The~available~keys~are~(in~alphabetic~order):~
+ all-line-numbers,~
+ auto-gobble,~
+ background-color,~
+ break-lines,~
+ break-lines-in-piton,~
+ break-lines-in-Piton,~
+ continuation-symbol,~
+ continuation-symbol-on-indentation,~
+ end-of-broken-line,~
+ env-gobble,~
+ gobble,~
+ identifiers,~
+ indent-broken-lines,~
+ language,~
+ left-margin,~
+ line-numbers,~
+ prompt-background-color,~
+ resume,~
+ show-spaces,~
+ show-spaces-in-strings,~
+ slim,~
+ splittable,~
+ tabs-auto-gobble~
+ and~tab-size.
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\msg_new:nnn { piton } { label~with~lines~numbers }
+ {
+ You~can't~use~the~command~\token_to_str:N \label\
+ because~the~key~'line-numbers'~(or~'all-line-numbers')~
+ is~not~active.\\
+ If~you~go~on,~that~command~will~ignored.
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\msg_new:nnn { piton } { cr~not~allowed }
+ {
+ You~can't~put~any~carriage~return~in~the~argument~
+ of~a~command~\c_backslash_str
+ \l_@@_beamer_command_str\ within~an~
+ environment~of~'piton'.~You~should~consider~using~the~
+ corresponding~environment.\\
+ That~error~is~fatal.
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\msg_new:nnn { piton } { overlay~without~beamer }
+ {
+ You~can't~use~an~argument~<...>~for~your~command~
+ \token_to_str:N \PitonInputFile\ because~you~are~not~
+ in~Beamer.\\
+ If~you~go~on,~that~argument~will~be~ignored.
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\msg_new:nnn { Piton } { Python~error }
+ { A~Python~error~has~been~detected. }
+% \end{macrocode}
+%
+% \bigskip
+% \subsection{The Lua part of the implementation}
+%
+% \bigskip
+% \begin{macrocode}
+\ExplSyntaxOff
+\RequirePackage{luacode}
+% \end{macrocode}
+%
+%
+% \bigskip
+% The Lua code will be loaded via a |{luacode*}| environment. The environment
+% is by itself a Lua block and the local declarations will be local to that
+% block. All the global functions (used by the L3 parts of the implementation)
+% will be put in a Lua table |piton|.
+%
+% \medskip
+% \begin{macrocode}
+\begin{luacode*}
+piton = piton or { }
+% \end{macrocode}
+%
+% \begin{macrocode}
+if piton.comment_latex == nil then piton.comment_latex = ">" end
+piton.comment_latex = "#" .. piton.comment_latex
+% \end{macrocode}
+%
+%
+% \bigskip
+% The following functions are an easy way to safely insert braces (|{| and |}|)
+% in the TeX flow.
+% \begin{macrocode}
+function piton.open_brace ()
+ tex.sprint("{")
+end
+function piton.close_brace ()
+ tex.sprint("}")
+end
+% \end{macrocode}
+%
+% \bigskip
+% \subsubsection{Special functions dealing with LPEG}
+%
+% \medskip
+% We will use the Lua library \pkg{lpeg} which is built in LuaTeX. That's why we
+% define first aliases for several functions of that library.
+% \begin{macrocode}
+local P, S, V, C, Ct, Cc = lpeg.P, lpeg.S, lpeg.V, lpeg.C, lpeg.Ct, lpeg.Cc
+local Cf, Cs , Cg , Cmt , Cb = lpeg.Cf, lpeg.Cs, lpeg.Cg , lpeg.Cmt , lpeg.Cb
+local R = lpeg.R
+% \end{macrocode}
+%
+%
+%
+% \bigskip
+% The function |Q| takes in as argument a pattern and returns a \textsc{lpeg}
+% \emph{which does a capture} of the pattern. That capture will be sent to LaTeX
+% with the catcode ``other'' for all the characters: it's suitable for elements
+% of the Python listings that \pkg{piton} will typeset verbatim (thanks to the
+% catcode ``other'').
+% \begin{macrocode}
+local function Q(pattern)
+ return Ct ( Cc ( luatexbase.catcodetables.CatcodeTableOther ) * C ( pattern ) )
+end
+% \end{macrocode}
+%
+%
+% \bigskip
+% The function |L| takes in as argument a pattern and returns a \textsc{lpeg}
+% \emph{which does a capture} of the pattern. That capture will be sent to LaTeX
+% with standard LaTeX catcodes for all the characters: the elements captured
+% will be formatted as normal LaTeX codes. It's suitable for the ``LaTeX
+% comments'' in the environments |{Piton}| and the elements beetween
+% ``|escape-inside|''. That function won't be much used.
+% \begin{macrocode}
+local function L(pattern)
+ return Ct ( C ( pattern ) )
+end
+% \end{macrocode}
+%
+% \bigskip
+% The function |Lc| (the c is for \emph{constant}) takes in as argument a string
+% and returns a \textsc{lpeg} \emph{with does a constant capture} which returns
+% that string. The elements captured will be formatted as L3 code. It will be
+% used to send to LaTeX all the formatting LaTeX instructions we have to insert
+% in order to do the syntactic highlighting (that's the main job of
+% \pkg{piton}). That function will be widely used.
+% \begin{macrocode}
+local function Lc(string)
+ return Cc ( { luatexbase.catcodetables.expl , string } )
+end
+% \end{macrocode}
+%
+% \bigskip
+% The function |K| creates a \textsc{lpeg} which will return as capture the
+% whole LaTeX code corresponding to a Python chunk (that is to say with the
+% LaTeX formatting instructions corresponding to the syntactic nature of that
+% Python chunk). The first argument is a Lua string corresponding to the name of
+% a \pkg{piton} style and the second element is a pattern (that is to say a
+% \textsc{lpeg} without capture)
+% \begin{macrocode}
+local function K(style, pattern)
+ return
+ Lc ( "{\\PitonStyle{" .. style .. "}{" )
+ * Q ( pattern )
+ * Lc ( "}}" )
+end
+% \end{macrocode}
+% The formatting commands in a given \pkg{piton} style (eg. the style |Keyword|)
+% may be semi-global declarations (such as |\bfseries| or |\slshape|) or LaTeX
+% macros with an argument (such as |\fbox| or |\colorbox{yellow}|). In order to
+% deal with both syntaxes, we have used two pairs of braces:
+% |{\PitonStyle{Keyword}{|\texttt{\slshape text to format}|}}|.
+%
+%
+% \bigskip
+% \begin{macrocode}
+local function WithStyle(style,pattern)
+ return
+ Ct ( Cc "Open" * Cc ( "{\\PitonStyle{" .. style .. "}{" ) * Cc "}}" )
+ * pattern
+ * Ct ( Cc "Close" )
+end
+% \end{macrocode}
+%
+% \bigskip
+% The following \textsc{lpeg} catches the Python chunks which are in LaTeX
+% escapes (and that chunks will be considered as normal LaTeX constructions). We
+% recall that |piton.begin_espace| and |piton_end_escape| are Lua strings
+% corresponding to the key |escape-inside|\footnote{The \pkg{piton} key
+% |escape-inside| is available at load-time only.}. Since the elements that will
+% be catched must be sent to LaTeX with standard LaTeX catcodes, we put the
+% capture (done by the function |C|) in a table (by using |Ct|, which is an
+% alias for |lpeg.Ct|) without number of catcode table at the first component of
+% the table.
+% \begin{macrocode}
+local Escape =
+ P(piton_begin_escape)
+ * L ( ( 1 - P(piton_end_escape) ) ^ 1 )
+ * P(piton_end_escape)
+% \end{macrocode}
+%
+% \vspace{1cm}
+% The following line is mandatory.
+% \begin{macrocode}
+lpeg.locale(lpeg)
+% \end{macrocode}
+%
+% \bigskip
+% \paragraph{The basic syntactic LPEG}
+%
+% \begin{macrocode}
+local alpha, digit = lpeg.alpha, lpeg.digit
+local space = P " "
+% \end{macrocode}
+%
+% Remember that, for \textsc{lpeg}, the Unicode characters such as |à|, |â|,
+% |ç|, etc. are in fact strings of length 2 (2 bytes) because \pkg{lpeg} is not
+% Unicode-aware.
+% \begin{macrocode}
+local letter = alpha + P "_"
+ + P "â" + P "à" + P "ç" + P "é" + P "è" + P "ê" + P "ë" + P "ï" + P "î"
+ + P "ô" + P "û" + P "ü" + P "Â" + P "À" + P "Ç" + P "É" + P "È" + P "Ê"
+ + P "Ë" + P "Ï" + P "Î" + P "Ô" + P "Û" + P "Ü"
+
+local alphanum = letter + digit
+% \end{macrocode}
+%
+% \bigskip
+% The following \textsc{lpeg} |identifier| is a mere pattern (that is to say
+% more or less a regular expression) which matches the Python identifiers (hence
+% the name).
+% \begin{macrocode}
+local identifier = letter * alphanum ^ 0
+% \end{macrocode}
+%
+% \medskip
+% On the other hand, the \textsc{lpeg} |Identifier| (with a capital) also returns
+% a \emph{capture}.
+% \begin{macrocode}
+local Identifier = K ( 'Identifier' , identifier)
+% \end{macrocode}
+%
+% \bigskip
+% By convention, we will use names with an initial capital for \textsc{lpeg}
+% which return captures.
+%
+%
+% \bigskip
+% Here is the first use of our function~|K|. That function will be used to
+% construct \textsc{lpeg} which capture Python chunks for which we have a
+% dedicated \pkg{piton} style. For example, for the numbers, \pkg{piton}
+% provides a style which is called |Number|. The name of the style is provided
+% as a Lua string in the second argument of the function~|K|. By convention, we
+% use single quotes for delimiting the Lua strings which are names of
+% \pkg{piton} styles (but this is only a convention).
+% \begin{macrocode}
+local Number =
+ K ( 'Number' ,
+ ( digit^1 * P "." * digit^0 + digit^0 * P "." * digit^1 + digit^1 )
+ * ( S "eE" * S "+-" ^ -1 * digit^1 ) ^ -1
+ + digit^1
+ )
+% \end{macrocode}
+%
+% \bigskip
+% We recall that |piton.begin_espace| and |piton_end_escape| are Lua strings
+% corresponding to the key |escape-inside|\footnote{The \pkg{piton} key
+% |escape-inside| is available at load-time only.}. Of course, if the final user
+% has not used the key |escape-inside|, these strings are empty.
+% \begin{macrocode}
+local Word
+if piton_begin_escape ~= ''
+then Word = Q ( ( ( 1 - space - P(piton_begin_escape) - P(piton_end_escape) )
+ - S "'\"\r[()]" - digit ) ^ 1 )
+else Word = Q ( ( ( 1 - space ) - S "'\"\r[()]" - digit ) ^ 1 )
+end
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+local Space = ( Q " " ) ^ 1
+
+local SkipSpace = ( Q " " ) ^ 0
+
+local Punct = Q ( S ".,:;!" )
+
+local Tab = P "\t" * Lc ( '\\l_@@_tab_tl' )
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+local SpaceIndentation = Lc ( '\\@@_an_indentation_space:' ) * ( Q " " )
+% \end{macrocode}
+%
+%
+% \bigskip
+% \begin{macrocode}
+local Delim = Q ( S "[()]" )
+% \end{macrocode}
+%
+% \bigskip
+% The following \textsc{lpeg} catches a space (U+0020) and replace it by
+% |\l_@@_space_tl|. It will be used in the strings. Usually,
+% |\l_@@_space_tl| will contain a space and therefore there won't be difference.
+% However, when the key |show-spaces-in-strings| is in force, |\\l_@@_space_tl| will
+% contain ␣ (U+2423) in order to visualize the spaces.
+% \begin{macrocode}
+local VisualSpace = space * Lc "\\l_@@_space_tl"
+% \end{macrocode}
+%
+%
+% \bigskip
+% \subsubsection{The LPEG python}
+%
+% \bigskip
+% Some strings of length 2 are explicit because we want the corresponding
+% ligatures available in some fonts such as \emph{Fira Code} to be active.
+% \begin{macrocode}
+local Operator =
+ K ( 'Operator' ,
+ P "!=" + P "<>" + P "==" + P "<<" + P ">>" + P "<=" + P ">=" + P ":="
+ + P "//" + P "**" + S "-~+/*%=<>&.@|"
+ )
+
+local OperatorWord =
+ K ( 'Operator.Word' ,P "in" + P "is" + P "and" + P "or" + P "not" )
+
+local Keyword =
+ K ( 'Keyword' ,
+ P "as" + P "assert" + P "break" + P "case" + P "class" + P "continue"
+ + P "def" + P "del" + P "elif" + P "else" + P "except" + P "exec"
+ + P "finally" + P "for" + P "from" + P "global" + P "if" + P "import"
+ + P "lambda" + P "non local" + P "pass" + P "return" + P "try"
+ + P "while" + P "with" + P "yield" + P "yield from" )
+ + K ( 'Keyword.Constant' ,P "True" + P "False" + P "None" )
+
+local Builtin =
+ K ( 'Name.Builtin' ,
+ P "__import__" + P "abs" + P "all" + P "any" + P "bin" + P "bool"
+ + P "bytearray" + P "bytes" + P "chr" + P "classmethod" + P "compile"
+ + P "complex" + P "delattr" + P "dict" + P "dir" + P "divmod"
+ + P "enumerate" + P "eval" + P "filter" + P "float" + P "format"
+ + P "frozenset" + P "getattr" + P "globals" + P "hasattr" + P "hash"
+ + P "hex" + P "id" + P "input" + P "int" + P "isinstance" + P "issubclass"
+ + P "iter" + P "len" + P "list" + P "locals" + P "map" + P "max"
+ + P "memoryview" + P "min" + P "next" + P "object" + P "oct" + P "open"
+ + P "ord" + P "pow" + P "print" + P "property" + P "range" + P "repr"
+ + P "reversed" + P "round" + P "set" + P "setattr" + P "slice" + P "sorted"
+ + P "staticmethod" + P "str" + P "sum" + P "super" + P "tuple" + P "type"
+ + P "vars" + P "zip" )
+
+
+local Exception =
+ K ( 'Exception' ,
+ P "ArithmeticError" + P "AssertionError" + P "AttributeError"
+ + P "BaseException" + P "BufferError" + P "BytesWarning" + P "DeprecationWarning"
+ + P "EOFError" + P "EnvironmentError" + P "Exception" + P "FloatingPointError"
+ + P "FutureWarning" + P "GeneratorExit" + P "IOError" + P "ImportError"
+ + P "ImportWarning" + P "IndentationError" + P "IndexError" + P "KeyError"
+ + P "KeyboardInterrupt" + P "LookupError" + P "MemoryError" + P "NameError"
+ + P "NotImplementedError" + P "OSError" + P "OverflowError"
+ + P "PendingDeprecationWarning" + P "ReferenceError" + P "ResourceWarning"
+ + P "RuntimeError" + P "RuntimeWarning" + P "StopIteration"
+ + P "SyntaxError" + P "SyntaxWarning" + P "SystemError" + P "SystemExit"
+ + P "TabError" + P "TypeError" + P "UnboundLocalError" + P "UnicodeDecodeError"
+ + P "UnicodeEncodeError" + P "UnicodeError" + P "UnicodeTranslateError"
+ + P "UnicodeWarning" + P "UserWarning" + P "ValueError" + P "VMSError"
+ + P "Warning" + P "WindowsError" + P "ZeroDivisionError"
+ + P "BlockingIOError" + P "ChildProcessError" + P "ConnectionError"
+ + P "BrokenPipeError" + P "ConnectionAbortedError" + P "ConnectionRefusedError"
+ + P "ConnectionResetError" + P "FileExistsError" + P "FileNotFoundError"
+ + P "InterruptedError" + P "IsADirectoryError" + P "NotADirectoryError"
+ + P "PermissionError" + P "ProcessLookupError" + P "TimeoutError"
+ + P "StopAsyncIteration" + P "ModuleNotFoundError" + P "RecursionError" )
+
+
+local RaiseException = K ( 'Keyword' , P "raise" ) * SkipSpace * Exception * Q ( P "(" )
+
+% \end{macrocode}
+%
+% \bigskip
+% In Python, a ``decorator'' is a statement whose begins by |@| which patches
+% the function defined in the following statement.
+% \begin{macrocode}
+local Decorator = K ( 'Name.Decorator' , P "@" * letter^1 )
+% \end{macrocode}
+%
+% \bigskip
+% The following \textsc{lpeg} |DefClass| will be used to detect the definition of a
+% new class (the name of that new class will be formatted with the \pkg{piton}
+% style |Name.Class|).
+%
+% \smallskip
+% Example:\enskip \piton{class myclass:}
+% \begin{macrocode}
+local DefClass =
+ K ( 'Keyword' , P "class" ) * Space * K ( 'Name.Class' , identifier )
+% \end{macrocode}
+%
+% If the word |class| is not followed by a identifier, it will be catched as
+% keyword by the \textsc{lpeg} |Keyword| (useful if we want to type a
+% list of keywords).
+%
+%
+% \bigskip
+% The following \textsc{lpeg} |ImportAs| is used for the lines beginning by |import|.
+% % We have to detect the potential keyword |as| because both the name of the
+% module and its alias must be formatted with the \pkg{piton} style |Name.Namespace|.
+%
+% \smallskip
+% Example:\enskip \piton{import numpy as np}
+%
+% \smallskip
+% Moreover, after the keyword |import|, it's possible to have a comma-separated
+% list of modules (if the keyword |as| is not used).
+%
+% \smallskip
+% Example:\enskip \piton{import math, numpy}
+% \begin{macrocode}
+local ImportAs =
+ K ( 'Keyword' , P "import" )
+ * Space
+ * K ( 'Name.Namespace' ,
+ identifier * ( P "." * identifier ) ^ 0 )
+ * (
+ ( Space * K ( 'Keyword' , P "as" ) * Space
+ * K ( 'Name.Namespace' , identifier ) )
+ +
+ ( SkipSpace * Q ( P "," ) * SkipSpace
+ * K ( 'Name.Namespace' , identifier ) ) ^ 0
+ )
+% \end{macrocode}
+% Be careful: there is no commutativity of |+| in the previous expression.
+%
+% \bigskip
+% The \textsc{lpeg} |FromImport| is used for the lines beginning by |from|. We
+% need a special treatment because the identifier following the keyword |from|
+% must be formatted with the \pkg{piton} style |Name.Namespace| and the
+% following keyword |import| must be formatted with the \pkg{piton} style
+% |Keyword| and must \emph{not} be catched by the \textsc{lpeg} |ImportAs|.
+%
+% \smallskip
+% Example:\enskip \piton{from math import pi}
+%
+% \smallskip
+% \begin{macrocode}
+local FromImport =
+ K ( 'Keyword' , P "from" )
+ * Space * K ( 'Name.Namespace' , identifier )
+ * Space * K ( 'Keyword' , P "import" )
+% \end{macrocode}
+%
+% \bigskip
+% \paragraph{The strings of Python}
+%
+% For the strings in Python, there are four categories of delimiters (without
+% counting the prefixes for f-strings and raw strings). We will use, in the
+% names of our \textsc{lpeg}, prefixes to distinguish the \textsc{lpeg} dealing
+% with that categories of strings, as presented in the following tabular.
+% \begin{center}
+% \begin{tabular}{ccc}
+% \toprule
+% & |Single| & |Double| \\
+% \midrule
+% |Short| & |'text'| & |"text"| \\
+% |Long| & |'''test'''| & |"""text"""| \\
+% \bottomrule
+% \end{tabular}
+% \end{center}
+%
+%
+% \bigskip
+% We have also to deal with the interpolations in the f-strings. Here
+% is an example of a f-string with an interpolation and a format
+% instruction\footnote{There is no special \pkg{piton} style for the formatting
+% instruction (after the colon): the style which will be applied will be the
+% style of the encompassing string, that is to say |String.Short| or
+% |String.Long|.} in that interpolation:
+%
+% \piton{f'Total price: {total+1:.2f} €'}
+%
+%
+% \bigskip
+% The interpolations beginning by |%| (even though there is more modern
+% technics now in Python).
+% \begin{macrocode}
+local PercentInterpol =
+ K ( 'String.Interpol' ,
+ P "%"
+ * ( P "(" * alphanum ^ 1 * P ")" ) ^ -1
+ * ( S "-#0 +" ) ^ 0
+ * ( digit ^ 1 + P "*" ) ^ -1
+ * ( P "." * ( digit ^ 1 + P "*" ) ) ^ -1
+ * ( S "HlL" ) ^ -1
+ * S "sdfFeExXorgiGauc%"
+ )
+% \end{macrocode}
+%
+% \bigskip
+% We can now define the \textsc{lpeg} for the four kinds of strings. It's not
+% possible to use our function~|K| because of the interpolations which must be
+% formatted with another \pkg{piton} style that the rest of the
+% string.\footnote{The interpolations are formatted with the \pkg{piton} style
+% |Interpol.Inside|. The initial value of that style is \texttt{\textbackslash
+% @@\_piton:n} wich means that the interpolations are parsed once again by \pkg{piton}.}
+% \begin{macrocode}
+local SingleShortString =
+ WithStyle ( 'String.Short' ,
+% \end{macrocode}
+% First, we deal with the f-strings of Python, which are prefixed by |f| or |F|.
+% \begin{macrocode}
+ Q ( P "f'" + P "F'" )
+ * (
+ K ( 'String.Interpol' , P "{" )
+ * K ( 'Interpol.Inside' , ( 1 - S "}':" ) ^ 0 )
+ * Q ( P ":" * (1 - S "}:'") ^ 0 ) ^ -1
+ * K ( 'String.Interpol' , P "}" )
+ +
+ VisualSpace
+ +
+ Q ( ( P "\\'" + P "{{" + P "}}" + 1 - S " {}'" ) ^ 1 )
+ ) ^ 0
+ * Q ( P "'" )
+ +
+% \end{macrocode}
+% Now, we deal with the standard strings of Python, but also the ``raw strings''.
+% \begin{macrocode}
+ Q ( P "'" + P "r'" + P "R'" )
+ * ( Q ( ( P "\\'" + 1 - S " '\r%" ) ^ 1 )
+ + VisualSpace
+ + PercentInterpol
+ + Q ( P "%" )
+ ) ^ 0
+ * Q ( P "'" ) )
+
+
+local DoubleShortString =
+ WithStyle ( 'String.Short' ,
+ Q ( P "f\"" + P "F\"" )
+ * (
+ K ( 'String.Interpol' , P "{" )
+ * Q ( ( 1 - S "}\":" ) ^ 0 , 'Interpol.Inside' )
+ * ( K ( 'String.Interpol' , P ":" ) * Q ( (1 - S "}:\"") ^ 0 ) ) ^ -1
+ * K ( 'String.Interpol' , P "}" )
+ +
+ VisualSpace
+ +
+ Q ( ( P "\\\"" + P "{{" + P "}}" + 1 - S " {}\"" ) ^ 1 )
+ ) ^ 0
+ * Q ( P "\"" )
+ +
+ Q ( P "\"" + P "r\"" + P "R\"" )
+ * ( Q ( ( P "\\\"" + 1 - S " \"\r%" ) ^ 1 )
+ + VisualSpace
+ + PercentInterpol
+ + Q ( P "%" )
+ ) ^ 0
+ * Q ( P "\"" ) )
+
+local ShortString = SingleShortString + DoubleShortString
+% \end{macrocode}
+%
+% \bigskip
+% \paragraph{Beamer}
+%
+% The following \textsc{lpeg} |BalancedBraces| will be used for the (mandatory)
+% argument of the commands |\only| and \emph{al.} of Beamer. It's necessary to
+% use a \emph{grammar} because that pattern mainly checks the correct nesting of
+% the delimiters (and it's known in the theory of formal languages that this
+% can't be done with regular expressions \emph{stricto sensu} only).
+% \begin{macrocode}
+local BalancedBraces =
+ P { "E" ,
+ E =
+ (
+ P "{" * V "E" * P "}"
+ +
+ ShortString
+ +
+ ( 1 - S "{}" )
+ ) ^ 0
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% If Beamer is used (or if the key |beamer| is used at load-time), the following
+% LPEG will be redefined.
+% \begin{macrocode}
+local Beamer = P ( false )
+local BeamerBeginEnvironments = P ( true )
+local BeamerEndEnvironments = P ( true )
+local BeamerNamesEnvironments =
+ P "uncoverenv" + P "onlyenv" + P "visibleenv" + P "invisibleenv"
+ + P "alertenv" + P "actionenv"
+
+% \end{macrocode}
+%
+% \begin{macrocode}
+UserCommands =
+ Ct ( Cc "Open" * C ( "\\emph{" ) * Cc "}" )
+ * ( C ( BalancedBraces ) / (function (s) return MainLoopPython:match(s) end ) )
+ * P "}" * Ct ( Cc "Close" )
+% \end{macrocode}
+%
+% \begin{macrocode}
+function OneBeamerEnvironment(name)
+ return
+ Ct ( Cc "Open"
+ * C (
+ P ( "\\begin{" .. name .. "}" )
+ * ( P "<" * (1 - P ">") ^ 0 * P ">" ) ^ -1
+ )
+ * Cc ( "\\end{" .. name .. "}" )
+ )
+ * (
+ C ( ( 1 - P ( "\\end{" .. name .. "}" ) ) ^ 0 )
+ / (function (s) return MainLoopPython:match(s) end )
+ )
+ * P ( "\\end{" .. name .. "}" ) * Ct ( Cc "Close" )
+end
+% \end{macrocode}
+%
+%
+% \bigskip
+% \begin{macrocode}
+if piton_beamer
+then
+ Beamer =
+ L ( P "\\pause" * ( P "[" * (1 - P "]") ^ 0 * P "]" ) ^ -1 )
+ +
+ Ct ( Cc "Open"
+ * C (
+ (
+ P "\\uncover" + P "\\only" + P "\\alert" + P "\\visible"
+ + P "\\invisible" + P "\\action"
+ )
+ * ( P "<" * (1 - P ">") ^ 0 * P ">" ) ^ -1
+ * P "{"
+ )
+ * Cc "}"
+ )
+ * ( C ( BalancedBraces ) / (function (s) return MainLoopPython:match(s) end ) )
+ * P "}" * Ct ( Cc "Close" )
+ +
+ OneBeamerEnvironment "uncoverenv"
+ + OneBeamerEnvironment "onlyenv"
+ + OneBeamerEnvironment "visibleenv"
+ + OneBeamerEnvironment "invisibleenv"
+ + OneBeamerEnvironment "alertenv"
+ + OneBeamerEnvironment "actionenv"
+ +
+ L (
+% \end{macrocode}
+% For |\\alt|, the specification of the overlays (between angular brackets) is mandatory.
+% \begin{macrocode}
+ ( P "\\alt" )
+ * P "<" * (1 - P ">") ^ 0 * P ">"
+ * P "{"
+ )
+ * K ( 'ParseAgain.noCR' , BalancedBraces )
+ * L ( P "}{" )
+ * K ( 'ParseAgain.noCR' , BalancedBraces )
+ * L ( P "}" )
+ +
+ L (
+% \end{macrocode}
+% For |\\alt|, the specification of the overlays (between angular brackets) is mandatory.
+% \begin{macrocode}
+ ( P "\\temporal" )
+ * P "<" * (1 - P ">") ^ 0 * P ">"
+ * P "{"
+ )
+ * K ( 'ParseAgain.noCR' , BalancedBraces )
+ * L ( P "}{" )
+ * K ( 'ParseAgain.noCR' , BalancedBraces )
+ * L ( P "}{" )
+ * K ( 'ParseAgain.noCR' , BalancedBraces )
+ * L ( P "}" )
+% \end{macrocode}
+% Now for the environemnts.
+% \begin{macrocode}
+ BeamerBeginEnvironments =
+ ( space ^ 0 *
+ L
+ (
+ P "\\begin{" * BeamerNamesEnvironments * "}"
+ * ( P "<" * ( 1 - P ">") ^ 0 * P ">" ) ^ -1
+ )
+ * P "\r"
+ ) ^ 0
+ BeamerEndEnvironments =
+ ( space ^ 0 *
+ L ( P "\\end{" * BeamerNamesEnvironments * P "}" )
+ * P "\r"
+ ) ^ 0
+end
+% \end{macrocode}
+%
+% \bigskip
+% \paragraph{EOL}
+%
+% \bigskip
+% The following LPEG will detect the Python prompts when the user is typesetting
+% an interactive session of Python (directly or through |{pyconsole}| of
+% \pkg{pyluatex}). We have to detect that prompt twice. The first detection
+% (called \emph{hasty detection}) will be before the |\@@_begin_line:| because
+% you want to trigger a special background color for that row (and, after the
+% |\@@_begin_line:|, it's too late to change de background).
+% \begin{macrocode}
+local PromptHastyDetection = ( # ( P ">>>" + P "..." ) * Lc ( '\\@@_prompt:' ) ) ^ -1
+% \end{macrocode}
+% We remind that the marker |#| of \textsc{lpeg} specifies that the pattern will be
+% detected but won't consume any character.
+%
+% \medskip
+% With the following \textsc{lpeg}, a style will actually be applied to the
+% prompt (for instance, it's possible to decide to discard these prompts).
+% \begin{macrocode}
+local Prompt = K ( 'Prompt' , ( ( P ">>>" + P "..." ) * P " " ^ -1 ) ^ -1 )
+% \end{macrocode}
+%
+%
+%
+% \bigskip
+% The following \textsc{lpeg} |EOL| is for the end of lines.
+% \begin{macrocode}
+local EOL =
+ P "\r"
+ *
+ (
+ ( space^0 * -1 )
+ +
+% \end{macrocode}
+% We recall that each line in the Python code we have to parse will be sent
+% back to LaTeX between a pair |\@@_begin_line:| --
+% |\@@_end_line:|\footnote{Remember that the \texttt{\textbackslash
+% @@\_end\_line:} must be explicit because it will be used as marker in order to
+% delimit the argument of the command \texttt{\textbackslash @@\_begin\_line:}}.
+% \begin{macrocode}
+ Ct (
+ Cc "EOL"
+ *
+ Ct (
+ Lc "\\@@_end_line:"
+ * BeamerEndEnvironments
+ * BeamerBeginEnvironments
+ * PromptHastyDetection
+ * Lc "\\@@_newline: \\@@_begin_line:"
+ * Prompt
+ )
+ )
+ )
+ *
+ SpaceIndentation ^ 0
+% \end{macrocode}
+%
+%
+% \bigskip
+% \paragraph{The long strings}
+%
+%
+% \begin{macrocode}
+local SingleLongString =
+ WithStyle ( 'String.Long' ,
+ ( Q ( S "fF" * P "'''" )
+ * (
+ K ( 'String.Interpol' , P "{" )
+ * K ( 'Interpol.Inside' , ( 1 - S "}:\r" - P "'''" ) ^ 0 )
+ * Q ( P ":" * (1 - S "}:\r" - P "'''" ) ^ 0 ) ^ -1
+ * K ( 'String.Interpol' , P "}" )
+ +
+ Q ( ( 1 - P "'''" - S "{}'\r" ) ^ 1 )
+ +
+ EOL
+ ) ^ 0
+ +
+ Q ( ( S "rR" ) ^ -1 * P "'''" )
+ * (
+ Q ( ( 1 - P "'''" - S "\r%" ) ^ 1 )
+ +
+ PercentInterpol
+ +
+ P "%"
+ +
+ EOL
+ ) ^ 0
+ )
+ * Q ( P "'''" ) )
+
+
+local DoubleLongString =
+ WithStyle ( 'String.Long' ,
+ (
+ Q ( S "fF" * P "\"\"\"" )
+ * (
+ K ( 'String.Interpol', P "{" )
+ * K ( 'Interpol.Inside' , ( 1 - S "}:\r" - P "\"\"\"" ) ^ 0 )
+ * Q ( P ":" * (1 - S "}:\r" - P "\"\"\"" ) ^ 0 ) ^ -1
+ * K ( 'String.Interpol' , P "}" )
+ +
+ Q ( ( 1 - P "\"\"\"" - S "{}\"\r" ) ^ 1 )
+ +
+ EOL
+ ) ^ 0
+ +
+ Q ( ( S "rR" ) ^ -1 * P "\"\"\"" )
+ * (
+ Q ( ( 1 - P "\"\"\"" - S "%\r" ) ^ 1 )
+ +
+ PercentInterpol
+ +
+ P "%"
+ +
+ EOL
+ ) ^ 0
+ )
+ * Q ( P "\"\"\"" )
+ )
+% \end{macrocode}
+%
+% \begin{macrocode}
+local LongString = SingleLongString + DoubleLongString
+% \end{macrocode}
+%
+% \bigskip
+% We have a \textsc{lpeg} for the Python docstrings. That \textsc{lpeg} will
+% be used in the \textsc{lpeg} |DefFunction| which deals with the whole preamble
+% of a function definition (which begins with |def|).
+% \begin{macrocode}
+local StringDoc =
+ K ( 'String.Doc' , P "\"\"\"" )
+ * ( K ( 'String.Doc' , (1 - P "\"\"\"" - P "\r" ) ^ 0 ) * EOL
+ * Tab ^ 0
+ ) ^ 0
+ * K ( 'String.Doc' , ( 1 - P "\"\"\"" - P "\r" ) ^ 0 * P "\"\"\"" )
+% \end{macrocode}
+%
+% \bigskip
+% \paragraph{The comments in the Python listings}
+%
+% We define different \textsc{lpeg} dealing with comments in the Python
+% listings.
+% \begin{macrocode}
+local CommentMath =
+ P "$" * K ( 'Comment.Math' , ( 1 - S "$\r" ) ^ 1 ) * P "$"
+
+local Comment =
+ WithStyle ( 'Comment' ,
+ Q ( P "#" )
+ * ( CommentMath + Q ( ( 1 - S "$\r" ) ^ 1 ) ) ^ 0 )
+ * ( EOL + -1 )
+% \end{macrocode}
+%
+%
+%
+% \bigskip
+% The following \textsc{lpeg} |CommentLaTeX| is for what is called in that
+% document the ``LaTeX comments''. Since the elements that will be catched must
+% be sent to LaTeX with standard LaTeX catcodes, we put the capture (done by
+% the function~|C|) in a table (by using~|Ct|, which is an alias for |lpeg.Ct|).
+% \begin{macrocode}
+local CommentLaTeX =
+ P(piton.comment_latex)
+ * Lc "{\\PitonStyle{Comment.LaTeX}{\\ignorespaces"
+ * L ( ( 1 - P "\r" ) ^ 0 )
+ * Lc "}}"
+ * ( EOL + -1 ) -- you could put EOL instead of EOL
+% \end{macrocode}
+%
+% \bigskip
+% \paragraph{DefFunction}
+%
+% The following \textsc{lpeg} |Expression| will be used for the parameters in
+% the \emph{argspec} of a Python function. It's necessary to use a \emph{grammar}
+% because that pattern mainly checks the correct nesting of the delimiters
+% (and it's known in the theory of formal languages that this can't be done with
+% regular expressions \emph{stricto sensu} only).
+% \begin{macrocode}
+local Expression =
+ P { "E" ,
+ E = ( 1 - S "{}()[]\r," ) ^ 0
+ * (
+ ( P "{" * V "F" * P "}"
+ + P "(" * V "F" * P ")"
+ + P "[" * V "F" * P "]" ) * ( 1 - S "{}()[]\r," ) ^ 0
+ ) ^ 0 ,
+ F = ( 1 - S "{}()[]\r\"'" ) ^ 0
+ * ( (
+ P "'" * (P "\\'" + 1 - S"'\r" )^0 * P "'"
+ + P "\"" * (P "\\\"" + 1 - S"\"\r" )^0 * P "\""
+ + P "{" * V "F" * P "}"
+ + P "(" * V "F" * P ")"
+ + P "[" * V "F" * P "]"
+ ) * ( 1 - S "{}()[]\r\"'" ) ^ 0 ) ^ 0 ,
+ }
+% \end{macrocode}
+%
+% \bigskip
+% We will now define a \textsc{lpeg} |Params| that will catch the list of
+% parameters (that is to say the \emph{argspec}) in the definition of a Python
+% function. For example, in the line of code
+% \begin{center}
+% \piton{def MyFunction(a,b,x=10,n:int): return n}
+% \end{center}
+% the \textsc{lpeg} |Params| will be used to catch the chunk\enskip |a,b,x=10,n:int|.
+%
+% Or course, a |Params| is simply a comma-separated list of |Param|, and that's
+% why we define first the \textsc{lpeg} |Param|.
+%
+% \medskip
+% \begin{macrocode}
+local Param =
+ SkipSpace * Identifier * SkipSpace
+ * (
+ K ( 'InitialValues' , P "=" * Expression )
+ + Q ( P ":" ) * SkipSpace * K ( 'Name.Type' , letter^1 )
+ ) ^ -1
+% \end{macrocode}
+%
+% \medskip
+% \begin{macrocode}
+local Params = ( Param * ( Q "," * Param ) ^ 0 ) ^ -1
+% \end{macrocode}
+%
+% \bigskip
+% The following \textsc{lpeg} |DefFunction| catches a keyword |def| and the
+% following name of function \emph{but also everything else until a potential
+% docstring}. That's why this definition of \textsc{lpeg} must occur (in the file
+% |piton.sty|) after the definition of several other \textsc{lpeg} such as
+% |Comment|, |CommentLaTeX|, |Params|, |StringDoc|...
+% \begin{macrocode}
+local DefFunction =
+ K ( 'Keyword' , P "def" )
+ * Space
+ * K ( 'Name.Function.Internal' , identifier )
+ * SkipSpace
+ * Q ( P "(" ) * Params * Q ( P ")" )
+ * SkipSpace
+ * ( Q ( P "->" ) * SkipSpace * K ( 'Name.Type' , identifier ) ) ^ -1
+% \end{macrocode}
+% Here, we need a \pkg{piton} style |ParseAgain| which will be linked to
+% |\@@_piton:n| (that means that the capture will be parsed once again by
+% \pkg{piton}). We could avoid that kind of trick by using a non-terminal of a
+% grammar but we have probably here a better legibility.
+% \begin{macrocode}
+ * K ( 'ParseAgain' , ( 1 - S ":\r" )^0 )
+ * Q ( P ":" )
+ * ( SkipSpace
+ * ( EOL + CommentLaTeX + Comment ) -- in all cases, that contains an EOL
+ * Tab ^ 0
+ * SkipSpace
+ * StringDoc ^ 0 -- there may be additionnal docstrings
+ ) ^ -1
+% \end{macrocode}
+% Remark that, in the previous code, |CommentLaTeX| \emph{must} appear
+% before |Comment|: there is no commutativity of the addition for the
+% \emph{parsing expression grammars} (\textsc{peg}).
+%
+% \smallskip
+% If the word |def| is not followed by an identifier and parenthesis, it will be
+% catched as keyword by the \textsc{lpeg} |Keyword| (useful if, for example, the
+% final user wants to speak of the keyword \piton{def}).
+%
+% \bigskip
+% \paragraph{The dictionaries of Python}
+%
+% We have \textsc{lpeg} dealing with dictionaries of Python because, in
+% typesettings of explicit Python dictionaries, one may prefer to have all the
+% values formatted in black (in order to see more clearly the keys which are
+% usually Python strings). That's why we have a \pkg{piton} style |Dict.Value|.
+%
+% The initial value of that \pkg{piton} style is |\@@_piton:n|, which means that
+% the value of the entry of the dictionary is parsed once again by \pkg{piton}
+% (and nothing special is done for the dictionary). In the following example, we
+% have set the \pkg{piton} style |Dict.Value| to |\color{black}|:
+%
+% \medskip
+% \begingroup
+% \SetPitonStyle{Dict.Value = \color{black}}
+% \piton{mydict = { 'name' : 'Paul', 'sex' : 'male', 'age' : 31 } }
+% \endgroup
+%
+% \medskip
+% At this time, this mechanism works only for explicit dictionaries on a single line!
+%
+% \begin{macrocode}
+local ItemDict =
+ ShortString * SkipSpace * Q ( P ":" ) * K ( 'Dict.Value' , Expression )
+
+local ItemOfSet = SkipSpace * ( ItemDict + ShortString ) * SkipSpace
+
+local Set =
+ Q ( P "{" )
+ * ItemOfSet * ( Q ( P "," ) * ItemOfSet ) ^ 0
+ * Q ( P "}" )
+% \end{macrocode}
+%
+% \paragraph{Miscellaneous}
+%
+% \begin{macrocode}
+local ExceptionInConsole = Exception * Q ( ( 1 - P "\r" ) ^ 0 ) * EOL
+% \end{macrocode}
+%
+%
+% \bigskip
+% \paragraph{The main LPEG}
+%
+% First, the main loop :
+% \begin{macrocode}
+MainLoopPython =
+ ( ( space^1 * -1 )
+ + EOL
+ + Space
+ + Tab
+ + Escape
+ + CommentLaTeX
+ + Beamer
+ + UserCommands
+ + LongString
+ + Comment
+ + ExceptionInConsole
+ + Set
+ + Delim
+% \end{macrocode}
+% |Operator| must be before |Punct|.
+% \begin{macrocode}
+ + Operator
+ + ShortString
+ + Punct
+ + FromImport
+ + RaiseException
+ + DefFunction
+ + DefClass
+ + Keyword * ( Space + Punct + Delim + EOL+ -1 )
+ + Decorator
+ + OperatorWord * ( Space + Punct + Delim + EOL+ -1 )
+ + Builtin * ( Space + Punct + Delim + EOL+ -1 )
+ + Identifier
+ + Number
+ + Word
+ ) ^ 0
+% \end{macrocode}
+%
+% \bigskip
+% We recall that each line in the Python code to parse will be sent back to
+% LaTeX between a pair |\@@_begin_line:| -- |\@@_end_line:|\footnote{Remember
+% that the \texttt{\textbackslash @@\_end\_line:} must be explicit because it
+% will be used as marker in order to delimit the argument of the command
+% \texttt{\textbackslash @@\_begin\_line:}}.
+% \begin{macrocode}
+local python = P ( true )
+
+python =
+ Ct (
+ ( ( space - P "\r" ) ^0 * P "\r" ) ^ -1
+ * BeamerBeginEnvironments
+ * PromptHastyDetection
+ * Lc '\\@@_begin_line:'
+ * Prompt
+ * SpaceIndentation ^ 0
+ * MainLoopPython
+ * -1
+ * Lc '\\@@_end_line:'
+ )
+% \end{macrocode}
+%
+% \begin{macrocode}
+local languages = { }
+languages['python'] = python
+% \end{macrocode}
+%
+% % \bigskip
+% \subsubsection{The LPEG ocaml}
+%
+% \begin{macrocode}
+local Delim = Q ( P "[|" + P "|]" + S "[()]" )
+% \end{macrocode}
+%
+% \begin{macrocode}
+local Punct = Q ( S ",:;!" )
+% \end{macrocode}
+%
+% \begin{macrocode}
+local identifier =
+ ( R "az" + R "AZ" + P "_") * ( R "az" + R "AZ" + S "_'" + digit ) ^ 0
+
+local Identifier = K ( 'Identifier' , identifier )
+
+local Operator =
+ K ( 'Operator' ,
+ P "!=" + P "<>" + P "==" + P "<<" + P ">>" + P "<=" + P ">=" + P ":="
+ + P "||" + P "&&" + P "//" + P "**" + P ";;" + P "::" + P "->"
+ + P "+." + P "-." + P "*." + P "/."
+ + S "-~+/*%=<>&@|"
+ )
+
+local OperatorWord =
+ K ( 'Operator.Word' ,
+ P "and" + P "asr" + P "land" + P "lor" + P "lsl" + P "lxor"
+ + P "mod" + P "or" )
+
+local Keyword =
+ K ( 'Keyword' ,
+ P "as" + P "assert" + P "begin" + P "class" + P "constraint" + P "done"
+ + P "do" + P "downto" + P "else" + P "end" + P "exception" + P "external"
+ + P "false" + P "for" + P "function" + P "fun" + P "functor" + P "if"
+ + P "in" + P "include" + P "inherit" + P "initializer" + P "lazy" + P "let"
+ + P "match" + P "method" + P "module" + P "mutable" + P "new" + P "object"
+ + P "of" + P "open" + P "private" + P "raise" + P "rec" + P "sig"
+ + P "struct" + P "then" + P "to" + P "true" + P "try" + P "type"
+ + P "value" + P "val" + P "virtual" + P "when" + P "while" + P "with" )
+ + K ( 'Keyword.Constant' , P "true" + P "false" )
+
+
+local Builtin =
+ K ( 'Name.Builtin' ,
+ P "not" + P "incr" + P "decr" + P "fst" + P "snd"
+ + P "String.length"
+ + P "List.tl" + P "List.hd" + P "List.mem" + P "List.exists"
+ + P "List.for_all" + P "List.filter" + P "List.length" + P "List.map"
+ + P "List.iter"
+ + P "Array.length" + P "Array.make" + P "Array.make_matrix"
+ + P "Array.init" + P "Array.copy" + P "Array.copy" + P "Array.mem"
+ + P "Array.exists" + P "Array.for_all" + P "Array.map" + P "Array.iter"
+ + P "Queue.create" + P "Queue.is_empty" + P "Queue.push" + P "Queue.pop"
+ + P "Stack.create" + P "Stack.is_empty" + P "Stack.push" + P "Stack.pop"
+ + P "Hashtbl.create" + P "Hashtbl.add" + P "Hashtbl.remove"
+ + P "Hashtbl.mem" + P "Hashtbl.find" + P "Hashtbl.find_opt"
+ + P "Hashtbl.iter" )
+% \end{macrocode}
+%
+% \bigskip
+% The following exceptions are exceptions in the standard library of OCaml (Stdlib).
+% \begin{macrocode}
+local Exception =
+ K ( 'Exception' ,
+ P "Division_by_zero" + P "End_of_File" + P "Failure"
+ + P "Invalid_argument" + P "Match_failure" + P "Not_found"
+ + P "Out_of_memory" + P "Stack_overflow" + P "Sys_blocked_io"
+ + P "Sys_error" + P "Undefined_recursive_module" )
+% \end{macrocode}
+%
+% \bigskip
+% \paragraph{The characters in OCaml}
+%
+% \begin{macrocode}
+local Char =
+ K ( 'String.Short' , P "'" * ( ( 1 - P "'" ) ^ 0 + P "\\'" ) * P "'" )
+% \end{macrocode}
+%
+%
+% \bigskip
+% \paragraph{Beamer}
+%
+% \begin{macrocode}
+local BalancedBraces =
+ P { "E" ,
+ E =
+ (
+ P "{" * V "E" * P "}"
+ +
+ P "\"" * ( 1 - S "\"" ) ^ 0 * P "\"" -- OCaml strings
+ +
+ ( 1 - S "{}" )
+ ) ^ 0
+ }
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+if piton_beamer
+then
+ Beamer =
+ L ( P "\\pause" * ( P "[" * (1 - P "]") ^ 0 * P "]" ) ^ -1 )
+ +
+ ( P "\\uncover" * Lc ( '\\@@_beamer_command:n{uncover}' )
+ + P "\\only" * Lc ( '\\@@_beamer_command:n{only}' )
+ + P "\\alert" * Lc ( '\\@@_beamer_command:n{alert}' )
+ + P "\\visible" * Lc ( '\\@@_beamer_command:n{visible}' )
+ + P "\\invisible" * Lc ( '\\@@_beamer_command:n{invisible}' )
+ + P "\\action" * Lc ( '\\@@_beamer_command:n{action}' )
+ )
+ *
+ L ( ( P "<" * (1 - P ">") ^ 0 * P ">" ) ^ -1 * P "{" )
+ * K ( 'ParseAgain.noCR' , BalancedBraces )
+ * L ( P "}" )
+ +
+ L (
+ ( P "\\alt" )
+ * P "<" * (1 - P ">") ^ 0 * P ">"
+ * P "{"
+ )
+ * K ( 'ParseAgain.noCR' , BalancedBraces )
+ * L ( P "}{" )
+ * K ( 'ParseAgain.noCR' , BalancedBraces )
+ * L ( P "}" )
+ +
+ L (
+ ( P "\\temporal" )
+ * P "<" * (1 - P ">") ^ 0 * P ">"
+ * P "{"
+ )
+ * K ( 'ParseAgain.noCR' , BalancedBraces )
+ * L ( P "}{" )
+ * K ( 'ParseAgain.noCR' , BalancedBraces )
+ * L ( P "}{" )
+ * K ( 'ParseAgain.noCR' , BalancedBraces )
+ * L ( P "}" )
+ BeamerBeginEnvironments =
+ ( space ^ 0 *
+ L
+ (
+ P "\\begin{" * BeamerNamesEnvironments * "}"
+ * ( P "<" * ( 1 - P ">") ^ 0 * P ">" ) ^ -1
+ )
+ * P "\r"
+ ) ^ 0
+ BeamerEndEnvironments =
+ ( space ^ 0 *
+ L ( P "\\end{" * BeamerNamesEnvironments * P "}" )
+ * P "\r"
+ ) ^ 0
+end
+% \end{macrocode}
+%
+% \bigskip
+% \paragraph{EOL}
+% \begin{macrocode}
+local EOL =
+ P "\r"
+ *
+ (
+ ( space^0 * -1 )
+ +
+ Ct (
+ Cc "EOL"
+ *
+ Ct (
+ Lc "\\@@_end_line:"
+ * BeamerEndEnvironments
+ * BeamerBeginEnvironments
+ * PromptHastyDetection
+ * Lc "\\@@_newline: \\@@_begin_line:"
+ * Prompt
+ )
+ )
+ )
+ *
+ SpaceIndentation ^ 0
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+%
+% \paragraph{The strings}
+%
+% We need a pattern |string| without captures because it will be used within the
+% comments of OCaml.
+% \begin{macrocode}
+local string =
+ Q ( P "\"" )
+ * (
+ VisualSpace
+ +
+ Q ( ( 1 - S " \"\r" ) ^ 1 )
+ +
+ EOL
+ ) ^ 0
+ * Q ( P "\"" )
+% \end{macrocode}
+%
+% \begin{macrocode}
+local String = WithStyle ( 'String.Long' , string )
+% \end{macrocode}
+%
+%
+% \bigskip
+% Now, the ``quoted strings'' of OCaml (for example \verb+{ext|Essai|ext}+).
+%
+% For those strings, we will do two consecutive analysis. First an analysis to
+% determine the whole string and, then, an analysis for the potential visual
+% spaces and the EOL in the string.
+%
+% The first analysis require a match-time capture. For explanations about that
+% programmation, see the paragraphe \emph{Lua's long % strings} in
+% |www.inf.puc-rio.br/~roberto/lpeg|.
+% \begin{macrocode}
+local ext = ( R "az" + P "_" ) ^ 0
+local open = "{" * Cg(ext, 'init') * "|"
+local close = "|" * C(ext) * "}"
+local closeeq =
+ Cmt ( close * Cb('init'),
+ function (s, i, a, b) return a==b end )
+% \end{macrocode}
+%
+% \medskip
+% The \textsc{lpeg} |QuotedStringBis| will do the second analysis.
+% \begin{macrocode}
+local QuotedStringBis =
+ WithStyle ( 'String.Long' ,
+ (
+ VisualSpace
+ +
+ Q ( ( 1 - S " \r" ) ^ 1 )
+ +
+ EOL
+ ) ^ 0 )
+
+% \end{macrocode}
+%
+% \medskip
+% We use a ``function capture'' (as called in the official documentation of the
+% \textsc{lpeg}) in order to do the second analysis on the result of the first one.
+% \begin{macrocode}
+local QuotedString =
+ C ( open * ( 1 - closeeq ) ^ 0 * close ) /
+ ( function (s) return QuotedStringBis : match(s) end )
+% \end{macrocode}
+%
+%
+% \bigskip
+% \paragraph{The comments in the OCaml listings}
+%
+% In OCaml, the delimiters for the comments are |(*| and |*)|. There are
+% unsymmetrical and, therefore, the comments may be nested. That's why we need a
+% grammar.
+%
+% In these comments, we embed the math comments (between |$| and |$|) and we
+% embed also a treatment for the end of lines (since the comments may be multi-lines).
+%
+% \begin{macrocode}
+local Comment =
+ WithStyle ( 'Comment' ,
+ P {
+ "A" ,
+ A = Q "(*"
+ * ( V "A"
+ + Q ( ( 1 - P "(*" - P "*)" - S "\r$\"" ) ^ 1 ) -- $
+ + string
+ + P "$" * K ( 'Comment.Math' , ( 1 - S "$\r" ) ^ 1 ) * P "$" -- $
+ + EOL
+ ) ^ 0
+ * Q "*)"
+ } )
+% \end{macrocode}
+%
+% \bigskip
+% \paragraph{The DefFunction}
+%
+% \begin{macrocode}
+local DefFunction =
+ K ( 'Keyword' , P "let rec" + P "let" + P "and" )
+ * Space
+ * K ( 'Name.Function.Internal' , identifier )
+ * Space
+ * # ( P "=" * space * P "function" + ( 1 - P "=" ) )
+% \end{macrocode}
+%
+% \bigskip
+% \paragraph{The parameters of the types}
+%
+% \begin{macrocode}
+local TypeParameter = K ( 'TypeParameter' , P "'" * alpha * # ( 1 - P "'" ) )
+% \end{macrocode}
+%
+% \bigskip
+% \paragraph{The main LPEG}
+%
+% First, the main loop :
+% \begin{macrocode}
+MainLoopOCaml =
+ ( ( space^1 * -1 )
+ + EOL
+ + Space
+ + Tab
+ + Escape
+ + Beamer
+ + TypeParameter
+ + String + QuotedString + Char
+ + Comment
+ + Delim
+ + Operator
+ + Punct
+ + FromImport
+ + ImportAs
+ + Exception
+ + DefFunction
+ + Keyword * ( Space + Punct + Delim + EOL + -1 )
+ + OperatorWord * ( Space + Punct + Delim + EOL + -1 )
+ + Builtin * ( Space + Punct + Delim + EOL + -1 )
+ + Identifier
+ + Number
+ + Word
+ ) ^ 0
+% \end{macrocode}
+%
+% \bigskip
+% We recall that each line in the Python code to parse will be sent back to
+% LaTeX between a pair |\@@_begin_line:| -- |\@@_end_line:|\footnote{Remember
+% that the \texttt{\textbackslash @@\_end\_line:} must be explicit because it
+% will be used as marker in order to delimit the argument of the command
+% \texttt{\textbackslash @@\_begin\_line:}}.
+% \begin{macrocode}
+local ocaml = P ( true )
+
+ocaml =
+ Ct (
+ ( ( space - P "\r" ) ^0 * P "\r" ) ^ -1
+ * BeamerBeginEnvironments
+ * Lc ( '\\@@_begin_line:' )
+ * SpaceIndentation ^ 0
+ * MainLoopOCaml
+ * -1
+ * Lc ( '\\@@_end_line:' )
+ )
+% \end{macrocode}
+%
+% \begin{macrocode}
+languages['ocaml'] = ocaml
+% \end{macrocode}
+%
+% \bigskip
+% \subsubsection{The function Parse}
+%
+%
+% The function |Parse| is the main function of the package \pkg{piton}.
+% It parses its argument and sends back to LaTeX the code with interlaced
+% formatting LaTeX instructions. In fact, everything is done by the
+% \textsc{lpeg} |python| which returns as capture a Lua table containing
+% data to send to LaTeX.
+%
+% \bigskip
+% \begin{macrocode}
+function piton.Parse(language,code)
+ local t = languages[language] : match ( code )
+ local left_stack = {}
+ local right_stack = {}
+ for _ , one_item in ipairs(t)
+ do
+ if one_item[1] == "EOL"
+ then
+ for _ , s in ipairs(right_stack)
+ do tex.sprint( s )
+ end
+ for _ , s in ipairs(one_item[2])
+ do tex.tprint(s)
+ end
+ for _ , s in ipairs(left_stack)
+ do tex.sprint( s )
+ end
+ else
+ if one_item[1] == "Open"
+ then
+ tex.sprint( one_item[2] )
+ table.insert(left_stack,one_item[2])
+ table.insert(right_stack,one_item[3])
+ else
+ if one_item[1] == "Close"
+ then
+ tex.sprint( right_stack[#right_stack] )
+ left_stack[#left_stack] = nil
+ right_stack[#right_stack] = nil
+ else
+ tex.tprint(one_item)
+ end
+ end
+ end
+ end
+end
+% \end{macrocode}
+%
+%
+%
+% \bigskip
+% The function |ParseFile| will be used by the LaTeX command |\PitonInputFile|.
+% That function merely reads the whole file (that is to say all its lines) and
+% then apply the function~|Parse| to the resulting Lua string.
+% \begin{macrocode}
+function piton.ParseFile(language,name,first_line,last_line)
+ s = ''
+ local i = 0
+ for line in io.lines(name)
+ do i = i + 1
+ if i >= first_line
+ then s = s .. '\r' .. line
+ end
+ if i >= last_line then break end
+ end
+ piton.Parse(language,s)
+end
+% \end{macrocode}
+%
+% \bigskip
+% \subsubsection{Two variants of the function Parse with integrated preprocessors}
+%
+% The following command will be used by the user command |\piton|.
+% For that command, we have to undo the duplication of the symbols |#|.
+% \begin{macrocode}
+function piton.ParseBis(language,code)
+ local s = ( Cs ( ( P '##' / '#' + 1 ) ^ 0 ) ) : match ( code )
+ return piton.Parse(language,s)
+end
+% \end{macrocode}
+%
+% \bigskip
+% The following command will be used when we have to parse some small chunks of
+% code that have yet been parsed. They are re-scanned by LaTeX because it has
+% been required by |\@@_piton:n| in the \pkg{piton} style of the syntaxic
+% element. In that case, you have to remove the potential |\@@_breakable_space:|
+% that have been inserted when the key |break-lines| is in force.
+% \begin{macrocode}
+function piton.ParseTer(language,code)
+ local s = ( Cs ( ( P '\\@@_breakable_space:' / ' ' + 1 ) ^ 0 ) )
+ : match ( code )
+ return piton.Parse(language,s)
+end
+% \end{macrocode}
+%
+%
+% \bigskip
+% \subsubsection{Preprocessors of the function Parse for gobble}
+%
+% We deal now with preprocessors of the function |Parse| which are needed when
+% the ``gobble mechanism'' is used.
+%
+%
+% \bigskip
+% The function |gobble| gobbles $n$ characters on the left of the code. It uses
+% a \textsc{lpeg} that we have to compute dynamically because if depends on the
+% value of~$n$.
+% \begin{macrocode}
+local function gobble(n,code)
+ function concat(acc,new_value)
+ return acc .. new_value
+ end
+ if n==0
+ then return code
+ else
+ return Cf (
+ Cc ( "" ) *
+ ( 1 - P "\r" ) ^ (-n) * C ( ( 1 - P "\r" ) ^ 0 )
+ * ( C ( P "\r" )
+ * ( 1 - P "\r" ) ^ (-n)
+ * C ( ( 1 - P "\r" ) ^ 0 )
+ ) ^ 0 ,
+ concat
+ ) : match ( code )
+ end
+end
+% \end{macrocode}
+%
+%
+%
+% \bigskip
+% The following function |add| will be used in the following \textsc{lpeg}
+% |AutoGobbleLPEG|, |TabsAutoGobbleLPEG| and |EnvGobbleLPEG|.
+% \begin{macrocode}
+local function add(acc,new_value)
+ return acc + new_value
+end
+% \end{macrocode}
+%
+% \bigskip
+% The following \textsc{lpeg} returns as capture the minimal number of spaces at
+% the beginning of the lines of code. The main work is done by two \emph{fold
+% captures} (|lpeg.Cf|), one using |add| and the other (encompassing the
+% previous one) using |math.min| as folding operator.
+% \begin{macrocode}
+local AutoGobbleLPEG =
+ ( space ^ 0 * P "\r" ) ^ -1
+ * Cf (
+ (
+% \end{macrocode}
+% We don't take into account the empty lines (with only spaces).
+% \begin{macrocode}
+ ( P " " ) ^ 0 * P "\r"
+ +
+ Cf ( Cc(0) * ( P " " * Cc(1) ) ^ 0 , add )
+ * ( 1 - P " " ) * ( 1 - P "\r" ) ^ 0 * P "\r"
+ ) ^ 0
+% \end{macrocode}
+% Now for the last line of the Python code...
+% \begin{macrocode}
+ *
+ ( Cf ( Cc(0) * ( P " " * Cc(1) ) ^ 0 , add )
+ * ( 1 - P " " ) * ( 1 - P "\r" ) ^ 0 ) ^ -1 ,
+ math.min
+ )
+% \end{macrocode}
+%
+% \bigskip
+% The following \textsc{lpeg} is similar but works with the indentations.
+% \begin{macrocode}
+local TabsAutoGobbleLPEG =
+ ( space ^ 0 * P "\r" ) ^ -1
+ * Cf (
+ (
+ ( P "\t" ) ^ 0 * P "\r"
+ +
+ Cf ( Cc(0) * ( P "\t" * Cc(1) ) ^ 0 , add )
+ * ( 1 - P "\t" ) * ( 1 - P "\r" ) ^ 0 * P "\r"
+ ) ^ 0
+ *
+ ( Cf ( Cc(0) * ( P "\t" * Cc(1) ) ^ 0 , add )
+ * ( 1 - P "\t" ) * ( 1 - P "\r" ) ^ 0 ) ^ -1 ,
+ math.min
+ )
+% \end{macrocode}
+%
+%
+%
+% \bigskip
+% The following \textsc{lpeg} returns as capture the number of spaces at the
+% last line, that is to say before the |\end{Piton}| (and usually it's also the
+% number of spaces before the corresponding |\begin{Piton}| because that's the
+% traditionnal way to indent in LaTeX). The main work is done by a \emph{fold
+% capture} (|lpeg.Cf|) using the function |add| as folding operator.
+% \begin{macrocode}
+local EnvGobbleLPEG =
+ ( ( 1 - P "\r" ) ^ 0 * P "\r" ) ^ 0
+ * Cf ( Cc(0) * ( P " " * Cc(1) ) ^ 0 , add ) * -1
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+function piton.GobbleParse(language,n,code)
+ if n==-1
+ then n = AutoGobbleLPEG : match(code)
+ else if n==-2
+ then n = EnvGobbleLPEG : match(code)
+ else if n==-3
+ then n = TabsAutoGobbleLPEG : match(code)
+ end
+ end
+ end
+ piton.Parse(language,gobble(n,code))
+end
+% \end{macrocode}
+%
+% \bigskip
+% \subsubsection{To count the number of lines}
+%
+% \medskip
+% \begin{macrocode}
+function piton.CountLines(code)
+ local count = 0
+ for i in code : gmatch ( "\r" ) do count = count + 1 end
+ tex.sprint(
+ luatexbase.catcodetables.expl ,
+ '\\int_set:Nn \\l_@@_nb_lines_int {' .. count .. '}' )
+end
+% \end{macrocode}
+%
+% \begin{macrocode}
+function piton.CountNonEmptyLines(code)
+ local count = 0
+ count =
+ ( Cf ( Cc(0) *
+ (
+ ( P " " ) ^ 0 * P "\r"
+ + ( 1 - P "\r" ) ^ 0 * P "\r" * Cc(1)
+ ) ^ 0
+ * (1 - P "\r" ) ^ 0 ,
+ add
+ ) * -1 ) : match (code)
+ tex.sprint(
+ luatexbase.catcodetables.expl ,
+ '\\int_set:Nn \\l_@@_nb_non_empty_lines_int {' .. count .. '}' )
+end
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+function piton.CountLinesFile(name)
+ local count = 0
+ for line in io.lines(name) do count = count + 1 end
+ tex.sprint(
+ luatexbase.catcodetables.expl ,
+ '\\int_set:Nn \\l_@@_nb_lines_int {' .. count .. '}' )
+end
+% \end{macrocode}
+%
+%
+% \bigskip
+% \begin{macrocode}
+function piton.CountNonEmptyLinesFile(name)
+ local count = 0
+ for line in io.lines(name)
+ do if not ( ( ( P " " ) ^ 0 * -1 ) : match ( line ) )
+ then count = count + 1
+ end
+ end
+ tex.sprint(
+ luatexbase.catcodetables.expl ,
+ '\\int_set:Nn \\l_@@_nb_non_empty_lines_int {' .. count .. '}' )
+end
+% \end{macrocode}
+%
+% \begin{macrocode}
+\end{luacode*}
+% \end{macrocode}
+%
+%
+% \vspace{1cm}
+% \section{History}
+%
+% The successive versions of the file |piton.sty| provided by TeXLive are available on the
+% \textsc{svn} server of TeXLive:\par\nobreak
+%
+% \smallskip
+% {
+% \small
+% \nolinkurl{https://tug.org/svn/texlive/trunk/Master/texmf-dist/tex/lualatex/piton/piton.sty}
+% }
+%
+% % \subsection*{Changes between versions 1.4 and 1.5}
+%
+% New key |numbers-sep|.
+%
+%
+% \subsection*{Changes between versions 1.3 and 1.4}
+%
+% New key |identifiers| in |\PitonOptions|.
+%
+% New command |\PitonStyle|.
+%
+% |background-color| now accepts as value a \emph{list} of colors.
+%
+% \subsection*{Changes between versions 1.2 and 1.3}
+%
+% When the class Beamer is used, the environment |{Piton}| and the command
+% |\PitonInputFile| are ``overlay-aware'' (that is to say, they accept a
+% specification of overlays between angular brackets).
+%
+% New key |prompt-background-color|
+%
+% It's now possible to use the command |\label| to reference a line of code in
+% an environment |{Piton}|.
+%
+% A new command |\|␣ is available in the argument of the command |\piton{...}| to
+% insert a space (otherwise, several spaces are replaced by a single space).
+%
+% \subsection*{Changes between versions 1.1 and 1.2}
+%
+% New keys |break-lines-in-piton| and |break-lines-in-Piton|.
+%
+% New key |show-spaces-in-string| and modification of the key |show-spaces|.
+%
+% When the class \cls{beamer} is used, the environements |{uncoverenv}|,
+% |{onlyenv}|, |{visibleenv}| and |{invisibleenv}|
+%
+%
+% \subsection*{Changes between versions 1.0 and 1.1}
+%
+% The extension \pkg{piton} detects the class \cls{beamer} and activates the
+% commands |\action|, |\alert|, |\invisible|, |\only|, |\uncover| and |\visible|
+% in the environments |{Piton}| when the class \cls{beamer} is used.
+%
+% \subsection*{Changes between versions 0.99 and 1.0}
+%
+% New key |tabs-auto-gobble|.
+%
+% \subsection*{Changes between versions 0.95 and 0.99}
+%
+% New key |break-lines| to allow breaks of the lines of code (and other keys to
+% customize the appearance).
+%
+% \subsection*{Changes between versions 0.9 and 0.95}
+%
+% New key |show-spaces|.
+%
+% The key |left-margin| now accepts the special value |auto|.
+%
+% New key |latex-comment| at load-time and replacement of |##| by |#>|
+%
+% New key |math-comments| at load-time.
+%
+% New keys |first-line| and |last-line| for the command |\InputPitonFile|.
+%
+% \subsection*{Changes between versions 0.8 and 0.9}
+%
+% New key |tab-size|.
+%
+% Integer value for the key |splittable|.
+%
+% \subsection*{Changes between versions 0.7 and 0.8}
+%
+% New keys |footnote| and |footnotehyper| at load-time.
+%
+% New key |left-margin|.
+%
+% \subsection*{Changes between versions 0.6 and 0.7}
+%
+% New keys |resume|, |splittable| and |background-color| in |\PitonOptions|.
+%
+% The file |piton.lua| has been embedded in the file |piton.sty|. That means
+% that the extension \pkg{piton} is now entirely contained in the file |piton.sty|.
+%
+%
+%
+% \tableofcontents
+%
+% \end{document}
+%
+%
+% Local Variables:
+% TeX-fold-mode: t
+% TeX-fold-preserve-comments: nil
+% flyspell-mode: nil
+% fill-column: 80
+% End:
+
+
+
+
+
+
diff --git a/macros/luatex/latex/piton/piton.pdf b/macros/luatex/latex/piton/piton.pdf
index 3697dd93ed..e573842f13 100644
--- a/macros/luatex/latex/piton/piton.pdf
+++ b/macros/luatex/latex/piton/piton.pdf
@@ -389,19 +389,27 @@ endobj
<< /S /GoTo /D [ 225 0 R /FitBH 771.02165 ] >>
endobj
230 0 obj
-<< /Filter /FlateDecode /Length 3399 >>
-stream
-xڽˎ#>_YC7 ,)l !
-Ӂs8Er\|NG0xL8O?jCaJ
-kg#ayΜ7͔ψCtˤ aHIƎиv-`iIHGtzN#HpbaҖJ[9#
-l&*򠆙R9؂#\i<:*]{_!T
-L}%P8C[LYUt(kH%щMQ4"fND>WH|'l<IB?^>R#>wtie@mY7˗eP1 9"N(2)ew.QLЁbƉi|AMbҡǦAF2/sc$N5?jxsM5ʜ.~>küNw)p oA89toDc0jc1F r $p=Fc\*s$e'k)d >bȂ;;zU-H
-Np (iT- 0b,s!|41&, zˉIh`dCE/{R6(Q#ĤQ ZDֽ$V'bt;(ִ%lT1X|M wy,ӏ0a7B>npZ"w;9lG7f
-w`8T7:1%]u7nL`Կb'yTM
-rڔ b>cJW`ͭ2Icvw{fg(K&d&fvQWm\{ Q< -T9D4KNL8Uwh(.y'\M2d 0+ZMb5!ېRڛ(a>ȌCp]v"9wS;̥2;
-cY6Wُ{s_ {ԷEۤK"/,Mqi./UY<bN2o{˓:r'|Mw1iG)BڹVX>sɽ}LKy}0e܂s`I&-[ɀ1fpruh+e|ھՆL7r+<phy>矹 #.FT?/
-q5FÊ5fpʈT26 e{h(("o!GS)mEa+݄KTڂzE#@S?RQvtlrl$6~fmpC71e~L oo&6F()&vfF45c"մYhcY#>ƲۄєB x\I-]+*l?3FS8vIJR,5yj}}{rOV磘foT.(ZnHCg:T|q]0 n][f5F8T1P2/PU8lsSݨp\U/ﭰ
-q
+<< /Filter /FlateDecode /Length 3404 >>
+stream
+xڽˎ#>_YC7 ,)l !
+l6*򠊙R9؃#\i<:j]\!T
+L}%P8C[LYUt(kH%ё_M Q4G͜S|7Nx>%J} G| ʈ4]*zhzh._"aZ@;ĀpR8GIш,3StFMЁbƉiAMbҡǦAF2/sc$N5/jxsM5ʜn~>küNw)p oA89|oDc0jc1N r $p=F\*s$e'k)d >bȂ;;zU-H
+Np (iT- 0b,s!|41&, zˉIh`dCE/{R6(Q#ĤQ ZDֽ$V7bt_;(ִ%lT1X2|O wy,ԏ0a7B>npZ"w;9lG7f
+w`8T7:1%]_u7nL`Կb'yTM
+vOZ2ށ&a.wU
+<MrOC0ꀇ*pթiS. ebIS8ㄐ;Iƒ,U`wE_VI &d҂BJ{e^3Lq(N¢NX$njv 3Zr 5Nd2-HUK'Zf@#UvTnMN08O?_Ս" ½$Vv~s
+)~&UܤFŃ؃Ӷg:SjHۼ9*S8|&֠KΚlհ{HSI=[7
+5uHF*\Qty뒩xJQ
+;Й#l
+.)$Y8U:
+ۈ=>5J)>>];|O5=# Ԟ=H-Ga0&2s߃ur|Ϛxt)q[䅥id>=ej"GIaoyRVW>?
+kξ$CM,}zd(g租~7뇠-c?/
+cǻ.}K2f 6+T>~HA:|Ԙߣrb:Az|TAvF{ppRj5>mֽK3Ω}#' M?`2p{˵CRT i'i]DkEMSJeq u$E:sfM& F 8*VxI7X>I55hzV:^NW2%[ԆnyӣdW𘒖>ޔŽِ%h7lFKGP Qfɩa{dMX!hXqt́xnRJT&ܦLx eV"$1hj[y#%ڢ;l%4TZ@[P[yGj>:|zMnQ> Fۯ ޾3n&~; $Ҙ"NFftLV8 mw_5k\Xv08R!-ݽkeR14c`HrJ5.IPJ|&Oo/=bO)|MʥeV\yhUG8&k#g
+5J>E
+SrmbUp20`iSme] _(#U{OMde蠜(
+vs[;O:
+,=Z8^1C4u"L6FjWmS0ې,:ƽ6-vˈNfwLn%8Zr>~5:W~Z.'q~iM+` ,aR57mqKݒalwP4C`Q.-6*OEm"x</‘bƹԷH 3
+q!
endstream
endobj
225 0 obj
@@ -619,26 +627,22 @@ endobj
<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F15 242 0 R /F74 245 0 R /F22 271 0 R /F79 270 0 R /F65 243 0 R /F81 294 0 R /F16 244 0 R /F82 295 0 R /F71 255 0 R /F53 253 0 R /F59 254 0 R /F73 258 0 R >> /ProcSet [ /PDF /Text ] >>
endobj
306 0 obj
-<< /Filter /FlateDecode /Length 4795 >>
+<< /Filter /FlateDecode /Length 4786 >>
stream
xڵ\I%qx! (5%@:YyH`|5,
2 er@=ÿO?0I0J3
->++p{E)C!h!DnFxhwN.p\ڙH HL$`Lԯ$0)4L*/7' )@? n8ʉԛyc} Fm =87!x={֏ZNaʘq϶fW[HN=H(
-h"DV],,Q߆Qc5c0J))`NͷaYf9QIᤃYflw<_K>Dh{xuJbVTU/O`s \'1x7'}W#}:(\;wRN0pqׇQPÙW'S%Ø ~~1P(ZsWR0ۚ .nG7ǚ}PcH[2znmctu%/yXP#%wB^9TXC$.o=(Ǘ-AO;9O*4>3Q~ԝ`"\L2ԏq!U,6,dMQ/D
-V'Plgeה|Hj|
-O}ԔWMEW;+SeLuV.hTFOPp3r3?iԋֺT2~ie,Wv9_ՠӓ4렼E?O(ոulKW3 nΆby~C{c'$JY/
-֙v/0'קC_T`fL~|ʒzvxv2d!5^mTڽR-.=Fav4LrvYCYe;!<<+(z%-3x5%RJGݮtNˬ"yo%)1J?EzB-[Oh \S˹[sŠ>;.vu
-leސ6waߗ'Ǩ \|1oύ]$O֙AM/'sh8OO/Rz%I4hp Z6\+3Cʍ"ʬl|[
-o In]2lZgsqIN+6xwNRذfS&銰z' Lcӕ{߾ukC2z:dblwF9_HuQE1m'B0dDim
-ԺX{[Vl,>wrd`X鬖d$y
-7EJʯt 3O9 a<FU_tN>tګÚOTְ1nC>/cޯP'S'86FXqlƵuy2襡ZQeRRe(f<(w:Ya3ųz;>Ȝ$N<eq
-لzQFj:gD|H4-jl -6NYU5(ՆJXb6\>m-)>kP_-+Dhi]swk6{T6({@~=J,]К)WԨݜoB4+S2C}~cyC#WK^ReWVq?54*x\WC
-В$_
-FזCpzJHb(֊gV3K*~ g)ԯ|w[~G"$U"RҰkq㫟!huP2@Úir6svt ՒQӭ*)ί@&N8d ڮ m(G9.ʥl\SŶZu'x}6tK";1}^t#5OE!m3Du7 2+}jmkGگ"1Kxj }{va
-׵ 6NeeȊ;}GUU%pr]
-5g.=bl0%yyK7xCARa[5$-?tW Q@@icXe\xnJDlJkYPX ]&5ʛ aGk;B8fI))|4ED[|L ÐGO׵Ol?[X>GMx~dNXW^acmpe7\֛m7%+\S_C;9rl5I+-mۥi>:B]Mefibı6߷Z<hEBT?o[
-A8ze==X)9zb4KP0~ abi0.2'\6%Uë+nՕزD`ls+FBt mFTG_bjo,Y󖪅bmIIvb,OJ‹T\[ūzi[oԅw oiDfAuVZm, {OP#OC '&B4Dl+0rw/c"&xjWoH= M6vg
-ä=(TL'v=G^Z
+>++p{E)C!h!DnFxhwN.p\ڙH HL$`<
+Q""Ğz%+٨[Rw^*1oyEmCoW9A]tO,0 u U սめ-K+%\Oۯe_-lE|x<LOfz|[m&c̢݊#m,bWWl{,1L0T$Bf,6^ bF;j~׹ӑKk-L9Q0kwG:5!޻)"YE*/!.g0O*ΥO&6~IדFBO G9;$SWRG;~Kc8{BHZ0zV:-n@J2<Ÿ.:LV{MW7sytm_Պ|o4c!3鉾]"p $sZMRGp |ƺAewar1`LXV2n95:Jzp dHh#2M֭c}bzS
+}<h}8I1받nX x'ZyӰ!JhwXy/?O|/(I#?O$~xϿ<]&$Ip:B %|u 9Mgr=:H26<*?~#) my sIzk|k$7gH,A'3#Y] +0эD/gz?g*) ?._c} t_/iO;[QA\̊{u4"}y?R8_ASd}
+¼F]D=Tu-'v.{)-9YaEN:6ywoj\ݰ˓cԿV.ΎFծ['Ǡ&ٗ\ؓVR94x) Qϊs4 VsWo}] b~! FzeV6s
+'IPkF|/yɳNJH&KttMݫ#@0r6kO.FfCR UQ!50 ;T*([#U\ZsZ$k LI6y9
+Rr_ +L@K|)_[kE3+]p3L{>{_J{tN*)iX浸OI:(IďV `aщ49jI^ըVBWJ@bz Mar'OmWA6f
+aVULZ{ R|YQq.bRT>%̝VH_ʉ}TRRx㧢ȶ~A~ׅNyO>X5@ж#W%VM<5^Dξr; z0ZB22~dEG>=ݪ8VUXd#tUS.#dh߾K?ttHziDj*V;̤$UIty6mƀS;BbhVjʾOsIvgfɎp]qo_L{;x~]>M0M"_gL}/fE'1P+,^\
+wOyƚϋ+* fVh'ݳ[4GUk 4w6ns
+rr\9f4<~Э;t$֚<Aɐ$lUܙ
++Lu`J ^4α?
+,2fb.<c7uP"EM6ٵ,j(,.j
+ TNMذ5OYof!Gp>"G"I-l>A?a#ħZbt6-,#&]?0'^+ 6VT.ZͶ֛E)/_gͤRxuyReq4ăU*o41w _FxO4"NEh!㟿7{έ\O 2O=1ʥlŨ0c1ŴL meO.~p *Jl|\"Z0F#G!:Tq6#*k/1 ilK_kzf}~^,}yKB${;D l'%a*.T-MU7P;Cw4}"gBBKwWIVF6'('ȡ_!W"KyiR;SDt1<t5ͫV$g&icf|7f{"ky{{DCu*.4/o_knb{aY*&WA;|6w#
endstream
endobj
305 0 obj
@@ -830,17 +834,19 @@ endobj
<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F74 245 0 R /F75 246 0 R /F77 247 0 R /F30 249 0 R /F66 251 0 R /F22 271 0 R /F15 242 0 R /F65 243 0 R >> /ProcSet [ /PDF /Text ] >>
endobj
345 0 obj
-<< /Filter /FlateDecode /Length 3634 >>
+<< /Filter /FlateDecode /Length 3588 >>
stream
-x\I\ ?- \]&$})A\C-*ȡUzQ#g~/__/ܭx4pNj ".3e/ƍ||ssssÏ$Z"-W0ڗW~3suǏ|{*(l#iF x}jo hAfܛ#VS.}iqʷLӝR嫆F<x5F< ƻe3 $e,aʙQH [q˽
-%ƻc`9SOpK򗯁NͼUń t3\:!$xNBm\"Lnq$FI(0k 7 ;(r`'w# $oˣ[E[tyG:P^ 9.Azs=JZ3pBi;?L41ZRBOȘC^ACS8${"Yv#)KqI>C첓j`)^L6
-܎L%"X$7z\i!Gy]fq$y\aLh(
-u)<ꯂnz9R W )J )pb?mV@3/L !
-qQL'3Nt$bmYY SO/#wR+ d[K(GI/jGİ.6PD\*}- 3C̸uT"}x<5dIyju= Mt*<*V6̃d
-SPLIL
-Բs#Q #* qrrT [@I4L1}ZLpݵ6?ՠ"l&V5-jh
-h2{#Eibݧ=AKh xfjzЀ?)ޝ0.2#-nk)H@bM6^tݻ%g
-ZazZ
+x[ɎW4KpT*ɶn9l%R% >ԝK0 _˗׷__<F|Ǜ".3e/ƍ|v#?sk߯e %aV>]ߕWqTB-#A-/Y5wu$pW~Hw|GZf5KaT+a\|斞 W<Ot͔7F2R)gF#͆Hh~gspÌ( [m̠dvvY˳;Q͢dj-<H~}͛@at_z'i~>$^EM1l@Y za:Yq*qJMhReʠx|t =ge3N޶99VOMS9L.fY,1RHCJP2o [';mR*+3)Bl&4my23AiBEƹj~c[x]P8 @kb 0
+
+'C;GpN4-.w=f{ҕu0s4h|'Q\F LdrUAGk FPyc&pSfx \7ʃ (DM`He$]t\O>>@gFc+j>r);M~+´"i 3Ny9-3Q|@I.+ BRԴL| nh`ޙs@
+.&{7x%x#`%:dN#}a(I{Gխ\ښbܛtyG:RXYϻ^ D@gh]on\E8
+/&tI3 G[7nRd=J3>n-*9J6񬰱fUGvnxH<胄9`FRKWKYLxYN'3M^tȁ$rQ}Y
+"9^[B2t'
+HŶGMЎS\G°xMwKB߻6EW'u7*dĭo{6,%Vζ靎W+ϗ
+MF3X.Lb BthhR67\vLFn8Ov`)D?j}!-0u\9s8
+էzieYsnD u !kzNI8l_9XޛBQqL߾;^;zAƇ.B<./q{6k"y,x|V_(yKgH*rFDv;$vbZ7 WaPrޢ Ż=RTaT
+Rs&3_n<N4@^@Nkn&M?RLbN([O3X;-ȭUm>Ƞw4
+݋"~‘~2 `W&ޘTa(y(Fv@ `YM#@SX[$i?|H|EgnɳSS䈴03Mو[)?ZV6[˳ #zQgIx=&@ ړB;&,G?`mdݱAFݱ5Oo#0v@Me8U i!iFev@̗_ em1XYkD7# )'xhjhWs b} 
endstream
endobj
344 0 obj
@@ -874,32 +880,32 @@ endobj
<< /D [ 344 0 R /XYZ 79.37 445.014 null ] >>
endobj
347 0 obj
-<< /D [ 344 0 R /XYZ 93.716 147.579 null ] >>
+<< /D [ 344 0 R /XYZ 93.716 204.477 null ] >>
endobj
348 0 obj
-<< /D [ 344 0 R /XYZ 93.716 128.487 null ] >>
+<< /D [ 344 0 R /XYZ 93.716 185.386 null ] >>
endobj
349 0 obj
-<< /D [ 344 0 R /XYZ 93.716 109.395 null ] >>
+<< /D [ 344 0 R /XYZ 93.716 166.294 null ] >>
endobj
350 0 obj
-<< /D [ 344 0 R /XYZ 93.716 90.244 null ] >>
+<< /D [ 344 0 R /XYZ 93.716 147.142 null ] >>
endobj
343 0 obj
-<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F79 270 0 R /F15 242 0 R /F74 245 0 R /F64 241 0 R /F16 244 0 R /F65 243 0 R /F22 271 0 R /F82 295 0 R /F71 255 0 R /F53 253 0 R /F73 258 0 R /F59 254 0 R >> /ProcSet [ /PDF /Text ] >>
+<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F79 270 0 R /F15 242 0 R /F74 245 0 R /F64 241 0 R /F16 244 0 R /F65 243 0 R /F22 271 0 R /F71 255 0 R /F53 253 0 R /F73 258 0 R /F59 254 0 R >> /ProcSet [ /PDF /Text ] >>
endobj
354 0 obj
-<< /Filter /FlateDecode /Length 2665 >>
+<< /Filter /FlateDecode /Length 2594 >>
stream
-xڽZͮ )Q$R@p8 nE[J%F3-3>*Vm/_#\JcSnK
-.ߵ3ZEϤҧ:5_8z|s+Iy,d8Dz!˧k@n@O9تy-
-|Uqt~2𳫽7_oϙ쉹\LWP ez?&U *GƿiіK0A6*둥_,x&+y*+_)LVyyLU]Gv7hTd:kqw,\8۝4@kʣ]ۍOe؝ը.Uơn;nk
-cY3u#eTDZm|%`xς˖?iuvʄX]yJhzAZ\f)tJϺ4z Age?nInܬ `C g̟fqYav
-*9U6lVmvF^iP[*>@*0qA"S|gPnM<$0Hfi9
-h⬑PK4N6nL ECf /TU~_ ؗu Z.u)Y\}_ +4;iߛКHD83T6!ܧz_"3B߳JBʊ!4H5;}kw<|:^+GFrGP2`[|ʧ%?<V~jYpC۝F?)x,Q{3δ3ri"
-)2CxYt7KbRFn8Bm,簶ת2ykM*}\ڔ{;hr)-vJ[Jį<6yU58 =I|w{9YҴ7XyaY*+BW5Z*X760~TM;N:035Zь*؞8X]Ig뭙֨3k|m7D-j!<E7sU+>>u'_d%+*"O:Cr{KW)6h:ONѵ֦pIcN_ Fоh8n_5q%FS *{p<TĵNȞshJl̼A%~liH]k.eN_ϋiظ[?_Z*ǒv/AZGaxW`s(7is QbE3[7߆{睼C6) 8w$mK)CļZk?F\3eF ?0ݪWL3# ٺ3iYLK~d&;ʴbb^ªW%;fEj|W ¿E
-~ߋ)Rƌ풖з- ՞xK݆ _{HNre8h 3$ݠ`]|W<xUq"vX8t%zdiCѭIõ-f?&gAG]9fI#o2cr+Kowc,@s M+y"yoal)Sׯ*ج5BZ8LvD &h| 1R|M q,+W6NPÌ-op]uM1"c2t;BӦt-dFm|5uGu9֌<5cg -ȼ|u^*bΞVrCbQ}*.FlϤ+ Q0%w44>p߹;񓄿,%p}0 
-Np Nk}Q܊+<r946PC19]<'2(A, 3qX2lS+.Ql-W9*g {ck^4\@>0t9lK g0ov*9%Arl3Jn3 t󘹴@s;GP&1wB,2N@2b<Uq
+xڽ[ˎ+FVd]moSdj6%M\IzT-"r=%_.SN]~7)]J*IiS~w Rw 4K,ׯ|JB7Jsw]h&^'ɚd[Q()ze齤A`=٣5\(k⊯>gm%
+i%/IC,Q5)6!5gvE2+NuҚI)
+GĻBi TLI?ڦPweiMo1Y5S 0jS2K;{8s( yRެ !n}d`wESd~Uާt}
+;{ctܾ :#p,'3fk]ٙXr__:eAk1Pg귭L%1[*pD ͨU|I+sFi/|JKGyLǛ-}&hr (l,Q>P^ȅV" Ư2/
+l#D'BenmEWnLрeB*>O~=T~k6ڡ;%=>f͞g JTny
+
+E3ߏ8z6Ehoe~Us&vC64|9EQ0TUz_%f0.kFX~s }uk}u?alhEOh~@ۀ~@(@HBN@[GڶXilX
+ROFO#ցp%h6i%,kz߾F8 :v 瓣#~܄\w,bd=5O{<1~Z؟*w@quUv wRi/栜uP<-ו 꼯 Q;LNuMKL8&<(Ly<1GQt|Wmd0)pۦۈ-L:u+<0gYuAz+@o55P[c1ȿkPLF8.!Bg
+~5̧\ $6QB>9ͥ"~p櫥ԦԪUrvFҋz@ZS|:W[#oMI|r+ݱFuLWOHdK^ 0Ydt/kd$  W v2Z@%HlZўفL#<0RNpqhscxpObj8ijW:KO"ȧ=ZwIސY*ԟCT*f1?)Ef칼q"?gt86MH4 5_W*H4QF#hU֌g"h#i ,QYƟJskFƖٳtul!s'2'ڐMdJ|?spLB;Q{VLL֌A_<:6KrV<uq~a]M >"E>xލ}GGr_
endstream
endobj
353 0 obj
@@ -909,23 +915,35 @@ endobj
<< /D [ 353 0 R /XYZ 78.37 808.885 null ] >>
endobj
77 0 obj
-<< /D [ 353 0 R /XYZ 79.37 633.034 null ] >>
+<< /D [ 353 0 R /XYZ 79.37 559.897 null ] >>
endobj
352 0 obj
<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F82 295 0 R /F15 242 0 R /F74 245 0 R /F22 271 0 R /F65 243 0 R /F79 270 0 R >> /ProcSet [ /PDF /Text ] >>
endobj
360 0 obj
-<< /Filter /FlateDecode /Length 3241 >>
-stream
-x[9cW(4:h5f'[ldÛx ؉);PKM=V_ |t駻Ƌ)%? _8&h.r.9!%ߤw񙆯i\s?EGoȍ$qo_\sHyLk5/=+DQ+ a@hDHHQHUߢ7{{Z
--ʺ&ņ5+6,⽁yKÉF&9Gx@!J=R(&6$RUTDxa+(eVFrfn( É!zÞ2t9sK
-1IHAէn|/ΙTE.sQX5~|jNq-S,eX#M+"X+(Lr76eOϖᱼ=1H4ڑob.#eB\i _.g $}.=# T ECQ@^;
-5"-Y{%k?zSiY'D!U %/ 5+ٛ`sqКg
- :+jß c. Wo
-t&)r  nөB2zfeeц&O*P=Br碳~󥜅9#;N^ O}+H0fa}_l;;FrS$4>wxކ'VFK 5rǃ`^]EA&\wSP7]n?
-a! '#rxz-L{KRcl<|*R-դҒ~ޮC6]mYJEvIrvgV-uFlI9+ ,v\AIc('*5eBP18D wc~F%{Ȩ0j\YExX*ۺ7Uz/:RZi9Qk9>ryrNW^Btʱw`15P1 gq% qC(#
-xl{Kk gI-rzcs b[z}
--ƻJl(4U<ܛ>|k,$qV?q$ hLS-`W@(|=m'L<AEXzMIܙg6pNF}<Z|? +ߑԖi{OF/ƒ(C_>)93gX#绚{^oktWbh"'DԌ5-*t09t8d$В1ɑS7"JVőO8s.$`vUe83Rk㞜ZD{U5H/r'r:S~^yfrIOndKn.heLû=zlBN>OMLJ6pucOyB? [<!pv1o۲4zwYk{Yӕ9+1}~ʪ3'zg׻1ܭǜoSiSS[{ =+2`YY σFNik02KgYMJHTN,A'J &OIQ
+<< /Filter /FlateDecode /Length 3427 >>
+stream
+x\;# W(jjNWuͮ.˗x]e'MTwkVgڑ^앗.ӧO?\|'rgAH .Ii.%|3IW*0qU)MJ}- 'q>fC8Hi$ d2= ~xvz3: "U(`)+3Њ
+lDVk1lx)mJF%TJ1a+Y-Pty
+:NJ v g|'~qb Yő~_`
+'_`^
+Pg6Q|I#
+G
+=;{ȟq
+a9d\+Cn+gXas.;kT
+_]mMmk}*j,Y5Вٚ?↶-a0!3qݘJXP!3[56}ky[&QYz0:Ո喗`)0Ɲ246=Ya#]B{<S}*^C?ir8ߝn%3.[&}Ĩ>ֆn޺!U<ch &De#̦<fVylb| [lB:G~ߘX$o#ح")̤N.v)PD(XL~p,\!ineQ_{RO[FZM`;%rj-- nD6r 1(GྪE+zuXYjEӕ'|2z_,p l|‚]/FjFaKk
+ڱ)钧01QcaY*S*vnoeRfa
+`^풿H"fL( .CT<,A/*J*JڱRUHb gIaۮյ+^:OaӓtA1(ŵ"t-"WҮ!&\6[aC{N:<K<Gtl[3@3M҅ZYqg*+~m<ßCtH^flm HaW
+
+,-{-e=r'%OON
+܍pEB;X[(hST&JPAfV\ 'y-:OWF7=p<#a̴<Ƴ9pLJ
+TM+ J134&\V\/;/\ҿhݓ]̀pԶ /aڝ5fIz(,0k+}(GⳟGD^ 5}Lsj
+j8_C.s-!,Ӱ~jmtUmK唳 .НvxnUX[g-++X"531thDКԸM!y gP#
+OᔝE+ ԻgNciu}+ը3`Vg_\i̦mSXJGJc`ƣ#F7eLtZ l\Vh6±wY%W {FB_761᧟*_)[:HM}k7H>C*+u]hi07*3TD'꾮̩m.w8}ϥ)!;b\[,KPt`m
+%5@VИMm,&F0-S$Uz. |htѥg
+E>ZqwPPDD/^(kHg*v9^goN9Q"+_pxEY .j{[ zϬEO!a#ɦTر|t
+!ř_Z y/'oF<l`ׇR-AO+[LW^Y;)=jBF8hhpˊI-=e]'9f\o|>|ڝ{O:#ynaqtSپz[
+]awMj D.:,^W1~D@鄋/x3oa|/xw|Ok,W>jB5yM˭m~ASa}ո؍&:MAO7j ^Y}|jDOL=qAo~>?/IO~B_>)bDp.t
endstream
endobj
359 0 obj
@@ -935,25 +953,25 @@ endobj
[ 357 0 R ]
endobj
357 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 249.572 591.547 259.999 603.997 ]/A << /S /GoTo /D (Hfootnote.15) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 249.572 551.689 259.999 564.139 ]/A << /S /GoTo /D (Hfootnote.15) >> >>
endobj
361 0 obj
<< /D [ 359 0 R /XYZ 78.37 808.885 null ] >>
endobj
81 0 obj
-<< /D [ 359 0 R /XYZ 79.37 771.024 null ] >>
+<< /D [ 359 0 R /XYZ 79.37 732.66 null ] >>
endobj
85 0 obj
-<< /D [ 359 0 R /XYZ 79.37 752.217 null ] >>
+<< /D [ 359 0 R /XYZ 79.37 712.359 null ] >>
endobj
89 0 obj
-<< /D [ 359 0 R /XYZ 79.37 578.588 null ] >>
+<< /D [ 359 0 R /XYZ 79.37 538.73 null ] >>
endobj
362 0 obj
-<< /D [ 359 0 R /XYZ 93.716 168.567 null ] >>
+<< /D [ 359 0 R /XYZ 93.716 128.709 null ] >>
endobj
358 0 obj
-<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F64 241 0 R /F22 271 0 R /F15 242 0 R /F74 245 0 R /F30 249 0 R /F16 244 0 R /F65 243 0 R /F71 255 0 R /F53 253 0 R /F73 258 0 R /F59 254 0 R /F72 257 0 R >> /ProcSet [ /PDF /Text ] >>
+<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F15 242 0 R /F74 245 0 R /F64 241 0 R /F22 271 0 R /F30 249 0 R /F16 244 0 R /F65 243 0 R /F71 255 0 R /F53 253 0 R /F73 258 0 R /F59 254 0 R /F72 257 0 R >> /ProcSet [ /PDF /Text ] >>
endobj
368 0 obj
<< /Filter /FlateDecode /Length 4388 >>
@@ -2133,17 +2151,17 @@ endobj
<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F15 242 0 R /F74 245 0 R /F59 254 0 R /F82 295 0 R >> /ProcSet [ /PDF /Text ] >>
endobj
690 0 obj
-<< /Filter /FlateDecode /Length 2366 >>
+<< /Filter /FlateDecode /Length 2430 >>
stream
-xZn6 )H
-PЏ{D
-^] IIx5h8VF=0_B"3Ql8p )j(`
+x[n8++zATj`5f;ߎ^ԃvU4mH鏧ӯ )`T| O@wrV i?_FJs 6RwR˵xEH3z&:R: I
+T53E
+aޜFaI)](@B.N>ǢA<]DQ|I*Dzmt1PR&'= D26ـ!dU~9PMg} U̺-G@XNI'PG,(Űcb(+q%9v̶ }eUi#=F[fwUWR87>dKo}{&4u)HN3Ć <Xn<
P8
- JRa})/<7?H0O缱g/P@v^ n~n1F?*s;]YDhkR}wINo+0"Gg|E7`z/6XX>hSlJ\Ӝi<yqϽ߶(\*z\(ǥ{vzeNcY
-]t/Fl^"I]W&&Zؙ栝:4"so(g|ˑXl~/}1ZDq3J.˚i,1Xɬ@#s+66-ʞ*xE\͡]Կ&#nydGXRM<29\19Dv%|5DNnOh-\,dlxȺ4)/,:4
-dk^Qx+vtW]u6EQ-,l/hNEE%ߗU`fuĬuX/ѡ[}EHf1BT܌X`ڈ GD_'FQ8j&
-H#~\]y8)P)n4`DY̊k2x-1 ެ8C:kgWn C9`1Z\Ym ۰QD6RU8\X8nva_X[7zF*˝F;ʸm9Yj!.4.O*N|+$2TXKPYH[%sKDn)IAMZT2i?'B^Sx[5 qqEWYamg;"}ZJXb $T6V2V}S6o1l"8%tQPO,8oq}US-7imKSR4Vfړwdp}+)G>Kk d2ˎS"26
-7vѬQ?]7<pw۝&Wn@S40A_eM=5Ϛc&q`䘷Wp>N#2_jT31VmN2dd>}{eXn Qǜ);ʵR_aZmK!WqoF*(;:$z> a'Nal,3 @SoRۣxyzՀ>{==}qѥX*!^i:YFkl~FBZOL36e/aLV+*s2%6TNVkǛ;hP'|^Ak!T w glBCddIWp%>$6z*C9V*צ4CZy$j9^AYqPXGZZI\zZ5d>=PɄU"+rn0p*9i"#:({'92/xf3*C=(;.^Wcb `/cPϱ̑Z1%;(a,s1aK1IeFB`f<R}UPl̝3JAӱ~U}K/x]PN*Q軉{Y:EtΒ]3VXgV s"(Yd"rhNN,ZEc(}+s}+lRzDk n:U 7݃)c3PZi\ɯ mZI_z0JK@q)pKG/,T7f|r ߼}#;54`(m~/pM,BLzs
+LJRac)/<7|$k3/P@v\^ n~m1f?(s=]YDh˘R}RWރW`D ώNNjho^`Nbe|zצ$z6gٽӜi<4B~|ݢpu#QKlz?eNc,Pv݋-HRוv9蠇Fel9NWFa3lHyn,6-r L\
+کAEI]+/`8\7I'YF╝IJq32`U
+ؤ;/G2>]hvʹ'x7 ^j)W0RX|A:dؗEHel]ml:=LYnx;MjzW4X0AdM5Ϛcq`>o[|ؐ#\"G e ը2gb*d(zc3a=»&K8{FibLQ.C{2n[
+G+4RqFD:$|Iec4FO3 @SqlRۣx}zӀ>{==c2bAWmzviAHVi٦=)jZePѴĦg
+~~Z)7􄱞WPVԠf(}[>P=YrҼ)1\w=I^(bGPX+p`ikS~'j9^AYqPXGRZ㮗I=k2˜(dBZO*97usP 4GgFn죌~FY z>A3dx(˫PN pc(sVLI>,J*m,Zx(wa0ťX23B`f>R}UP* 3@%Y;g(0'ӱ~U}Kw]PN*ğQ軉{":g.3VXg6 k"(Yd"rj.Nm,ZEc(?}+s}:*lRzFk n:U }4݃a; 1S.bgҸ+ڲF 1b#`Yߧ"Rࢗ(C_T7fr ߼ ;Y5n`(m(pM,BLzk
endstream
endobj
689 0 obj
@@ -3420,7 +3438,7 @@ endobj
<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F59 254 0 R /F82 295 0 R /F15 242 0 R /F74 245 0 R >> /ProcSet [ /PDF /Text ] >>
endobj
1091 0 obj
-<< /Filter /FlateDecode /Length 2390 >>
+<< /Filter /FlateDecode /Length 2393 >>
stream
x[r#+M3eMĬqwV$% ^ȒKUo?u?^8SI1^Di&>Y#7?͹}{/`:yr0-E*+^[@sι-uyBxw'/gLMNs&&w^\&'%{z I*')L̵J_g`^i
7%KG0&cM]UD!n|o\ƨ5\w`
@@ -3432,10 +3450,8 @@ PԜҊ7s4:T Z-l^qfTlXGY0<EbD@#j2Szm@LqMQk(}
4S'$ N(_:}FUWw;GEeWwODgW|91O C7}p_=7hAGl0TIK]},rrW<p%FN8%Y5L)GG& zT
CGuBDMIJd)i8|tt#d4 ַl+
AHZFQ5v)MGVaV6v6IgC"XJ6V|=B;͇|X-A`+G,2fT35yd[aSǾK -p0!F(Eg Ye}
-@}<߅TI(JjC^+CܬYd?[sE[fH<ߴ 厢<5HfH<&ԞPĵ4;Ŗ"͟}^Gy~|d!Evc:\ALtIɦEAE)?sfxҵYHncZLP]08鴼IO.Mj0 aYkZ<2gaP-"AyB cjEXGy$f^9fI -UIUwA
-|$FQw{|~~*ŠX.<
-:2!pJ"z(ɪi'%G^*XԜޒ_;)e `
-TPAE߸[e{RUJ_x$@0%xQ4[aaSC!9Sn>B1{ˇE&AH?6~Ź;=\Qώ8EkR0@ܪ>#JSw 35zC%ԃ\0#b61)UsIC"QW"#a]!?$7}mN3T L
+@}<߅TI(JjC^+CܬYd?[sE[fH<ߴ 厢<5HfH<&ԞPĵ4;Ŗ"͟}^Gy~|d!Evc:\ALtIɦk(mѢSc~yt~7<)d,MAPm08괼O.Mn0 aYZ<aB 1a^AaM :h`qmGl:w Sc1~dm s~tDV)B|fHq"P;*lڣ\H&p^cG Ⱦ5D=L{p$Sʺ‡"3"Jևxz
+ܗԃ)RQOPBI79~OJW)U
endstream
endobj
1090 0 obj
@@ -8005,13 +8021,19 @@ endobj
<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F15 242 0 R /F59 254 0 R /F82 295 0 R /F81 294 0 R /F74 245 0 R /F79 270 0 R /F22 271 0 R >> /ProcSet [ /PDF /Text ] >>
endobj
2489 0 obj
-<< /Filter /FlateDecode /Length 2097 >>
+<< /Filter /FlateDecode /Length 1745 >>
stream
-xZn$+(ܶ;@oCJbIUm{0<⛇*kN;iݏK'T) IAy<o_Z;ZIZoi#68)q/Zåt2} :e`+P:ClڿTt3|ށ\ᩜ B~=cP}\Y߃KQYTDv,ˆJFg>McQ=
-QShlIFlŗc4;ɁA mp;uMn7;0Vou(sKO7z\3m6ezI&,*op&ޖ^
- 1g2X_լj5;9^nv΁8{RvOkje/}mjU}-g߉.{]婷'NHI$Ĵ/eS/ HQot:a߭a;cm1)KD3vCh kl}KODIvjcOOQř{D5OuAApS1H̲Ca~;4;M=Ў{z5nQQE]"A=SM+^)zn/MqـtD6Y6$˾DҷEK0nwa4 F|{w{)VU":y;17
-~aXW|u 6(%vR3KM1I<Z tdtJР1Zh/&V1ZM)i^ +Ⱦg_^0xh:Ly[wq*c
-_ua;
+xZn9+*!@`3ktlJn*V
+sbˈ3 ӷC
+u+(Ws=uܚ{
+^h6S#u8uF0I"U6tj+t@i) lpf0i}f
+.l6Px]fF-#/[8i;;$%r:ћHMr4)tuW(#tB9葘p;/.16+})^}c10a.W I mpArt%u~MtS>~:b\ w6[jǡ'\`Y%+` kpf3%l#Ԯ{c,
+/P ?%P m`6jsvrUeJuH?y[c^RhطQڵC5yB}(oXOFV-O?v,XEzXo4*þM!F@w[~Vl!=7n=O/zl=ݝI20h'9,@Cz6AC?uH?'j"Ԟ83: us:HmOftht%ge?Sm+P ^F J-R첗R
+&TFV"_0YtDPh #,Q0 REtJ tH[Ucq9ݟZ cNS@Ud:w|d۸RTmW8
+)OXXUM1nPd@iHì͸6L,!;R6xΥ1gK3+ɬuky}Zizsė|ĭ.B%j96>%`JcX]Y`}uyJeBqLJ!.¥t
+uL.&C)BmeT/םk+ڮ!Xk\Δ
+Q1rS7Zʊ*kЍA$_ȁԫ?w`@BG_jˡLZRXFK}"W
+rfpˑAO3
endstream
endobj
2488 0 obj
@@ -8129,263 +8151,261 @@ endobj
<< /D [ 2488 0 R /XYZ 79.37 310.551 null ] >>
endobj
2526 0 obj
-<< /D [ 2488 0 R /XYZ 79.37 283.486 null ] >>
+<< /D [ 2488 0 R /XYZ 79.37 230.677 null ] >>
endobj
2527 0 obj
-<< /D [ 2488 0 R /XYZ 79.37 237.187 null ] >>
-endobj
-2528 0 obj
-<< /D [ 2488 0 R /XYZ 79.37 166.978 null ] >>
+<< /D [ 2488 0 R /XYZ 79.37 184.378 null ] >>
endobj
2487 0 obj
-<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F59 254 0 R /F82 295 0 R /F64 241 0 R /F15 242 0 R /F74 245 0 R /F79 270 0 R >> /ProcSet [ /PDF /Text ] >>
+<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F59 254 0 R /F82 295 0 R /F64 241 0 R /F15 242 0 R /F74 245 0 R /F81 294 0 R /F79 270 0 R >> /ProcSet [ /PDF /Text ] >>
endobj
-2541 0 obj
-<< /Filter /FlateDecode /Length 3105 >>
+2533 0 obj
+<< /Filter /FlateDecode /Length 2479 >>
stream
-x\ˎc WZ4
-(2]mf5"DއAjQ(X"EToo_UB0 }o斊r関Q:ۯ?o}}hm~jN?Vh߾*+:ٷY'=u>`><!Lj;f­-U[c.E;W7Y,}F5֩8u]:Jxzs״-eEVT/댊,L~*9T~.fCnJ5޹LQ)aȪOu*wbj~wd⹻_Ϊb Ż^*Gw.ɻ, Q>\ m"=wL&M^6 'Um]L=j֫Iӧ@Y/Uwua]mjGslgrɜ*xQ:v<{[3ccOl:(76sRkO,Q'DT'E]O{L`*5&W)4Cg
-§
-0y~2q~s<O_Ɣh|J632@B8҆]p; ut?
-Ov;! <]q/S2i9K jUyjRr[F@5!`!K{J_r[>\~i|QwVIqO۫>UR2a̩N\1gkEĜfG Z$<j^l˂0$ZEpmu ^y'QٲU~ߤѐ^Øy]@5XnNt2,}Inhkiu;Yhz3mS|jYGT}['Mݕ/޼3_ݽG1zqAM|d=˳>rg.&l@)0H0 ͦm]xd&mِ> sQh[kӁupv&.;,lXZD(mJC" 8ړєFae1%9G~h,u˦}ϟd)ϬO.R0H&Z3%َ#cQKܜύڻi
-nWFv!_Ul=8{}d [)(c˷0- AǑ.I2mA6QƑHrٍ6n.j^L:c'Z;-o&loUJ*O%VV=WמtsほAƮ^צ[z 6<0QgqJa~^
-^dI]/Қ kzHqrqY Aw_|uFƯ/\ūH\~HX̎8#Jϔzmnkh/m :J _^Ml
+x6߯,Cx/2x]6[e:+ [5M_~\Ǘ_/B00z/bb`\??8_9w7F5F~t۽=[^nDsG`]KwN&Ú_x@<!0Uf͈ZO7AxJXFzX @W aY-
+=:z$zSrjƟAz,ə>#UCGCJ<Q"XH“қDVZ(WP{^06
+5
+B>Ԓb[M0i. \&#UmjH|=z~M'=WR/OQ/O)iB\ 7c\l-T h <rW M vV`Riƍ|^`Y*@P{gT Ý, yGjznt[SXdɌN99* <c[աgYW]H' Kah`OՄROBbdZ9BzL():zsT9Gt`1'hDXp@';,T
+Rh܁Կ˪Nn`AG&t#Ou'hB|\$bՀ:E=ZKrVvfÆR1 ,HՂ\>@;>VP"ѐ=9I+=97ь\˾ڕPPfF_2;rZM14B1
+=]"JyR%@Ɓ2aqAB`M!w `i h0<B̔g#Sb+һrmS 8?lj޸DIdӛQ1Э24U/!fz9)iVǚ,`A"s-"]kts}HrRnڸMcj^fѣk
+L Qld2,#p"^ ˱y)j_iYgV;MUOR_IBk5DAO j7Lt4CaU*U
+iYC)'[-Z]~SeM0BO
+:uZF&QMSfuaKwDuCm:
+0MCNζmݨ> 2
endstream
endobj
-2540 0 obj
-<< /Type /Page /Contents 2541 0 R /Resources 2539 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 2486 0 R /Annots 2552 0 R >>
-endobj
-2552 0 obj
-[ 2529 0 R 2530 0 R 2531 0 R 2532 0 R 2533 0 R 2534 0 R 2535 0 R 2536 0 R 2537 0 R ]
-endobj
-2529 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 78.374 195.265 168.645 204.152 ]/A << /S /GoTo /D (section.0.1) >> >>
-endobj
-2530 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 78.374 171.405 199.908 182.374 ]/A << /S /GoTo /D (section.0.2) >> >>
-endobj
-2531 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 159.4 217.99 170.359 ]/A << /S /GoTo /D (subsection.0.2.1) >> >>
-endobj
2532 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 147.564 260.909 158.403 ]/A << /S /GoTo /D (subsection.0.2.2) >> >>
+<< /Type /Page /Contents 2533 0 R /Resources 2531 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 2486 0 R /Annots 2545 0 R >>
endobj
-2533 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 135.051 282.11 147.006 ]/A << /S /GoTo /D (subsection.0.2.3) >> >>
+2545 0 obj
+[ 2528 0 R ]
+endobj
+2528 0 obj
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 78.374 89.191 168.645 98.077 ]/A << /S /GoTo /D (section.0.1) >> >>
endobj
2534 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 78.374 115.514 177.731 124.56 ]/A << /S /GoTo /D (section.0.3) >> >>
+<< /D [ 2532 0 R /XYZ 78.37 808.885 null ] >>
endobj
2535 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 101.178 257.353 113.133 ]/A << /S /GoTo /D (subsection.0.3.1) >> >>
+<< /D [ 2532 0 R /XYZ 79.37 775.009 null ] >>
endobj
2536 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 89.671 172.561 100.62 ]/A << /S /GoTo /D (subsection.0.3.2) >> >>
+<< /D [ 2532 0 R /XYZ 79.37 668.934 null ] >>
endobj
2537 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 79.539 258.917 88.775 ]/A << /S /GoTo /D (subsection.0.3.3) >> >>
-endobj
-2542 0 obj
-<< /D [ 2540 0 R /XYZ 78.37 808.885 null ] >>
-endobj
-2543 0 obj
-<< /D [ 2540 0 R /XYZ 79.37 775.009 null ] >>
+<< /D [ 2532 0 R /XYZ 79.37 586.77 null ] >>
endobj
-2544 0 obj
-<< /D [ 2540 0 R /XYZ 79.37 692.844 null ] >>
-endobj
-2545 0 obj
-<< /D [ 2540 0 R /XYZ 79.37 622.635 null ] >>
+2538 0 obj
+<< /D [ 2532 0 R /XYZ 79.37 516.56 null ] >>
endobj
-2546 0 obj
-<< /D [ 2540 0 R /XYZ 79.37 576.336 null ] >>
+2539 0 obj
+<< /D [ 2532 0 R /XYZ 79.37 470.261 null ] >>
endobj
-2547 0 obj
-<< /D [ 2540 0 R /XYZ 79.37 518.082 null ] >>
+2540 0 obj
+<< /D [ 2532 0 R /XYZ 79.37 412.007 null ] >>
endobj
-2548 0 obj
-<< /D [ 2540 0 R /XYZ 79.37 423.963 null ] >>
+2541 0 obj
+<< /D [ 2532 0 R /XYZ 79.37 317.888 null ] >>
endobj
-2549 0 obj
-<< /D [ 2540 0 R /XYZ 79.37 365.709 null ] >>
+2542 0 obj
+<< /D [ 2532 0 R /XYZ 79.37 259.634 null ] >>
endobj
-2550 0 obj
-<< /D [ 2540 0 R /XYZ 79.37 307.454 null ] >>
+2543 0 obj
+<< /D [ 2532 0 R /XYZ 79.37 201.38 null ] >>
endobj
221 0 obj
-<< /D [ 2540 0 R /XYZ 79.37 248.929 null ] >>
+<< /D [ 2532 0 R /XYZ 79.37 142.854 null ] >>
endobj
-2551 0 obj
-<< /D [ 2540 0 R /XYZ 79.37 236.172 null ] >>
+2544 0 obj
+<< /D [ 2532 0 R /XYZ 79.37 130.097 null ] >>
endobj
-2539 0 obj
+2531 0 obj
<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F64 241 0 R /F15 242 0 R /F74 245 0 R /F65 243 0 R /F22 271 0 R >> /ProcSet [ /PDF /Text ] >>
endobj
2599 0 obj
-<< /Filter /FlateDecode /Length 6310 >>
-stream
-xͮVFy7E q=ldiը&}&ߵER?\'n4h$ǶHڛyKÿ?G~nc;_/k\n26|__oswksk];q>__~cmݵ,פs//~04Ssyx=ܟo<ޟ<\)tLz@_<}LO8xѾ-<?=O?W/iݩVߚSuZ_muw[nqZߦ}LazZˤ^TW/2}tZO/MLnqۗIL۾Lf}ӋzӺ;Ouze~zQi; qh֗˩쫤^S}vzU2>9zO7?fj~T }["3fc24[3wyC %A~ \>`8M0N0p`8M0N0&N i4:Pi4p`H`8M0.p`H`8M0&N k0v;
-Fs9_^7ӫ!}KۮZbQ|{93Hc?(SH}K&3NɌɌ53NɌɌdi24q:8q8Mf&3R'3J8Mf&3NɌ%3ΒɌdi2t.:3Mw~,ۓ9c6*sYM{>#i+Y<֣*(LN IP"(LN&
-SiI”@aB0p80V@a"0 P8(L
-3f+7N׃ܜ0Exsp䁓*O8yYMnv4[LoN3f; .qFpN3ťWqN3ɝfKY42͝eKy4i&ӌtLyaNTo$Cۖ[&vޗyu^N̯`Okكmi>%_Ru;B}NEɉéÉĥ%'%$'$H[2p*p"p"qICRv8tH\ppppNWn`Iwy |{8ЎӿvYrLg9}%>Tg˘\וYrޟu?
-5ңc\o gr4{f8q#uu
-g;0s]aƺLu3 3]aFLtg+8WLsEg+(WI0:Ƿ]>!x7aWOqOӘa톜f74! 9nHrݐ솜&RJX:M-&RNL)$4SDi4tnJp*]4tv:M<N=&N~:K@NA&NPҵ;.AeFO)6V.;T_ʾwuOGok6 ' "(L'
-S´@ٔ@aB0P 8
-\#0 P(LN
-sB:(.(9F!5+mvӬftVg4+mYi;J[Zkib-ub4vYb-ub4vX;Mc %EӚSa0Tv*L:.Tp*L7&h*L3&
-LRRaZ0TR:P\;0TJ*L$N#&
-B*J N&
-SG۾}[2ӟ ?,|qcG iӸdžo9#S۸Y>}XX~;hKItN3fKi4i |3%w4CiJ׹4i&ӌ~3f;]3&
-]Se,5ɸTDpI\a0Vz+x;v+L
-nmk
-miI[lEɵZab06z?^̺:OMK>s]_Igv4wfJ4if _3}%u4i&J4Ciӌa3f;]&b3f;4vqt[rn>5q;o #^a& x3f+tWpf
-3f+\w8c:f+LWp& t<Wqp s
-3 |A/'?NG~ٷt=9~HN<9$߻9Nݳ;Vy*uԙRgJ]feJ*uƪԙV4UV3[pLW3^^櫴V +uFԙRg:͔y̎v^uz=_8ݓ/bnCrp]|:G߭^KR
-NS9MܤNܜ&nN7Ӊĉi4q:qSi4qsI9Mܜ.qsI9Mܜ&nN7kܶz[gη~/{ʸ;~o<ۿ?{NAԥAtPtPAtPti:4t:J:MNAAkNAtAgti:4Tvpg:8[rySo.ɞo{~:
-ӄiB'u ÄiB4:SiB4:s9M&tN't'tN: ӄNN: ӄiB'uB4sYB'uB4s9M蔮 |]^n6T,7%\Z*eLӛ]S|iwYA0k9c}Y77gr{pyo8{iNP7_RŶ#uxQ{-]ݽO 'Nt ]]t i.u -r%u -ZN3Cq^N{9CʬW͓|ٻ'>])]wyNs]9.ivyNDi utDi4Q:Qp(8],Q:Qp(8M&
-J(<. G~nc;NK_r;usn=¸6y)#ù?4hg];pO'yT:
+<< /Filter /FlateDecode /Length 7243 >>
+stream
+xͮXzFy]oT( hi d,ȴ{I][$%븀 @yXrIڛyחfo϶r?݇vrМC;72ǿkݺ4㯮js3[׮Ǭ_o yjƤ4N?9㣺9󃺖'2?SOr|6O'ֶ{>U;X }47/Vr[wntַa[ݝqV7ˤkqZm_&]wqk}m_&y|; }tˤz|Qer۾Lu|e7qۗI?nwZm_&}?c^Kԟ^OžJ5u?WIom_%SLm71}g7=fyMP9ܶibyi>wqj?r,m2}5xrd}Y?8M_/R/J׾8M_/R/NEi4}qH(]4}q8M_N_/N8K_N_/Nҵ/Nؾf|mm/㸿d
+ô51J߄H>_ӿ=mi)L%C;Oh+]'LvRg;dw4Lv3ٝf;dw.u&u;dw4]LvN,]LvN3ٝf+]'vB= {L܍VʷzLXIQ&VfOޙokG 8Ny:j&nVOt5c<clg$u@RVR:M)N)N).:::RJSJSJSJK)RRRVRJRJ=RڔRJSJSJSJ)S2h9\?6$Іrm> :͵?ݞ~7ϧϾmZruR{n|s6r6N꜍:g8Y)H]V
+RpӬJARpӬJiV
+NRpY)HӬf4+RPf4+Y)HӬ.+gY)HӬf4+Ja])o6n\/v/ΗLUNϕSvEk3.o%)G~I$E$EI$E$i4Iq8H8MR&)NkR&)NII$gII$i4IQ&e/Ʒxk0m 84C͏ŕeu
+NSԩҵ
+NSTATitTATi4Up*(]'\=Uq;=f}\|\S ꍼ잧<TV͗|I͗|I͗KlNfNf.uJJZ]2+u2+u2+u2+uɬ%R'R'R'V:MfNfNfNf.:zάɬ%R'R'R'N٭
+e.ݵ?l/*yeqiܩ/}
+s秣 `=].c
+KMe7ol&2eW6^:eˤ79lxc˄7lvc2ׅS}5?̭Ks++||CsWNvzyMYknw~G+Rg+]'|Rg;w4S
+3cf*̄U8W
+3]f:jp
+3Yf*\u8cUae*Lu8#Ua& TqcILq\kW-o86`s1G8Z;"\,•pAi4pD8FHH8M%&N 
+k)&N
+ԩ g )$i4PVc3?vxƹ=]oWڬŸrq=MhK3NsFih;m9-u90Iu:MRNRIu:MRNR&NTIII$i4I:IU&i4IuJ:MR.IuJ:MR&NTkR7Y0[oz[ĞK6 >ͽڠrTETETRԩԩե*R*R*R*RX\"u"u"ubuTETETETRSHX]"u"u"u4Uٖ'Ζq.Te{קGtO[qwrd[ϟg}^:9Ohr:t4LN39fr:t)u&ur:t4SLNN,SLNN39fr*]'f}jr޼]zi>t$_-_NXOgo3}޼Nu7ӼyΛi޼N7yΛi޼Nu7ͻy~{n|YoyY.s[:GΑos[pcNsiQHcJcNsiVRg4+mYi;J鬴%JiVNvԉ5NkZibtZib4vX+]c 7sgbwJn/ܬb_|?tP i4a4uJ*]4uJ:M@&NPPP i*ut i4:u:],:u:M@&J׀n"mޥʀvi}(?qqΘC8~.0|XAQNp8MN&NӉĉDi"4:PFi"4pH8M.pH8M&Nk6gjۋ y|z>_O۲Qڽ:˕Ȩu9i6vNsec0;i4]4]ti4]4i4Mw;K;MӝNttkӝNtii4tgii4i4MW6}?M_iM>>98Z^%
+Nk^ wmO/]vSeqa7Jj/ϻԋi\^=v7~]]?
endstream
endobj
2598 0 obj
<< /Type /Page /Contents 2599 0 R /Resources 2597 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 2486 0 R /Annots 2601 0 R >>
endobj
2601 0 obj
-[ 2538 0 R 2553 0 R 2554 0 R 2555 0 R 2556 0 R 2557 0 R 2558 0 R 2559 0 R 2560 0 R 2561 0 R 2562 0 R 2563 0 R 2564 0 R 2565 0 R 2566 0 R 2567 0 R 2568 0 R 2569 0 R 2570 0 R 2571 0 R 2572 0 R 2573 0 R 2574 0 R 2575 0 R 2576 0 R 2577 0 R 2578 0 R 2579 0 R 2580 0 R 2581 0 R 2582 0 R 2583 0 R 2584 0 R 2585 0 R 2586 0 R 2587 0 R 2588 0 R 2589 0 R 2590 0 R 2591 0 R 2592 0 R 2593 0 R 2594 0 R 2595 0 R 2596 0 R ]
+[ 2529 0 R 2530 0 R 2546 0 R 2547 0 R 2548 0 R 2549 0 R 2550 0 R 2551 0 R 2552 0 R 2553 0 R 2554 0 R 2555 0 R 2556 0 R 2557 0 R 2558 0 R 2559 0 R 2560 0 R 2561 0 R 2562 0 R 2563 0 R 2564 0 R 2565 0 R 2566 0 R 2567 0 R 2568 0 R 2569 0 R 2570 0 R 2571 0 R 2572 0 R 2573 0 R 2574 0 R 2575 0 R 2576 0 R 2577 0 R 2578 0 R 2579 0 R 2580 0 R 2581 0 R 2582 0 R 2583 0 R 2584 0 R 2585 0 R 2586 0 R 2587 0 R 2588 0 R 2589 0 R 2590 0 R 2591 0 R 2592 0 R 2593 0 R 2594 0 R 2595 0 R 2596 0 R ]
endobj
-2538 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 78.374 759.955 197.477 769.031 ]/A << /S /GoTo /D (section.0.4) >> >>
+2529 0 obj
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 78.374 758.062 199.908 769.031 ]/A << /S /GoTo /D (section.0.2) >> >>
+endobj
+2530 0 obj
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 746.057 217.99 757.016 ]/A << /S /GoTo /D (subsection.0.2.1) >> >>
+endobj
+2546 0 obj
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 734.222 260.909 745.061 ]/A << /S /GoTo /D (subsection.0.2.2) >> >>
+endobj
+2547 0 obj
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 721.708 282.11 733.664 ]/A << /S /GoTo /D (subsection.0.2.3) >> >>
+endobj
+2548 0 obj
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 78.374 702.172 177.731 711.218 ]/A << /S /GoTo /D (section.0.3) >> >>
+endobj
+2549 0 obj
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 687.835 257.353 699.791 ]/A << /S /GoTo /D (subsection.0.3.1) >> >>
+endobj
+2550 0 obj
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 676.329 172.561 687.278 ]/A << /S /GoTo /D (subsection.0.3.2) >> >>
+endobj
+2551 0 obj
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 666.197 258.917 675.432 ]/A << /S /GoTo /D (subsection.0.3.3) >> >>
+endobj
+2552 0 obj
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 78.374 644.388 197.477 653.464 ]/A << /S /GoTo /D (section.0.4) >> >>
endobj
2553 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 746.057 252.591 757.126 ]/A << /S /GoTo /D (subsection.0.4.1) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 630.491 252.591 641.559 ]/A << /S /GoTo /D (subsection.0.4.1) >> >>
endobj
2554 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 734.222 269.318 745.061 ]/A << /S /GoTo /D (subsection.0.4.2) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 618.655 269.318 629.494 ]/A << /S /GoTo /D (subsection.0.4.2) >> >>
endobj
2555 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 723.98 256.257 733.106 ]/A << /S /GoTo /D (subsubsection.0.4.2.1) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 608.413 256.257 617.539 ]/A << /S /GoTo /D (subsubsection.0.4.2.1) >> >>
endobj
2556 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 710.202 267.465 721.151 ]/A << /S /GoTo /D (subsubsection.0.4.2.2) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 594.635 267.465 605.584 ]/A << /S /GoTo /D (subsubsection.0.4.2.2) >> >>
endobj
2557 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 698.356 287.5 709.195 ]/A << /S /GoTo /D (subsubsection.0.4.2.3) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 582.789 287.5 593.629 ]/A << /S /GoTo /D (subsubsection.0.4.2.3) >> >>
endobj
2558 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 688.114 260.89 697.24 ]/A << /S /GoTo /D (subsection.0.4.3) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 572.548 260.89 581.674 ]/A << /S /GoTo /D (subsection.0.4.3) >> >>
endobj
2559 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 673.888 356.78 685.843 ]/A << /S /GoTo /D (subsubsection.0.4.3.1) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 558.321 356.78 570.276 ]/A << /S /GoTo /D (subsubsection.0.4.3.1) >> >>
endobj
2560 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 661.933 423.071 673.888 ]/A << /S /GoTo /D (subsubsection.0.4.3.2) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 546.366 423.071 558.321 ]/A << /S /GoTo /D (subsubsection.0.4.3.2) >> >>
endobj
2561 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 649.977 434.598 661.933 ]/A << /S /GoTo /D (subsubsection.0.4.3.3) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 534.411 434.598 546.366 ]/A << /S /GoTo /D (subsubsection.0.4.3.3) >> >>
endobj
2562 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 638.461 249.98 649.42 ]/A << /S /GoTo /D (subsection.0.4.4) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 522.894 249.98 533.853 ]/A << /S /GoTo /D (subsection.0.4.4) >> >>
endobj
2563 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 626.505 202.349 637.464 ]/A << /S /GoTo /D (subsubsection.0.4.4.1) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 510.939 202.349 521.898 ]/A << /S /GoTo /D (subsubsection.0.4.4.1) >> >>
endobj
2564 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 616.493 200.416 625.509 ]/A << /S /GoTo /D (subsubsection.0.4.4.2) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 500.926 200.416 509.943 ]/A << /S /GoTo /D (subsubsection.0.4.4.2) >> >>
endobj
2565 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 602.715 298.12 613.664 ]/A << /S /GoTo /D (subsection.0.4.5) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 487.148 298.12 498.097 ]/A << /S /GoTo /D (subsection.0.4.5) >> >>
endobj
2566 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 592.473 179.455 601.599 ]/A << /S /GoTo /D (subsection.0.4.6) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 476.906 179.455 486.032 ]/A << /S /GoTo /D (subsection.0.4.6) >> >>
endobj
2567 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 78.374 568.842 153.283 579.681 ]/A << /S /GoTo /D (section.0.5) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 78.374 453.275 153.283 464.114 ]/A << /S /GoTo /D (section.0.5) >> >>
endobj
2568 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 556.767 196.72 567.726 ]/A << /S /GoTo /D (subsection.0.5.1) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 441.2 196.72 452.159 ]/A << /S /GoTo /D (subsection.0.5.1) >> >>
endobj
2569 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 544.812 285.168 555.88 ]/A << /S /GoTo /D (subsection.0.5.2) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 429.245 285.168 440.314 ]/A << /S /GoTo /D (subsection.0.5.2) >> >>
endobj
2570 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 532.857 215.52 543.816 ]/A << /S /GoTo /D (subsection.0.5.3) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 417.29 215.52 428.249 ]/A << /S /GoTo /D (subsection.0.5.3) >> >>
endobj
2571 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 520.901 278.842 532.08 ]/A << /S /GoTo /D (subsection.0.5.4) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 405.335 278.842 416.513 ]/A << /S /GoTo /D (subsection.0.5.4) >> >>
endobj
2572 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 508.956 207.39 519.905 ]/A << /S /GoTo /D (subsection.0.5.5) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 393.39 207.39 404.339 ]/A << /S /GoTo /D (subsection.0.5.5) >> >>
endobj
2573 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 78.374 487.148 184.546 497.987 ]/A << /S /GoTo /D (section.0.6) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 78.374 371.581 184.546 382.421 ]/A << /S /GoTo /D (section.0.6) >> >>
endobj
2574 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 476.906 182.752 486.032 ]/A << /S /GoTo /D (subsection.0.6.1) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 361.34 182.752 370.466 ]/A << /S /GoTo /D (subsection.0.6.1) >> >>
endobj
2575 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 463.238 281.114 474.187 ]/A << /S /GoTo /D (subsection.0.6.2) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 347.671 281.114 358.62 ]/A << /S /GoTo /D (subsection.0.6.2) >> >>
endobj
2576 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 451.163 266.498 462.232 ]/A << /S /GoTo /D (subsubsection.0.6.2.1) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 335.596 266.498 346.665 ]/A << /S /GoTo /D (subsubsection.0.6.2.1) >> >>
endobj
2577 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 441.041 308.71 450.276 ]/A << /S /GoTo /D (subsubsection.0.6.2.2) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 325.474 308.71 334.71 ]/A << /S /GoTo /D (subsubsection.0.6.2.2) >> >>
endobj
2578 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 429.086 268.292 438.321 ]/A << /S /GoTo /D (subsubsection.0.6.2.3) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 313.519 268.292 322.755 ]/A << /S /GoTo /D (subsubsection.0.6.2.3) >> >>
endobj
2579 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 415.417 208.436 426.366 ]/A << /S /GoTo /D (subsubsection.0.6.2.4) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 299.85 208.436 310.799 ]/A << /S /GoTo /D (subsubsection.0.6.2.4) >> >>
endobj
2580 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 405.175 258.718 414.411 ]/A << /S /GoTo /D (subsubsection.0.6.2.5) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 289.609 258.718 298.844 ]/A << /S /GoTo /D (subsubsection.0.6.2.5) >> >>
endobj
2581 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 393.22 316.441 402.456 ]/A << /S /GoTo /D (subsubsection.0.6.2.6) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 277.654 316.441 286.889 ]/A << /S /GoTo /D (subsubsection.0.6.2.6) >> >>
endobj
2582 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 381.265 397.756 390.5 ]/A << /S /GoTo /D (subsubsection.0.6.2.7) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 265.699 397.756 274.934 ]/A << /S /GoTo /D (subsubsection.0.6.2.7) >> >>
endobj
2583 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 367.487 194.479 378.436 ]/A << /S /GoTo /D (subsubsection.0.6.2.8) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 251.92 194.479 262.869 ]/A << /S /GoTo /D (subsubsection.0.6.2.8) >> >>
endobj
2584 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 355.532 219.345 366.481 ]/A << /S /GoTo /D (subsubsection.0.6.2.9) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 239.965 219.345 250.914 ]/A << /S /GoTo /D (subsubsection.0.6.2.9) >> >>
endobj
2585 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 343.566 274.508 354.635 ]/A << /S /GoTo /D (subsubsection.0.6.2.10) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 228 274.508 239.068 ]/A << /S /GoTo /D (subsubsection.0.6.2.10) >> >>
endobj
2586 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 331.621 185.562 342.68 ]/A << /S /GoTo /D (subsubsection.0.6.2.11) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 216.055 185.562 227.113 ]/A << /S /GoTo /D (subsubsection.0.6.2.11) >> >>
endobj
2587 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 319.656 300.033 330.725 ]/A << /S /GoTo /D (subsubsection.0.6.2.12) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 204.09 300.033 215.158 ]/A << /S /GoTo /D (subsubsection.0.6.2.12) >> >>
endobj
2588 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 307.821 286.653 318.769 ]/A << /S /GoTo /D (subsection.0.6.3) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 192.254 286.653 203.203 ]/A << /S /GoTo /D (subsection.0.6.3) >> >>
endobj
2589 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 295.746 311.739 306.814 ]/A << /S /GoTo /D (subsubsection.0.6.3.1) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 180.179 311.739 191.248 ]/A << /S /GoTo /D (subsubsection.0.6.3.1) >> >>
endobj
2590 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 283.801 231.968 294.859 ]/A << /S /GoTo /D (subsubsection.0.6.3.2) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 168.234 231.968 179.293 ]/A << /S /GoTo /D (subsubsection.0.6.3.2) >> >>
endobj
2591 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 273.669 227.246 282.904 ]/A << /S /GoTo /D (subsubsection.0.6.3.3) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 158.102 227.246 167.337 ]/A << /S /GoTo /D (subsubsection.0.6.3.3) >> >>
endobj
2592 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 261.713 233.353 270.949 ]/A << /S /GoTo /D (subsubsection.0.6.3.4) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 146.147 233.353 155.382 ]/A << /S /GoTo /D (subsubsection.0.6.3.4) >> >>
endobj
2593 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 247.925 432.127 258.994 ]/A << /S /GoTo /D (subsubsection.0.6.3.5) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 132.359 432.127 143.427 ]/A << /S /GoTo /D (subsubsection.0.6.3.5) >> >>
endobj
2594 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 235.97 350.832 247.038 ]/A << /S /GoTo /D (subsubsection.0.6.3.6) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 120.403 350.832 131.472 ]/A << /S /GoTo /D (subsubsection.0.6.3.6) >> >>
endobj
2595 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 225.848 276.381 235.083 ]/A << /S /GoTo /D (subsubsection.0.6.3.7) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 110.281 276.381 119.517 ]/A << /S /GoTo /D (subsubsection.0.6.3.7) >> >>
endobj
2596 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 78.374 202.157 142.892 212.976 ]/A << /S /GoTo /D (section.0.7) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 78.374 86.59 142.892 97.41 ]/A << /S /GoTo /D (section.0.7) >> >>
endobj
2600 0 obj
<< /D [ 2598 0 R /XYZ 78.37 808.885 null ] >>
@@ -8788,38 +8808,43 @@ endobj
<< /Type /Font /Subtype /CIDFontType0 /BaseFont /GJKKSV+LMMono9-Regular /FontDescriptor 2634 0 R /W 2633 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >>
endobj
2639 0 obj
-[ 35 [ 580 ] 47 [ 624 ] 50 [ 558 ] 55 [ 536 ] 59 [ 641 ] 72 [ 513 ] 77 [ 613 ] 81 [ 636 ] 84 [ 558 ] 96 [ 602 ] 116 [ 613 ] ]
+[ 35 [ 580 ] 47 [ 624 ] 50 [ 558 ] 55 [ 536 ] 59 [ 641 ] 72 [ 513 ] 77 [ 613 ] 81 [ 636 ] 84 [ 558 ] 96 [ 602 ] 98 [ 458 ] 112 [ 613 ] 116 [ 613 ] ]
endobj
2641 0 obj
<< /Filter /FlateDecode /Length 23 >>
stream
-xc````T`h`h`
+xc````T`h`X
endstream
endobj
2642 0 obj
-<< /Subtype /CIDFontType0C /Filter /FlateDecode /Length 1648 >>
+<< /Subtype /CIDFontType0C /Filter /FlateDecode /Length 1946 >>
stream
-x}UPvYwʄ*%UC%@V&䖻Pxw! T<]g*֒Vm13USg403ƙ&ߚtvfv۝7{~oi5^,ٶjf.6{~P\V!LY,SqNQjQ^3奺ec~nQ"\ ?XKMp,[= ¿x.*(,|onv-*,|ze"fFdnn*`u>Żٝj`<akmFV
-z8s8:8lexrsn糬XcҠX\EK"/ҍ[6x[l/6ku<Jkռdu\s{6LOb{[c{jTAա iX HӬф4ktupޠex=vCϟ4(_x&Fa{o!Fo d{'3G;{i&HLݞbr l^$HZaFPظc txOΜ,2GZQ,Uq܁(Sg:oC{e_@*d3?ZnH^b~.b ##f/mqkɠLZeəALTn5
-J
-ZbF|Ȼo32"ZJ荰:I!AQcL:\Ϳ+Wl')ӠW݉12P+~8웙,:IUNwc{*Tt)ˡ4YgnDڨCbșfij74d`W}p^#JF!?gHj+z^6WV?EQuG?Q֑b``mۦ԰5^kFy( |
-/܍L\d:<㊙Б{~K(+ (Me_ӵ!L"?54N
+x}V p]YV!hŻCcuBR
+vO
+A%y%2G,4Rӂ2S>5 Ӗ3f 4KrI۝;w}Νy,1H$)ٯo,.ܖVP\3,go5Tul, WX,rJJX )Jh$J2qډ.,,$|L^咘wg1E&RTD.!$OK(W:+#31Y/,ٕ f`bt&=9)` ylbJ :c9c.g o0uVke*Xsź,)2 fhY zΤ7lھ5lLAUd50 c5JSVWaf+bUkY׊ s6mۘak1fl*5zs!_o0٪lMX2
+
+-X1+,M**.ћbHvI%T&HWIүeղ{pF%xhB/?/R8Pꛯ^y1Bo β`G)=-K]y WpNܚO]Q
+%jH?L]Y+=|]{6eR. :Z8 ĺnտI Zsђv_R,\٢whW[ *I ?oꡣnF%\kA'_&'&{x<.6Cќo$f0Nw6<6dSaeGr] +$BFX#oN*X{T7WP?~ȧvxxLqN>?%^MANrH8Y"VpO S;' Y=eZb 篤Qg-QmuUNY*0C?"N#L悇iXq]wҿ!;_#ZLeh!JBhG*rn}g!zi(xa
+I`K\(̭-UFmj3gP-u =SE
+l}'n8֝TL_f"&C!{#u-6鴑ji%o^QP]9h!y_8~NFĹh7%&AyBsTꃕ]>E@!őK@Y:"d\fk\_v,%37vzPvWu4%û]Ý<.Iq&vsC^o]`7Ru'߳$vbKB'/6CTzXwSOZ^EpFS(}i4gCdvjKWB==4MB>g7 Dꅬ룾^ ] ydn{#HyjWz" aIml=VcA^Բ}`@s'|+ba:eW#bC
+mE8ʈ#&Þ|}8y#NV=9RF/?p]dvU-;6qUk<T./ ؊Hr]T
endstream
endobj
2640 0 obj
-<< /Type /FontDescriptor /FontName /QXPJAX+LMRomanCaps10-Regular /Flags 4 /FontBBox [ -496 -290 1501 1100 ] /Ascent 1100 /CapHeight 683 /Descent -290 /ItalicAngle 0 /StemV 106 /XHeight 514 /FontFile3 2642 0 R /CIDSet 2641 0 R >>
+<< /Type /FontDescriptor /FontName /APETMS+LMRomanCaps10-Regular /Flags 4 /FontBBox [ -496 -290 1501 1100 ] /Ascent 1100 /CapHeight 683 /Descent -290 /ItalicAngle 0 /StemV 106 /XHeight 514 /FontFile3 2642 0 R /CIDSet 2641 0 R >>
endobj
2643 0 obj
-<< /Filter /FlateDecode /Length 419 >>
+<< /Filter /FlateDecode /Length 427 >>
stream
-xڍk0W=kZ!N؜WkMހMJ>/ɱ!_wN|fc4tV`5 Ftv(QVֈ 0̋yU{ąNb]G%~nq٭^vT˺Ixcw*m}V'jp&0/F}x27pim~,IA*^(<E͛sbUaneմ߲JJaxͨn>7eH<.eY!>BjWcnܞk4pBօԥ@[#g0[+c: $K_itq>I@ qQJtO4%=Mr9KhA44&V^jy}E*:k]`C^>)kSp=},'ڭL
+xڍ]k@g/u4$ lòf$;gdԋ-%x:*|a ǰm05T;@1E+a^RKůIo^>0?u9Zu,<e&d.(M5X ܓ/ M'z1f?l(thiTŒ 79\ݺRuZAd;ˮ77?C}F jжWtC m}{ D΍RبowmJ<ZsLs-kkV Vjk<@%e΄V0j
+%-2=m҄(#ZeDњh)&-<eӒQ%RO~٘>~~vKTy.Zݺ,5uG/+V
endstream
endobj
294 0 obj
-<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /QXPJAX+LMRomanCaps10-Regular /DescendantFonts [ 2644 0 R ] /ToUnicode 2643 0 R >>
+<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /APETMS+LMRomanCaps10-Regular /DescendantFonts [ 2644 0 R ] /ToUnicode 2643 0 R >>
endobj
2644 0 obj
-<< /Type /Font /Subtype /CIDFontType0 /BaseFont /QXPJAX+LMRomanCaps10-Regular /FontDescriptor 2640 0 R /W 2639 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >>
+<< /Type /Font /Subtype /CIDFontType0 /BaseFont /APETMS+LMRomanCaps10-Regular /FontDescriptor 2640 0 R /W 2639 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >>
endobj
2645 0 obj
[ 28 [ 500 ] 50 [ 444 ] 52 [ 778 ] 70 [ 528 ] 72 [ 278 ] 109 [ 556 ] 112 [ 528 ] 118 [ 528 ] ]
@@ -9725,50 +9750,48 @@ endobj
<< /Type /Font /Subtype /CIDFontType0 /BaseFont /CKBVSC+LMMono12-Regular /FontDescriptor 2762 0 R /W 2761 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >>
endobj
2767 0 obj
-[ 27 [ 734 490 ] 45 [ 272 ] 54 [ 639 ] 57 [ 490 ] 59 [ 490 ] 66 [ 272 ] 72 [ 272 ] 77 [ 544 ] 83 [ 666 544 ] 88 [ 272 ] 96 [ 381 ] 105 [ 381 490 490 ] 118 [ 517 ] 121 [ 490 ] ]
+[ 27 [ 734 490 ] 45 [ 272 ] 54 [ 639 ] 59 [ 490 ] 66 [ 272 ] 72 [ 272 ] 77 [ 544 ] 82 [ 490 666 544 ] 88 [ 272 ] 96 [ 381 ] 105 [ 381 490 490 ] 118 [ 517 ] 121 [ 490 ] ]
endobj
2769 0 obj
<< /Filter /FlateDecode /Length 24 >>
stream
-xc````a
-Phhh(`r
+xc````aPhhh(`r
endstream
endobj
2770 0 obj
-<< /Subtype /CIDFontType0C /Filter /FlateDecode /Length 2381 >>
+<< /Subtype /CIDFontType0C /Filter /FlateDecode /Length 2379 >>
stream
-x}V TeJlǭљx.%D@,MVp|,"seawS{xՌJ"4Rz,Ou76۝s۽s|3o'ABCD2ժus$iy#Y4m*~:4?MS!<-P!6\^xᩨ7 ǂ㧏CyۣON d
-B!wJ0DBB#j
-9Yzf~tgRFħm՘t9LG2k"DIaѰL:;-/d2ƠSkuLVc(͎dstIeħVNө32l5a}2JꙄjVf""FV3z}QQzCVF)E=X
-X619"ؗ׿/3-֧"ȇm~Z M 5#E"Sd1Y5z$IA!9$1"R#xH$L 92)wi!tZh%=2).)&'8,7{_9ͤaJ SXoN4p8iKzD5pp
-
-]ykp؉X:d2p JD෨ʽe{m׿6) z<gX%jpYгR\!u[}MMY~dsyc<z;&l,YN+^AtSx`SաwIO_״rjǶ'SpNJ> +pèƶHF;-2  {
-b&Td/|( -{-X;iR&V[\>q( Kh/l4ȖXvDP `s{|\gp ixIO~.2%7svQٱ,Xâ<p&,^{^ᔂMmDT.y@G-c/^KoV/>y(́%f5?NM{9nyґ4c鮒b6XwD[c69k#j$ >'tj[kQ)Edb9pӖnTT[O}_x_֕It
-j)%̵k]^JX.(A-ʷ^k389wGKoYz"c*_5WQ_7
-"8b[1xM0eI6lK)Y?Gi=eέ ^C{ơ"JcR] OG0@a/֔cj8Za
-G1t|" 2a %а큤Gdp1mbkjIԫe
-~GI:.QwRЫ=Z֤
-9a(< Țm3a! J˔}7a0).>uG>(Xyyn]۹+%D+*k::u=Pa.vV=<P2ȾFoͱT<vtgb7aqffKs'SX9K i嚏RآoN5|O} (vl AfYly3lwy'52맟೐9w'bׄ0!,E)@[A'ț_Z2i5-l`rA!6v YN
-}Wqog)9A.S$c,L3)lCԃ}ۏJP
-4k^ gl); [ȼf@#UG_Q]174ZX3p%Mʁ$9>k"IW7d R7c2iMesHt_ҝ&;u^u#b*_1Cf()K?_WSr]OM%y7'gg7dY7Wa PS[QyQᏀ ܣܕNWeeuU!<wV:UU&R/_
+x}V PGeq&Θ1e;&9Q
+y3jTfiu6LZFKhBH:57OK՚|Zxk*eVE,*R5jFG'mS2Z%AZ
+s"՚la6J`6*ԈWV'[+j e䩴՚ ժ,u,%ӕ B#HyE^F"):$IC"yv$1 %bRa$7)DC%sSCK%a9&ɘԁ0/(`VK3Lgфp{R(Y2SrLuQb . vE35
+4I:fcm1OIM<H>2 P+u? 2tƴdGe7\tV.
+^Ρ^Pm$ g =PN4Ǻs
+ڊ~;@&Π?XF:Gi( l]D&X<G^<X4JX~젪gͭ &0(iP3=/p>H1Y`]p<U9aFr?(_N tL w:
+F>cRaU緐ߴ7|dy?J%1b嶃Mn_SGQq޻K[1[-yª0l]`쨲TM$Iov?O
+N3<cYCZ[T\x;I[wV7~v
+Ժ"VخP@k~ 0W,Ϟh5>fI`3PRzAɗJIͼADaapULΙ9
+1e x.zĶOWﲙ-&i!fb&Km?ZI!(y:s'C6KŌ̈́ (p+n(!<}Ѿv
+VH.?v2`kubA+rqt)ui-~Ҟ$9q_c(^1±RTK'8* __4L^l~Ր^e[ޣ>G!/m⚠-%RUQ)ÃS\vGuumM)<o:55S{\oAZ
endstream
endobj
2768 0 obj
-<< /Type /FontDescriptor /FontName /PKBQBW+LMRoman12-Regular /Flags 4 /FontBBox [ -422 -280 1394 1127 ] /Ascent 1127 /CapHeight 683 /Descent -280 /ItalicAngle 0 /StemV 91 /XHeight 431 /FontFile3 2770 0 R /CIDSet 2769 0 R >>
+<< /Type /FontDescriptor /FontName /KKGPYG+LMRoman12-Regular /Flags 4 /FontBBox [ -422 -280 1394 1127 ] /Ascent 1127 /CapHeight 683 /Descent -280 /ItalicAngle 0 /StemV 91 /XHeight 431 /FontFile3 2770 0 R /CIDSet 2769 0 R >>
endobj
2771 0 obj
-<< /Filter /FlateDecode /Length 454 >>
+<< /Filter /FlateDecode /Length 452 >>
stream
-xڅMo0C@1J6D{Z
-62pȿVZmxwf^z< ft |[24P+
-ۆ1qg!|mU[/|`
+xڅKk0".\ˏm i+$.i+%#ۋJr 83:ɓ:z Ar
+:=AZd2Yh>47
+vNou4txv?ͱ{02`j2c`?_A@_u
+z,q{ۈ4*<2x).=%*3$e4FAFB_]O3T&,4cHD%F_ư# Hw3Ad *sLc} +p*~
+n4|o双Rju\q:?/0v
endstream
endobj
236 0 obj
-<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /PKBQBW+LMRoman12-Regular /DescendantFonts [ 2772 0 R ] /ToUnicode 2771 0 R >>
+<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /KKGPYG+LMRoman12-Regular /DescendantFonts [ 2772 0 R ] /ToUnicode 2771 0 R >>
endobj
2772 0 obj
-<< /Type /Font /Subtype /CIDFontType0 /BaseFont /PKBQBW+LMRoman12-Regular /FontDescriptor 2768 0 R /W 2767 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >>
+<< /Type /Font /Subtype /CIDFontType0 /BaseFont /KKGPYG+LMRoman12-Regular /FontDescriptor 2768 0 R /W 2767 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >>
endobj
2773 0 obj
[500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000 ]
@@ -10159,7 +10182,7 @@ endobj
<< /Type /Pages /Parent 2800 0 R /Count 10 /Kids [ 1936 0 R 1985 0 R 2020 0 R 2066 0 R 2124 0 R 2184 0 R 2248 0 R 2295 0 R 2348 0 R 2400 0 R ] >>
endobj
2486 0 obj
-<< /Type /Pages /Parent 2800 0 R /Count 4 /Kids [ 2438 0 R 2488 0 R 2540 0 R 2598 0 R ] >>
+<< /Type /Pages /Parent 2800 0 R /Count 4 /Kids [ 2438 0 R 2488 0 R 2532 0 R 2598 0 R ] >>
endobj
2800 0 obj
<< /Type /Pages /Count 64 /Kids [ 261 0 R 356 0 R 477 0 R 968 0 R 1515 0 R 1983 0 R 2486 0 R ] >>
@@ -10516,10 +10539,10 @@ endobj
<< /Names [ (page.12) 361 0 R (page.13) 369 0 R (page.14) 374 0 R (page.15) 382 0 R (page.16) 397 0 R (page.17) 408 0 R (page.18) 415 0 R (page.19) 419 0 R (page.2) 269 0 R (page.20) 427 0 R (page.21) 436 0 R (page.22) 481 0 R (page.23) 537 0 R (page.24) 569 0 R (page.25) 601 0 R (page.26) 638 0 R (page.27) 691 0 R (page.28) 746 0 R (page.29) 803 0 R (page.3) 279 0 R (page.30) 857 0 R (page.31) 920 0 R (page.32) 972 0 R (page.33) 1031 0 R (page.34) 1092 0 R (page.35) 1149 0 R (page.36) 1205 0 R (page.37) 1252 0 R (page.38) 1316 0 R (page.39) 1375 0 R (page.4) 293 0 R (page.40) 1414 0 R ] /Limits [ (page.12) (page.40) ] >>
endobj
2863 0 obj
-<< /Names [ (page.41) 1472 0 R (page.42) 1520 0 R (page.43) 1549 0 R (page.44) 1579 0 R (page.45) 1627 0 R (page.46) 1676 0 R (page.47) 1708 0 R (page.48) 1765 0 R (page.49) 1829 0 R (page.5) 307 0 R (page.50) 1873 0 R (page.51) 1938 0 R (page.52) 1987 0 R (page.53) 2022 0 R (page.54) 2068 0 R (page.55) 2126 0 R (page.56) 2186 0 R (page.57) 2250 0 R (page.58) 2297 0 R (page.59) 2350 0 R (page.6) 318 0 R (page.60) 2402 0 R (page.61) 2440 0 R (page.62) 2490 0 R (page.63) 2542 0 R (page.64) 2600 0 R (page.7) 323 0 R (page.8) 332 0 R (page.9) 338 0 R (section*.10) 2033 0 R (section*.11) 2035 0 R (section*.12) 2145 0 R ] /Limits [ (page.41) (section*.12) ] >>
+<< /Names [ (page.41) 1472 0 R (page.42) 1520 0 R (page.43) 1549 0 R (page.44) 1579 0 R (page.45) 1627 0 R (page.46) 1676 0 R (page.47) 1708 0 R (page.48) 1765 0 R (page.49) 1829 0 R (page.5) 307 0 R (page.50) 1873 0 R (page.51) 1938 0 R (page.52) 1987 0 R (page.53) 2022 0 R (page.54) 2068 0 R (page.55) 2126 0 R (page.56) 2186 0 R (page.57) 2250 0 R (page.58) 2297 0 R (page.59) 2350 0 R (page.6) 318 0 R (page.60) 2402 0 R (page.61) 2440 0 R (page.62) 2490 0 R (page.63) 2534 0 R (page.64) 2600 0 R (page.7) 323 0 R (page.8) 332 0 R (page.9) 338 0 R (section*.10) 2033 0 R (section*.11) 2035 0 R (section*.12) 2145 0 R ] /Limits [ (page.41) (section*.12) ] >>
endobj
2864 0 obj
-<< /Names [ (section*.13) 2148 0 R (section*.14) 2217 0 R (section*.15) 2279 0 R (section*.16) 2298 0 R (section*.17) 2305 0 R (section*.18) 2307 0 R (section*.19) 2526 0 R (section*.2) 1555 0 R (section*.20) 2527 0 R (section*.21) 2528 0 R (section*.22) 2543 0 R (section*.23) 2544 0 R (section*.24) 2545 0 R (section*.25) 2546 0 R (section*.26) 2547 0 R (section*.27) 2548 0 R (section*.28) 2549 0 R (section*.29) 2550 0 R (section*.3) 1684 0 R (section*.30) 2551 0 R (section*.4) 1750 0 R (section*.5) 1859 0 R (section*.6) 1889 0 R (section*.7) 1957 0 R (section*.8) 1972 0 R (section*.9) 2023 0 R (section.0.1) 5 0 R (section.0.2) 9 0 R (section.0.3) 25 0 R (section.0.4) 41 0 R (section.0.5) 101 0 R (section.0.6) 125 0 R ] /Limits [ (section*.13) (section.0.6) ] >>
+<< /Names [ (section*.13) 2148 0 R (section*.14) 2217 0 R (section*.15) 2279 0 R (section*.16) 2298 0 R (section*.17) 2305 0 R (section*.18) 2307 0 R (section*.19) 2526 0 R (section*.2) 1555 0 R (section*.20) 2527 0 R (section*.21) 2535 0 R (section*.22) 2536 0 R (section*.23) 2537 0 R (section*.24) 2538 0 R (section*.25) 2539 0 R (section*.26) 2540 0 R (section*.27) 2541 0 R (section*.28) 2542 0 R (section*.29) 2543 0 R (section*.3) 1684 0 R (section*.30) 2544 0 R (section*.4) 1750 0 R (section*.5) 1859 0 R (section*.6) 1889 0 R (section*.7) 1957 0 R (section*.8) 1972 0 R (section*.9) 2023 0 R (section.0.1) 5 0 R (section.0.2) 9 0 R (section.0.3) 25 0 R (section.0.4) 41 0 R (section.0.5) 101 0 R (section.0.6) 125 0 R ] /Limits [ (section*.13) (section.0.6) ] >>
endobj
2865 0 obj
<< /Names [ (section.0.7) 217 0 R (subsection.0.2.1) 13 0 R (subsection.0.2.2) 17 0 R (subsection.0.2.3) 21 0 R (subsection.0.3.1) 29 0 R (subsection.0.3.2) 33 0 R (subsection.0.3.3) 37 0 R (subsection.0.4.1) 45 0 R (subsection.0.4.2) 49 0 R (subsection.0.4.3) 65 0 R (subsection.0.4.4) 81 0 R (subsection.0.4.5) 93 0 R (subsection.0.4.6) 97 0 R (subsection.0.5.1) 105 0 R (subsection.0.5.2) 109 0 R (subsection.0.5.3) 113 0 R (subsection.0.5.4) 117 0 R (subsection.0.5.5) 121 0 R (subsection.0.6.1) 129 0 R (subsection.0.6.2) 133 0 R (subsection.0.6.3) 185 0 R (subsubsection.0.4.2.1) 53 0 R (subsubsection.0.4.2.2) 57 0 R (subsubsection.0.4.2.3) 61 0 R (subsubsection.0.4.3.1) 69 0 R (subsubsection.0.4.3.2) 73 0 R (subsubsection.0.4.3.3) 77 0 R (subsubsection.0.4.4.1) 85 0 R (subsubsection.0.4.4.2) 89 0 R (subsubsection.0.6.2.1) 137 0 R (subsubsection.0.6.2.10) 173 0 R (subsubsection.0.6.2.11) 177 0 R ] /Limits [ (section.0.7) (subsubsection.0.6.2.11) ] >>
@@ -10546,2886 +10569,2886 @@ endobj
<< /Type /Catalog /Pages 2800 0 R /Outlines 2801 0 R /Names 2871 0 R /PageMode/UseOutlines /OpenAction 224 0 R >>
endobj
2873 0 obj
-<< /Author(\376\377\000F\000.\000\040\000P\000a\000n\000t\000i\000g\000n\000y\000\040\000,\000\040\000f\000p\000a\000n\000t\000i\000g\000n\000y\000@\000w\000a\000n\000a\000d\000o\000o\000.\000f\000r)/Title(\376\377\000T\000h\000e\000\040\000p\000a\000c\000k\000a\000g\000e\000\040\000p\000i\000t\000o\000n)/Subject()/Creator(LaTeX with hyperref)/Keywords() /Producer (LuaTeX-1.16.0) /CreationDate (D:20230404180353+02'00') /ModDate (D:20230404180353+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.16.0 (MiKTeX 23.1)) >>
+<< /Author(\376\377\000F\000.\000\040\000P\000a\000n\000t\000i\000g\000n\000y\000\040\000,\000\040\000f\000p\000a\000n\000t\000i\000g\000n\000y\000@\000w\000a\000n\000a\000d\000o\000o\000.\000f\000r)/Title(\376\377\000T\000h\000e\000\040\000p\000a\000c\000k\000a\000g\000e\000\040\000p\000i\000t\000o\000n)/Subject()/Creator(LaTeX with hyperref)/Keywords() /Producer (LuaTeX-1.16.0) /CreationDate (D:20230411101223+02'00') /ModDate (D:20230411101223+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.16.0 (MiKTeX 23.1)) >>
endobj
xref
0 2874
0000000000 65535 f
-0000364030 00000 n
-0000364075 00000 n
-0000364095 00000 n
+0000364110 00000 n
+0000364155 00000 n
+0000364175 00000 n
0000000020 00000 n
-0000018143 00000 n
-0000601390 00000 n
+0000018148 00000 n
+0000601788 00000 n
0000000067 00000 n
0000000167 00000 n
-0000023116 00000 n
-0000601266 00000 n
+0000023121 00000 n
+0000601664 00000 n
0000000214 00000 n
0000000354 00000 n
-0000023176 00000 n
-0000601192 00000 n
+0000023181 00000 n
+0000601590 00000 n
0000000407 00000 n
0000000559 00000 n
-0000023237 00000 n
-0000601105 00000 n
+0000023242 00000 n
+0000601503 00000 n
0000000612 00000 n
0000000828 00000 n
-0000023298 00000 n
-0000601031 00000 n
+0000023303 00000 n
+0000601429 00000 n
0000000881 00000 n
0000001110 00000 n
-0000028535 00000 n
-0000600905 00000 n
+0000028540 00000 n
+0000601303 00000 n
0000001158 00000 n
0000001264 00000 n
-0000028596 00000 n
-0000600831 00000 n
+0000028601 00000 n
+0000601229 00000 n
0000001317 00000 n
0000001502 00000 n
-0000040513 00000 n
-0000600744 00000 n
+0000040509 00000 n
+0000601142 00000 n
0000001555 00000 n
0000001659 00000 n
-0000044757 00000 n
-0000600670 00000 n
+0000044753 00000 n
+0000601068 00000 n
0000001712 00000 n
0000001912 00000 n
-0000044818 00000 n
-0000600543 00000 n
+0000044814 00000 n
+0000600941 00000 n
0000001960 00000 n
0000002089 00000 n
-0000044879 00000 n
-0000600469 00000 n
+0000044875 00000 n
+0000600867 00000 n
0000002142 00000 n
0000002344 00000 n
-0000052163 00000 n
-0000600345 00000 n
+0000052159 00000 n
+0000600743 00000 n
0000002397 00000 n
0000002605 00000 n
-0000052224 00000 n
-0000600271 00000 n
+0000052220 00000 n
+0000600669 00000 n
0000002663 00000 n
0000002840 00000 n
-0000052285 00000 n
-0000600184 00000 n
+0000052281 00000 n
+0000600582 00000 n
0000002898 00000 n
0000003090 00000 n
-0000055602 00000 n
-0000600110 00000 n
+0000055598 00000 n
+0000600508 00000 n
0000003148 00000 n
0000003370 00000 n
-0000060473 00000 n
-0000599986 00000 n
+0000060423 00000 n
+0000600384 00000 n
0000003423 00000 n
0000003631 00000 n
-0000060533 00000 n
-0000599912 00000 n
+0000060483 00000 n
+0000600310 00000 n
0000003689 00000 n
0000004011 00000 n
-0000060594 00000 n
-0000599825 00000 n
+0000060544 00000 n
+0000600223 00000 n
0000004069 00000 n
0000004445 00000 n
-0000064103 00000 n
-0000599751 00000 n
+0000063970 00000 n
+0000600149 00000 n
0000004503 00000 n
0000004899 00000 n
-0000068061 00000 n
-0000599627 00000 n
+0000068114 00000 n
+0000600025 00000 n
0000004952 00000 n
0000005150 00000 n
-0000068122 00000 n
-0000599553 00000 n
+0000068174 00000 n
+0000599951 00000 n
0000005208 00000 n
0000005327 00000 n
-0000068183 00000 n
-0000599479 00000 n
+0000068235 00000 n
+0000599877 00000 n
0000005385 00000 n
0000005504 00000 n
-0000073600 00000 n
-0000599392 00000 n
+0000073651 00000 n
+0000599790 00000 n
0000005557 00000 n
0000005813 00000 n
-0000073661 00000 n
-0000599318 00000 n
+0000073712 00000 n
+0000599716 00000 n
0000005866 00000 n
0000005972 00000 n
-0000073722 00000 n
-0000599186 00000 n
+0000073773 00000 n
+0000599584 00000 n
0000006021 00000 n
0000006103 00000 n
-0000073784 00000 n
-0000599107 00000 n
+0000073835 00000 n
+0000599505 00000 n
0000006157 00000 n
0000006282 00000 n
-0000077358 00000 n
-0000599014 00000 n
+0000077409 00000 n
+0000599412 00000 n
0000006336 00000 n
0000006560 00000 n
-0000081980 00000 n
-0000598921 00000 n
+0000082031 00000 n
+0000599319 00000 n
0000006614 00000 n
0000006780 00000 n
-0000087539 00000 n
-0000598828 00000 n
+0000087590 00000 n
+0000599226 00000 n
0000006834 00000 n
0000007074 00000 n
-0000090703 00000 n
-0000598749 00000 n
+0000090754 00000 n
+0000599147 00000 n
0000007128 00000 n
0000007271 00000 n
-0000098882 00000 n
-0000598616 00000 n
+0000098933 00000 n
+0000599014 00000 n
0000007320 00000 n
0000007432 00000 n
-0000098944 00000 n
-0000598537 00000 n
+0000098995 00000 n
+0000598935 00000 n
0000007486 00000 n
0000007598 00000 n
-0000102408 00000 n
-0000598404 00000 n
+0000102459 00000 n
+0000598802 00000 n
0000007652 00000 n
0000007884 00000 n
-0000102470 00000 n
-0000598325 00000 n
+0000102521 00000 n
+0000598723 00000 n
0000007943 00000 n
0000008144 00000 n
-0000115339 00000 n
-0000598232 00000 n
+0000115390 00000 n
+0000598630 00000 n
0000008203 00000 n
0000008454 00000 n
-0000133659 00000 n
-0000598139 00000 n
+0000133774 00000 n
+0000598537 00000 n
0000008513 00000 n
0000008725 00000 n
-0000148322 00000 n
-0000598046 00000 n
+0000148437 00000 n
+0000598444 00000 n
0000008784 00000 n
0000008906 00000 n
-0000157517 00000 n
-0000597953 00000 n
+0000157632 00000 n
+0000598351 00000 n
0000008965 00000 n
0000009159 00000 n
-0000158207 00000 n
-0000597860 00000 n
+0000158322 00000 n
+0000598258 00000 n
0000009218 00000 n
0000009481 00000 n
-0000160030 00000 n
-0000597767 00000 n
+0000160145 00000 n
+0000598165 00000 n
0000009540 00000 n
0000009891 00000 n
-0000191128 00000 n
-0000597674 00000 n
+0000191246 00000 n
+0000598072 00000 n
0000009950 00000 n
0000010065 00000 n
-0000202091 00000 n
-0000597581 00000 n
+0000202209 00000 n
+0000597979 00000 n
0000010124 00000 n
0000010277 00000 n
-0000207360 00000 n
-0000597488 00000 n
+0000207478 00000 n
+0000597886 00000 n
0000010337 00000 n
0000010555 00000 n
-0000212542 00000 n
-0000597395 00000 n
+0000212660 00000 n
+0000597793 00000 n
0000010615 00000 n
0000010722 00000 n
-0000213253 00000 n
-0000597316 00000 n
+0000213371 00000 n
+0000597714 00000 n
0000010782 00000 n
0000011029 00000 n
-0000219657 00000 n
-0000597198 00000 n
+0000219775 00000 n
+0000597596 00000 n
0000011083 00000 n
0000011320 00000 n
-0000224117 00000 n
-0000597119 00000 n
+0000224235 00000 n
+0000597517 00000 n
0000011379 00000 n
0000011628 00000 n
-0000235678 00000 n
-0000597026 00000 n
+0000235796 00000 n
+0000597424 00000 n
0000011687 00000 n
0000011830 00000 n
-0000295559 00000 n
-0000596933 00000 n
+0000295677 00000 n
+0000597331 00000 n
0000011889 00000 n
0000012027 00000 n
-0000324153 00000 n
-0000596840 00000 n
+0000324271 00000 n
+0000597238 00000 n
0000012086 00000 n
0000012244 00000 n
-0000330524 00000 n
-0000596747 00000 n
+0000330642 00000 n
+0000597145 00000 n
0000012303 00000 n
0000012709 00000 n
-0000331171 00000 n
-0000596654 00000 n
+0000331289 00000 n
+0000597052 00000 n
0000012768 00000 n
0000013078 00000 n
-0000338022 00000 n
-0000596575 00000 n
+0000338140 00000 n
+0000596973 00000 n
0000013137 00000 n
0000013354 00000 n
-0000343313 00000 n
-0000596481 00000 n
+0000343079 00000 n
+0000596879 00000 n
0000013403 00000 n
0000013480 00000 n
-0000349192 00000 n
-0000596401 00000 n
+0000346999 00000 n
+0000596799 00000 n
0000013524 00000 n
0000013593 00000 n
-0000017138 00000 n
-0000017328 00000 n
-0000017639 00000 n
-0000017484 00000 n
-0000018329 00000 n
+0000017143 00000 n
+0000017333 00000 n
+0000017644 00000 n
+0000017489 00000 n
+0000018334 00000 n
0000013657 00000 n
-0000018019 00000 n
-0000018081 00000 n
-0000535373 00000 n
-0000532481 00000 n
-0000594443 00000 n
-0000530277 00000 n
-0000526345 00000 n
-0000522999 00000 n
-0000520367 00000 n
-0000515204 00000 n
-0000513091 00000 n
-0000505799 00000 n
-0000495134 00000 n
-0000491571 00000 n
-0000488468 00000 n
-0000477876 00000 n
-0000474281 00000 n
-0000594801 00000 n
-0000594083 00000 n
-0000594264 00000 n
-0000594977 00000 n
-0000594623 00000 n
-0000468405 00000 n
-0000460397 00000 n
-0000456162 00000 n
-0000018203 00000 n
-0000453052 00000 n
-0000449634 00000 n
-0000017831 00000 n
-0000018266 00000 n
-0000595151 00000 n
-0000017275 00000 n
-0000022576 00000 n
-0000022737 00000 n
-0000022898 00000 n
-0000023421 00000 n
-0000022394 00000 n
-0000018765 00000 n
-0000023054 00000 n
-0000442056 00000 n
-0000435436 00000 n
-0000023358 00000 n
-0000022531 00000 n
-0000028162 00000 n
-0000028318 00000 n
-0000028781 00000 n
-0000027988 00000 n
-0000023662 00000 n
-0000028473 00000 n
-0000427024 00000 n
-0000028657 00000 n
-0000028719 00000 n
-0000028125 00000 n
-0000033149 00000 n
-0000033310 00000 n
-0000033470 00000 n
-0000033625 00000 n
-0000033781 00000 n
-0000033947 00000 n
-0000034301 00000 n
-0000032943 00000 n
-0000029074 00000 n
-0000034113 00000 n
-0000424228 00000 n
-0000421113 00000 n
-0000034175 00000 n
-0000034238 00000 n
-0000033080 00000 n
-0000039643 00000 n
-0000039804 00000 n
-0000039960 00000 n
-0000040118 00000 n
-0000040273 00000 n
-0000040698 00000 n
-0000039445 00000 n
-0000034568 00000 n
-0000040451 00000 n
-0000409763 00000 n
-0000040574 00000 n
-0000040637 00000 n
-0000039582 00000 n
-0000094116 00000 n
-0000044373 00000 n
-0000044534 00000 n
-0000044940 00000 n
-0000044199 00000 n
-0000041056 00000 n
-0000044695 00000 n
-0000044336 00000 n
-0000047331 00000 n
-0000047148 00000 n
-0000045168 00000 n
-0000047269 00000 n
-0000051301 00000 n
-0000051462 00000 n
-0000051623 00000 n
-0000051784 00000 n
-0000051945 00000 n
-0000052409 00000 n
-0000051103 00000 n
-0000047507 00000 n
-0000052101 00000 n
-0000052346 00000 n
-0000051240 00000 n
-0000055663 00000 n
-0000055419 00000 n
-0000052663 00000 n
-0000055540 00000 n
-0000059784 00000 n
-0000059941 00000 n
-0000060098 00000 n
-0000060254 00000 n
-0000060906 00000 n
-0000059594 00000 n
-0000055878 00000 n
-0000060411 00000 n
-0000060655 00000 n
-0000060718 00000 n
-0000060781 00000 n
-0000060844 00000 n
-0000059731 00000 n
-0000064164 00000 n
-0000063920 00000 n
-0000061173 00000 n
-0000064041 00000 n
-0000595304 00000 n
-0000067842 00000 n
-0000068307 00000 n
-0000067676 00000 n
-0000064353 00000 n
-0000067999 00000 n
-0000068244 00000 n
-0000067813 00000 n
-0000073218 00000 n
-0000073378 00000 n
-0000073846 00000 n
-0000073044 00000 n
-0000068574 00000 n
-0000073538 00000 n
-0000073181 00000 n
-0000077420 00000 n
-0000077175 00000 n
-0000074087 00000 n
-0000077296 00000 n
-0000081283 00000 n
-0000081444 00000 n
-0000081605 00000 n
-0000081762 00000 n
-0000082166 00000 n
-0000081093 00000 n
-0000077609 00000 n
-0000081918 00000 n
-0000082042 00000 n
-0000082104 00000 n
-0000081230 00000 n
-0000086067 00000 n
-0000086224 00000 n
-0000086381 00000 n
-0000086538 00000 n
-0000086695 00000 n
-0000086856 00000 n
-0000087017 00000 n
-0000087174 00000 n
-0000087787 00000 n
-0000085845 00000 n
-0000082407 00000 n
-0000087351 00000 n
-0000406071 00000 n
-0000087413 00000 n
-0000087476 00000 n
-0000087601 00000 n
-0000087664 00000 n
-0000087726 00000 n
-0000085982 00000 n
-0000090765 00000 n
-0000090520 00000 n
-0000088054 00000 n
-0000090641 00000 n
-0000403872 00000 n
-0000391699 00000 n
-0000376960 00000 n
-0000091774 00000 n
-0000091591 00000 n
-0000090993 00000 n
-0000091712 00000 n
-0000094178 00000 n
-0000093933 00000 n
-0000091911 00000 n
-0000094054 00000 n
-0000098193 00000 n
-0000098350 00000 n
-0000098506 00000 n
-0000098663 00000 n
-0000099256 00000 n
-0000098003 00000 n
-0000094341 00000 n
-0000098820 00000 n
-0000099006 00000 n
-0000099069 00000 n
-0000099132 00000 n
-0000099195 00000 n
-0000098140 00000 n
-0000104983 00000 n
-0000102225 00000 n
-0000099549 00000 n
-0000102346 00000 n
-0000593938 00000 n
-0000102532 00000 n
-0000102595 00000 n
-0000102658 00000 n
-0000102721 00000 n
-0000102784 00000 n
-0000102847 00000 n
-0000102910 00000 n
-0000102971 00000 n
-0000103034 00000 n
-0000103097 00000 n
-0000103160 00000 n
-0000103223 00000 n
-0000103286 00000 n
-0000103348 00000 n
-0000103411 00000 n
-0000103474 00000 n
-0000103537 00000 n
-0000103600 00000 n
-0000103663 00000 n
-0000103726 00000 n
-0000103789 00000 n
-0000103852 00000 n
-0000103915 00000 n
-0000103978 00000 n
-0000104041 00000 n
-0000104104 00000 n
-0000104167 00000 n
-0000104230 00000 n
-0000104293 00000 n
-0000104356 00000 n
-0000104418 00000 n
-0000104481 00000 n
-0000104544 00000 n
-0000104607 00000 n
-0000104670 00000 n
-0000104733 00000 n
-0000104796 00000 n
-0000104859 00000 n
-0000104921 00000 n
-0000595457 00000 n
-0000110792 00000 n
-0000107340 00000 n
-0000105186 00000 n
-0000107461 00000 n
-0000107523 00000 n
-0000107586 00000 n
-0000107648 00000 n
-0000107711 00000 n
-0000107774 00000 n
-0000107836 00000 n
-0000107898 00000 n
-0000107961 00000 n
-0000108024 00000 n
-0000108087 00000 n
-0000108150 00000 n
-0000108213 00000 n
-0000108276 00000 n
-0000108339 00000 n
-0000108402 00000 n
-0000108464 00000 n
-0000108527 00000 n
-0000108590 00000 n
-0000108653 00000 n
-0000108716 00000 n
-0000108779 00000 n
-0000108842 00000 n
-0000108905 00000 n
-0000108968 00000 n
-0000109031 00000 n
-0000109094 00000 n
-0000109157 00000 n
-0000109220 00000 n
-0000109283 00000 n
-0000109346 00000 n
-0000109409 00000 n
-0000109472 00000 n
-0000109535 00000 n
-0000109598 00000 n
-0000109660 00000 n
-0000109723 00000 n
-0000109786 00000 n
-0000109849 00000 n
-0000109912 00000 n
-0000109975 00000 n
-0000110038 00000 n
-0000110101 00000 n
-0000110164 00000 n
-0000110227 00000 n
-0000110290 00000 n
-0000110352 00000 n
-0000110415 00000 n
-0000110478 00000 n
-0000110541 00000 n
-0000110604 00000 n
-0000110667 00000 n
-0000110730 00000 n
-0000116029 00000 n
-0000114025 00000 n
-0000110955 00000 n
-0000114146 00000 n
-0000114208 00000 n
-0000114271 00000 n
-0000114333 00000 n
-0000114396 00000 n
-0000114459 00000 n
-0000114522 00000 n
-0000114585 00000 n
-0000114648 00000 n
-0000114711 00000 n
-0000114774 00000 n
-0000114837 00000 n
-0000114898 00000 n
-0000114961 00000 n
-0000115024 00000 n
-0000115087 00000 n
-0000115150 00000 n
-0000115213 00000 n
-0000115276 00000 n
-0000115401 00000 n
-0000115464 00000 n
-0000115527 00000 n
-0000115590 00000 n
-0000115653 00000 n
-0000115716 00000 n
-0000115779 00000 n
-0000115842 00000 n
-0000115905 00000 n
-0000115967 00000 n
-0000120618 00000 n
-0000118675 00000 n
-0000116231 00000 n
-0000118796 00000 n
-0000118858 00000 n
-0000118921 00000 n
-0000118984 00000 n
-0000119045 00000 n
-0000119108 00000 n
-0000119171 00000 n
-0000119234 00000 n
-0000119297 00000 n
-0000119360 00000 n
-0000119423 00000 n
-0000119486 00000 n
-0000119548 00000 n
-0000119611 00000 n
-0000119674 00000 n
-0000119737 00000 n
-0000119800 00000 n
-0000119863 00000 n
-0000119926 00000 n
-0000119989 00000 n
-0000120052 00000 n
-0000120115 00000 n
-0000120178 00000 n
-0000120240 00000 n
-0000120303 00000 n
-0000120366 00000 n
-0000120429 00000 n
-0000120492 00000 n
-0000120555 00000 n
-0000125461 00000 n
-0000123200 00000 n
-0000120781 00000 n
-0000123321 00000 n
-0000123383 00000 n
-0000123446 00000 n
-0000123509 00000 n
-0000123572 00000 n
-0000123635 00000 n
-0000123698 00000 n
-0000123761 00000 n
-0000123824 00000 n
-0000123887 00000 n
-0000123950 00000 n
-0000124013 00000 n
-0000124076 00000 n
-0000124139 00000 n
-0000124201 00000 n
-0000124264 00000 n
-0000124327 00000 n
-0000124390 00000 n
-0000124453 00000 n
-0000124516 00000 n
-0000124579 00000 n
-0000124642 00000 n
-0000124705 00000 n
-0000124768 00000 n
-0000124831 00000 n
-0000124894 00000 n
-0000124957 00000 n
-0000125020 00000 n
-0000125083 00000 n
-0000125146 00000 n
-0000125209 00000 n
-0000125272 00000 n
-0000125335 00000 n
-0000125398 00000 n
-0000130865 00000 n
-0000127600 00000 n
-0000125637 00000 n
-0000127721 00000 n
-0000127783 00000 n
-0000127846 00000 n
-0000127909 00000 n
-0000127972 00000 n
-0000128035 00000 n
-0000128098 00000 n
-0000128161 00000 n
-0000128224 00000 n
-0000128287 00000 n
-0000128350 00000 n
-0000128413 00000 n
-0000128476 00000 n
-0000128539 00000 n
-0000128602 00000 n
-0000128665 00000 n
-0000128728 00000 n
-0000128790 00000 n
-0000128853 00000 n
-0000128916 00000 n
-0000128979 00000 n
-0000129042 00000 n
-0000129105 00000 n
-0000129168 00000 n
-0000129231 00000 n
-0000129294 00000 n
-0000129357 00000 n
-0000129420 00000 n
-0000129482 00000 n
-0000129545 00000 n
-0000129608 00000 n
-0000129671 00000 n
-0000129734 00000 n
-0000129797 00000 n
-0000129860 00000 n
-0000129923 00000 n
-0000129986 00000 n
-0000130049 00000 n
-0000130112 00000 n
-0000130174 00000 n
-0000130237 00000 n
-0000130300 00000 n
-0000130363 00000 n
-0000130426 00000 n
-0000130489 00000 n
-0000130552 00000 n
-0000130615 00000 n
-0000130678 00000 n
-0000130741 00000 n
-0000130803 00000 n
-0000136926 00000 n
-0000133476 00000 n
-0000131028 00000 n
-0000133597 00000 n
-0000133721 00000 n
-0000133783 00000 n
-0000133846 00000 n
-0000133909 00000 n
-0000133972 00000 n
-0000134035 00000 n
-0000134098 00000 n
-0000134161 00000 n
-0000134224 00000 n
-0000134287 00000 n
-0000134350 00000 n
-0000134413 00000 n
-0000134475 00000 n
-0000134538 00000 n
-0000134601 00000 n
-0000134664 00000 n
-0000134727 00000 n
-0000134790 00000 n
-0000134853 00000 n
-0000134916 00000 n
-0000134979 00000 n
-0000135041 00000 n
-0000135104 00000 n
-0000135167 00000 n
-0000135230 00000 n
-0000135293 00000 n
-0000135356 00000 n
-0000135418 00000 n
-0000135481 00000 n
-0000135544 00000 n
-0000135607 00000 n
-0000135670 00000 n
-0000135733 00000 n
-0000135796 00000 n
-0000135859 00000 n
-0000135922 00000 n
-0000135984 00000 n
-0000136047 00000 n
-0000136110 00000 n
-0000136173 00000 n
-0000136236 00000 n
-0000136299 00000 n
-0000136362 00000 n
-0000136425 00000 n
-0000136488 00000 n
-0000136550 00000 n
-0000136613 00000 n
-0000136676 00000 n
-0000136739 00000 n
-0000136802 00000 n
-0000136864 00000 n
-0000143173 00000 n
-0000139659 00000 n
-0000137102 00000 n
-0000139780 00000 n
-0000139842 00000 n
-0000139905 00000 n
-0000139967 00000 n
-0000140030 00000 n
-0000140093 00000 n
-0000140156 00000 n
-0000140219 00000 n
-0000140282 00000 n
-0000140345 00000 n
-0000140408 00000 n
-0000140471 00000 n
-0000140534 00000 n
-0000140597 00000 n
-0000140660 00000 n
-0000140722 00000 n
-0000140785 00000 n
-0000140848 00000 n
-0000140911 00000 n
-0000140974 00000 n
-0000141037 00000 n
-0000141100 00000 n
-0000141163 00000 n
-0000141226 00000 n
-0000141289 00000 n
-0000141352 00000 n
-0000141415 00000 n
-0000141478 00000 n
-0000141541 00000 n
-0000141604 00000 n
-0000141667 00000 n
-0000141730 00000 n
-0000141793 00000 n
-0000141856 00000 n
-0000141917 00000 n
-0000141980 00000 n
-0000142043 00000 n
-0000142106 00000 n
-0000142169 00000 n
-0000142232 00000 n
-0000142295 00000 n
-0000142358 00000 n
-0000142420 00000 n
-0000142483 00000 n
-0000142546 00000 n
-0000142609 00000 n
-0000142672 00000 n
-0000142735 00000 n
-0000142798 00000 n
-0000142861 00000 n
-0000142923 00000 n
-0000142986 00000 n
-0000143049 00000 n
-0000143111 00000 n
-0000148760 00000 n
-0000145373 00000 n
-0000143336 00000 n
-0000145494 00000 n
-0000145556 00000 n
-0000145619 00000 n
-0000145681 00000 n
-0000145744 00000 n
-0000145806 00000 n
-0000145869 00000 n
-0000145932 00000 n
-0000145995 00000 n
-0000146058 00000 n
-0000146121 00000 n
-0000146184 00000 n
-0000146247 00000 n
-0000146310 00000 n
-0000146373 00000 n
-0000146436 00000 n
-0000146499 00000 n
-0000146562 00000 n
-0000146625 00000 n
-0000146688 00000 n
-0000146751 00000 n
-0000146814 00000 n
-0000146877 00000 n
-0000146939 00000 n
-0000147002 00000 n
-0000147065 00000 n
-0000147128 00000 n
-0000147191 00000 n
-0000147254 00000 n
-0000147317 00000 n
-0000147380 00000 n
-0000147443 00000 n
-0000147505 00000 n
-0000147568 00000 n
-0000147631 00000 n
-0000147694 00000 n
-0000147757 00000 n
-0000147820 00000 n
-0000147883 00000 n
-0000147946 00000 n
-0000148009 00000 n
-0000148070 00000 n
-0000148133 00000 n
-0000148196 00000 n
-0000148259 00000 n
-0000148384 00000 n
-0000148447 00000 n
-0000148510 00000 n
-0000148573 00000 n
-0000148636 00000 n
-0000148698 00000 n
-0000155022 00000 n
-0000151130 00000 n
-0000148949 00000 n
-0000151251 00000 n
-0000151313 00000 n
-0000151376 00000 n
-0000151438 00000 n
-0000151501 00000 n
-0000151564 00000 n
-0000151627 00000 n
-0000151690 00000 n
-0000151753 00000 n
-0000151816 00000 n
-0000151879 00000 n
-0000151942 00000 n
-0000152004 00000 n
-0000152067 00000 n
-0000152130 00000 n
-0000152193 00000 n
-0000152256 00000 n
-0000152319 00000 n
-0000152382 00000 n
-0000152445 00000 n
-0000152508 00000 n
-0000152570 00000 n
-0000152633 00000 n
-0000152696 00000 n
-0000152759 00000 n
-0000152822 00000 n
-0000152885 00000 n
-0000152948 00000 n
-0000153011 00000 n
-0000153074 00000 n
-0000153136 00000 n
-0000153199 00000 n
-0000153262 00000 n
-0000153325 00000 n
-0000153388 00000 n
-0000153451 00000 n
-0000153514 00000 n
-0000153577 00000 n
-0000153640 00000 n
-0000153702 00000 n
-0000153765 00000 n
-0000153828 00000 n
-0000153891 00000 n
-0000153954 00000 n
-0000154017 00000 n
-0000154080 00000 n
-0000154143 00000 n
-0000154206 00000 n
-0000154268 00000 n
-0000154331 00000 n
-0000154394 00000 n
-0000154457 00000 n
-0000154520 00000 n
-0000154583 00000 n
-0000154646 00000 n
-0000154709 00000 n
-0000154772 00000 n
-0000154834 00000 n
-0000154897 00000 n
-0000154960 00000 n
-0000160657 00000 n
-0000157334 00000 n
-0000155185 00000 n
-0000157455 00000 n
-0000157579 00000 n
-0000157641 00000 n
-0000157703 00000 n
-0000157766 00000 n
-0000157829 00000 n
-0000157892 00000 n
-0000157955 00000 n
-0000158018 00000 n
-0000158081 00000 n
-0000158144 00000 n
-0000158269 00000 n
-0000158332 00000 n
-0000158395 00000 n
-0000158458 00000 n
-0000158521 00000 n
-0000158584 00000 n
-0000158647 00000 n
-0000158710 00000 n
-0000158772 00000 n
-0000158835 00000 n
-0000158898 00000 n
-0000158961 00000 n
-0000159024 00000 n
-0000159087 00000 n
-0000159150 00000 n
-0000159213 00000 n
-0000159276 00000 n
-0000159339 00000 n
-0000159401 00000 n
-0000159464 00000 n
-0000159527 00000 n
-0000159590 00000 n
-0000159653 00000 n
-0000159716 00000 n
-0000159779 00000 n
-0000159842 00000 n
-0000159905 00000 n
-0000159967 00000 n
-0000160092 00000 n
-0000160155 00000 n
-0000160218 00000 n
-0000160281 00000 n
-0000160344 00000 n
-0000160407 00000 n
-0000160470 00000 n
-0000160533 00000 n
-0000160595 00000 n
-0000595610 00000 n
-0000166612 00000 n
-0000162945 00000 n
-0000160833 00000 n
-0000163066 00000 n
-0000163128 00000 n
-0000163191 00000 n
-0000163253 00000 n
-0000163316 00000 n
-0000163379 00000 n
-0000163442 00000 n
-0000163505 00000 n
-0000163568 00000 n
-0000163631 00000 n
-0000163694 00000 n
-0000163757 00000 n
-0000163819 00000 n
-0000163882 00000 n
-0000163945 00000 n
-0000164008 00000 n
-0000164071 00000 n
-0000164134 00000 n
-0000164197 00000 n
-0000164260 00000 n
-0000164322 00000 n
-0000164385 00000 n
-0000164448 00000 n
-0000164511 00000 n
-0000164574 00000 n
-0000164637 00000 n
-0000164700 00000 n
-0000164763 00000 n
-0000164825 00000 n
-0000164889 00000 n
-0000164953 00000 n
-0000165017 00000 n
-0000165081 00000 n
-0000165145 00000 n
-0000165209 00000 n
-0000165273 00000 n
-0000165337 00000 n
-0000165400 00000 n
-0000165464 00000 n
-0000165528 00000 n
-0000165592 00000 n
-0000165656 00000 n
-0000165720 00000 n
-0000165784 00000 n
-0000165847 00000 n
-0000165911 00000 n
-0000165975 00000 n
-0000166039 00000 n
-0000166103 00000 n
-0000166167 00000 n
-0000166231 00000 n
-0000166295 00000 n
-0000166359 00000 n
-0000166422 00000 n
-0000166486 00000 n
-0000166549 00000 n
-0000172828 00000 n
-0000168943 00000 n
-0000166775 00000 n
-0000169067 00000 n
-0000169131 00000 n
-0000169196 00000 n
-0000169260 00000 n
-0000169325 00000 n
-0000169390 00000 n
-0000169455 00000 n
-0000169520 00000 n
-0000169585 00000 n
-0000169650 00000 n
-0000169715 00000 n
-0000169780 00000 n
-0000169844 00000 n
-0000169909 00000 n
-0000169974 00000 n
-0000170039 00000 n
-0000170104 00000 n
-0000170169 00000 n
-0000170234 00000 n
-0000170298 00000 n
-0000170363 00000 n
-0000170428 00000 n
-0000170493 00000 n
-0000170558 00000 n
-0000170623 00000 n
-0000170688 00000 n
-0000170753 00000 n
-0000170818 00000 n
-0000170882 00000 n
-0000170947 00000 n
-0000171012 00000 n
-0000171077 00000 n
-0000171142 00000 n
-0000171207 00000 n
-0000171272 00000 n
-0000171337 00000 n
-0000171402 00000 n
-0000171466 00000 n
-0000171531 00000 n
-0000171596 00000 n
-0000171661 00000 n
-0000171726 00000 n
-0000171791 00000 n
-0000171856 00000 n
-0000171921 00000 n
-0000171986 00000 n
-0000172051 00000 n
-0000172116 00000 n
-0000172181 00000 n
-0000172246 00000 n
-0000172311 00000 n
-0000172376 00000 n
-0000172441 00000 n
-0000172506 00000 n
-0000172570 00000 n
-0000172635 00000 n
-0000172700 00000 n
-0000172764 00000 n
-0000179088 00000 n
-0000175465 00000 n
-0000172992 00000 n
-0000175589 00000 n
-0000175653 00000 n
-0000175718 00000 n
-0000175782 00000 n
-0000175847 00000 n
-0000175912 00000 n
-0000175976 00000 n
-0000176041 00000 n
-0000176106 00000 n
-0000176171 00000 n
-0000176236 00000 n
-0000176301 00000 n
-0000176365 00000 n
-0000176430 00000 n
-0000176495 00000 n
-0000176560 00000 n
-0000176625 00000 n
-0000176690 00000 n
-0000176755 00000 n
-0000176820 00000 n
-0000176885 00000 n
-0000176949 00000 n
-0000177014 00000 n
-0000177079 00000 n
-0000177144 00000 n
-0000177209 00000 n
-0000177274 00000 n
-0000177339 00000 n
-0000177404 00000 n
-0000177469 00000 n
-0000177534 00000 n
-0000177599 00000 n
-0000177664 00000 n
-0000177729 00000 n
-0000177794 00000 n
-0000177859 00000 n
-0000177922 00000 n
-0000177987 00000 n
-0000178052 00000 n
-0000178117 00000 n
-0000178182 00000 n
-0000178247 00000 n
-0000178312 00000 n
-0000178377 00000 n
-0000178442 00000 n
-0000178506 00000 n
-0000178571 00000 n
-0000178636 00000 n
-0000178701 00000 n
-0000178765 00000 n
-0000178830 00000 n
-0000178895 00000 n
-0000178960 00000 n
-0000179024 00000 n
-0000185497 00000 n
-0000181938 00000 n
-0000179252 00000 n
-0000182062 00000 n
-0000182126 00000 n
-0000182191 00000 n
-0000182255 00000 n
-0000182320 00000 n
-0000182385 00000 n
-0000182450 00000 n
-0000182515 00000 n
-0000182580 00000 n
-0000182645 00000 n
-0000182710 00000 n
-0000182775 00000 n
-0000182839 00000 n
-0000182904 00000 n
-0000182969 00000 n
-0000183033 00000 n
-0000183098 00000 n
-0000183163 00000 n
-0000183228 00000 n
-0000183293 00000 n
-0000183358 00000 n
-0000183423 00000 n
-0000183487 00000 n
-0000183552 00000 n
-0000183617 00000 n
-0000183682 00000 n
-0000183747 00000 n
-0000183812 00000 n
-0000183877 00000 n
-0000183941 00000 n
-0000184006 00000 n
-0000184071 00000 n
-0000184136 00000 n
-0000184201 00000 n
-0000184266 00000 n
-0000184331 00000 n
-0000184396 00000 n
-0000184461 00000 n
-0000184525 00000 n
-0000184590 00000 n
-0000184655 00000 n
-0000184720 00000 n
-0000184785 00000 n
-0000184850 00000 n
-0000184915 00000 n
-0000184980 00000 n
-0000185045 00000 n
-0000185109 00000 n
-0000185174 00000 n
-0000185239 00000 n
-0000185304 00000 n
-0000185369 00000 n
-0000185433 00000 n
-0000191255 00000 n
-0000188218 00000 n
-0000185674 00000 n
-0000188342 00000 n
-0000188406 00000 n
-0000188471 00000 n
-0000188535 00000 n
-0000188600 00000 n
-0000188665 00000 n
-0000188730 00000 n
-0000188795 00000 n
-0000188860 00000 n
-0000188925 00000 n
-0000188990 00000 n
-0000189055 00000 n
-0000189119 00000 n
-0000189184 00000 n
-0000189249 00000 n
-0000189314 00000 n
-0000189379 00000 n
-0000189444 00000 n
-0000189509 00000 n
-0000189574 00000 n
-0000189639 00000 n
-0000189704 00000 n
-0000189769 00000 n
-0000189834 00000 n
-0000189899 00000 n
-0000189964 00000 n
-0000190029 00000 n
-0000190094 00000 n
-0000190157 00000 n
-0000190222 00000 n
-0000190287 00000 n
-0000190352 00000 n
-0000190417 00000 n
-0000190482 00000 n
-0000190547 00000 n
-0000190612 00000 n
-0000190677 00000 n
-0000190742 00000 n
-0000190807 00000 n
-0000190868 00000 n
-0000190933 00000 n
-0000190998 00000 n
-0000191063 00000 n
-0000191191 00000 n
-0000197487 00000 n
-0000193410 00000 n
-0000191445 00000 n
-0000193534 00000 n
-0000193598 00000 n
-0000193661 00000 n
-0000193726 00000 n
-0000193791 00000 n
-0000193856 00000 n
-0000193921 00000 n
-0000193986 00000 n
-0000194051 00000 n
-0000194116 00000 n
-0000194181 00000 n
-0000194245 00000 n
-0000194310 00000 n
-0000194375 00000 n
-0000194440 00000 n
-0000194505 00000 n
-0000194570 00000 n
-0000194635 00000 n
-0000194700 00000 n
-0000194765 00000 n
-0000194829 00000 n
-0000194894 00000 n
-0000194959 00000 n
-0000195024 00000 n
-0000195089 00000 n
-0000195154 00000 n
-0000195219 00000 n
-0000195284 00000 n
-0000195349 00000 n
-0000195413 00000 n
-0000195478 00000 n
-0000195543 00000 n
-0000195608 00000 n
-0000195673 00000 n
-0000195738 00000 n
-0000195803 00000 n
-0000195868 00000 n
-0000195933 00000 n
-0000195998 00000 n
-0000196062 00000 n
-0000196127 00000 n
-0000196192 00000 n
-0000196257 00000 n
-0000196322 00000 n
-0000196387 00000 n
-0000196452 00000 n
-0000196517 00000 n
-0000196582 00000 n
-0000196645 00000 n
-0000196710 00000 n
-0000196775 00000 n
-0000196840 00000 n
-0000196905 00000 n
-0000196970 00000 n
-0000197035 00000 n
-0000197100 00000 n
-0000197165 00000 n
-0000197229 00000 n
-0000197294 00000 n
-0000197359 00000 n
-0000197423 00000 n
-0000203384 00000 n
-0000199568 00000 n
-0000197638 00000 n
-0000199692 00000 n
-0000199756 00000 n
-0000199821 00000 n
-0000199885 00000 n
-0000199950 00000 n
-0000200015 00000 n
-0000200080 00000 n
-0000200145 00000 n
-0000200210 00000 n
-0000200275 00000 n
-0000200339 00000 n
-0000200404 00000 n
-0000200469 00000 n
-0000200534 00000 n
-0000200599 00000 n
-0000200664 00000 n
-0000200729 00000 n
-0000200794 00000 n
-0000200859 00000 n
-0000200923 00000 n
-0000200988 00000 n
-0000201053 00000 n
-0000201118 00000 n
-0000201183 00000 n
-0000201248 00000 n
-0000201313 00000 n
-0000201378 00000 n
-0000201443 00000 n
-0000201507 00000 n
-0000201572 00000 n
-0000201637 00000 n
-0000201702 00000 n
-0000201767 00000 n
-0000201832 00000 n
-0000201897 00000 n
-0000201962 00000 n
-0000202027 00000 n
-0000202154 00000 n
-0000202219 00000 n
-0000202283 00000 n
-0000202348 00000 n
-0000202413 00000 n
-0000202478 00000 n
-0000202543 00000 n
-0000202608 00000 n
-0000202673 00000 n
-0000202738 00000 n
-0000202803 00000 n
-0000202866 00000 n
-0000202931 00000 n
-0000202996 00000 n
-0000203061 00000 n
-0000203126 00000 n
-0000203191 00000 n
-0000203256 00000 n
-0000203320 00000 n
-0000208982 00000 n
-0000206458 00000 n
-0000203548 00000 n
-0000206582 00000 n
-0000206646 00000 n
-0000206711 00000 n
-0000206775 00000 n
-0000206840 00000 n
-0000206905 00000 n
-0000206970 00000 n
-0000207035 00000 n
-0000207100 00000 n
-0000207165 00000 n
-0000207230 00000 n
-0000207295 00000 n
-0000207423 00000 n
-0000207488 00000 n
-0000207553 00000 n
-0000207618 00000 n
-0000207683 00000 n
-0000207748 00000 n
-0000207813 00000 n
-0000207878 00000 n
-0000207943 00000 n
-0000208008 00000 n
-0000208073 00000 n
-0000208138 00000 n
-0000208203 00000 n
-0000208268 00000 n
-0000208333 00000 n
-0000208397 00000 n
-0000208462 00000 n
-0000208527 00000 n
-0000208592 00000 n
-0000208657 00000 n
-0000208722 00000 n
-0000208787 00000 n
-0000208852 00000 n
-0000208917 00000 n
-0000215195 00000 n
-0000211382 00000 n
-0000209172 00000 n
-0000211506 00000 n
-0000211570 00000 n
-0000211635 00000 n
-0000211699 00000 n
-0000211764 00000 n
-0000211829 00000 n
-0000211894 00000 n
-0000211958 00000 n
-0000212023 00000 n
-0000212088 00000 n
-0000212152 00000 n
-0000212217 00000 n
-0000212282 00000 n
-0000212347 00000 n
-0000212412 00000 n
-0000212477 00000 n
-0000212605 00000 n
-0000212669 00000 n
-0000212734 00000 n
-0000212799 00000 n
-0000212864 00000 n
-0000212929 00000 n
-0000212994 00000 n
-0000213059 00000 n
-0000213124 00000 n
-0000213189 00000 n
-0000213316 00000 n
-0000213381 00000 n
-0000213446 00000 n
-0000213511 00000 n
-0000213576 00000 n
-0000213641 00000 n
-0000213706 00000 n
-0000213770 00000 n
-0000213835 00000 n
-0000213900 00000 n
-0000213965 00000 n
-0000214030 00000 n
-0000214095 00000 n
-0000214160 00000 n
-0000214225 00000 n
-0000214290 00000 n
-0000214353 00000 n
-0000214418 00000 n
-0000214483 00000 n
-0000214548 00000 n
-0000214613 00000 n
-0000214678 00000 n
-0000214743 00000 n
-0000214808 00000 n
-0000214873 00000 n
-0000214937 00000 n
-0000215002 00000 n
-0000215067 00000 n
-0000215131 00000 n
-0000220497 00000 n
-0000217520 00000 n
-0000215372 00000 n
-0000217645 00000 n
-0000217709 00000 n
-0000217774 00000 n
-0000217838 00000 n
-0000217903 00000 n
-0000217968 00000 n
-0000218033 00000 n
-0000218098 00000 n
-0000218163 00000 n
-0000218228 00000 n
-0000218293 00000 n
-0000218358 00000 n
-0000218423 00000 n
-0000218488 00000 n
-0000218552 00000 n
-0000218617 00000 n
-0000218682 00000 n
-0000218747 00000 n
-0000218812 00000 n
-0000218877 00000 n
-0000218942 00000 n
-0000219007 00000 n
-0000219072 00000 n
-0000219137 00000 n
-0000219202 00000 n
-0000219267 00000 n
-0000219332 00000 n
-0000219397 00000 n
-0000219462 00000 n
-0000219527 00000 n
-0000219592 00000 n
-0000219720 00000 n
-0000219785 00000 n
-0000219850 00000 n
-0000219915 00000 n
-0000219979 00000 n
-0000220043 00000 n
-0000220108 00000 n
-0000220172 00000 n
-0000220237 00000 n
-0000220302 00000 n
-0000220367 00000 n
-0000220432 00000 n
-0000595771 00000 n
-0000229596 00000 n
-0000225739 00000 n
-0000223928 00000 n
-0000220674 00000 n
-0000224053 00000 n
-0000224180 00000 n
-0000224245 00000 n
-0000224310 00000 n
-0000224375 00000 n
-0000224440 00000 n
-0000224505 00000 n
-0000224569 00000 n
-0000224634 00000 n
-0000224699 00000 n
-0000224764 00000 n
-0000224829 00000 n
-0000224894 00000 n
-0000224959 00000 n
-0000225024 00000 n
-0000225089 00000 n
-0000225154 00000 n
-0000225219 00000 n
-0000225284 00000 n
-0000225349 00000 n
-0000225414 00000 n
-0000225479 00000 n
-0000225544 00000 n
-0000225609 00000 n
-0000225674 00000 n
-0000229752 00000 n
-0000231594 00000 n
-0000229414 00000 n
-0000225968 00000 n
-0000229910 00000 n
-0000229974 00000 n
-0000230039 00000 n
-0000230104 00000 n
-0000230169 00000 n
-0000230234 00000 n
-0000230299 00000 n
-0000230363 00000 n
-0000230428 00000 n
-0000230492 00000 n
-0000230557 00000 n
-0000230622 00000 n
-0000230687 00000 n
-0000230752 00000 n
-0000230817 00000 n
-0000230882 00000 n
-0000230947 00000 n
-0000231012 00000 n
-0000231076 00000 n
-0000231141 00000 n
-0000231206 00000 n
-0000231271 00000 n
-0000231336 00000 n
-0000231401 00000 n
-0000231466 00000 n
-0000231530 00000 n
-0000229556 00000 n
-0000237619 00000 n
-0000234516 00000 n
-0000231862 00000 n
-0000234641 00000 n
-0000234705 00000 n
-0000234770 00000 n
-0000234834 00000 n
-0000234899 00000 n
-0000234964 00000 n
-0000235029 00000 n
-0000235093 00000 n
-0000235158 00000 n
-0000235223 00000 n
-0000235288 00000 n
-0000235353 00000 n
-0000235418 00000 n
-0000235483 00000 n
-0000235548 00000 n
-0000235613 00000 n
-0000235740 00000 n
-0000235805 00000 n
-0000235870 00000 n
-0000235935 00000 n
-0000236000 00000 n
-0000236065 00000 n
-0000236130 00000 n
-0000236195 00000 n
-0000236260 00000 n
-0000236325 00000 n
-0000236390 00000 n
-0000236453 00000 n
-0000236518 00000 n
-0000236583 00000 n
-0000236648 00000 n
-0000236713 00000 n
-0000236778 00000 n
-0000236843 00000 n
-0000236908 00000 n
-0000236973 00000 n
-0000237037 00000 n
-0000237102 00000 n
-0000237167 00000 n
-0000237232 00000 n
-0000237297 00000 n
-0000237362 00000 n
-0000237427 00000 n
-0000237492 00000 n
-0000237556 00000 n
-0000243929 00000 n
-0000240952 00000 n
-0000237822 00000 n
-0000241077 00000 n
-0000241141 00000 n
-0000241206 00000 n
-0000241270 00000 n
-0000241335 00000 n
-0000241400 00000 n
-0000241465 00000 n
-0000241530 00000 n
-0000241595 00000 n
-0000241660 00000 n
-0000241725 00000 n
-0000241790 00000 n
-0000241854 00000 n
-0000241919 00000 n
-0000241984 00000 n
-0000242049 00000 n
-0000242114 00000 n
-0000242179 00000 n
-0000242244 00000 n
-0000242309 00000 n
-0000242374 00000 n
-0000242438 00000 n
-0000242503 00000 n
-0000242568 00000 n
-0000242633 00000 n
-0000242698 00000 n
-0000242763 00000 n
-0000242828 00000 n
-0000242893 00000 n
-0000242958 00000 n
-0000243022 00000 n
-0000243087 00000 n
-0000243152 00000 n
-0000243217 00000 n
-0000243282 00000 n
-0000243347 00000 n
-0000243412 00000 n
-0000243477 00000 n
-0000243542 00000 n
-0000243607 00000 n
-0000243671 00000 n
-0000243736 00000 n
-0000243801 00000 n
-0000243865 00000 n
-0000247952 00000 n
-0000248109 00000 n
-0000250079 00000 n
-0000247770 00000 n
-0000244132 00000 n
-0000248266 00000 n
-0000248330 00000 n
-0000248395 00000 n
-0000248459 00000 n
-0000248524 00000 n
-0000248589 00000 n
-0000248653 00000 n
-0000248718 00000 n
-0000248783 00000 n
-0000248847 00000 n
-0000248912 00000 n
-0000248977 00000 n
-0000249041 00000 n
-0000249106 00000 n
-0000249171 00000 n
-0000249236 00000 n
-0000249301 00000 n
-0000249366 00000 n
-0000249431 00000 n
-0000249496 00000 n
-0000249561 00000 n
-0000249626 00000 n
-0000249690 00000 n
-0000249755 00000 n
-0000249820 00000 n
-0000249885 00000 n
-0000249950 00000 n
-0000250015 00000 n
-0000247912 00000 n
-0000256168 00000 n
-0000252540 00000 n
-0000250360 00000 n
-0000252665 00000 n
-0000252729 00000 n
-0000252794 00000 n
-0000252858 00000 n
-0000252923 00000 n
-0000252988 00000 n
-0000253053 00000 n
-0000253118 00000 n
-0000253183 00000 n
-0000253248 00000 n
-0000253313 00000 n
-0000253378 00000 n
-0000253443 00000 n
-0000253508 00000 n
-0000253572 00000 n
-0000253637 00000 n
-0000253702 00000 n
-0000253767 00000 n
-0000253832 00000 n
-0000253897 00000 n
-0000253962 00000 n
-0000254027 00000 n
-0000254092 00000 n
-0000254156 00000 n
-0000254221 00000 n
-0000254286 00000 n
-0000254351 00000 n
-0000254416 00000 n
-0000254481 00000 n
-0000254546 00000 n
-0000254611 00000 n
-0000254676 00000 n
-0000254741 00000 n
-0000254806 00000 n
-0000254871 00000 n
-0000254936 00000 n
-0000255001 00000 n
-0000255066 00000 n
-0000255131 00000 n
-0000255196 00000 n
-0000255261 00000 n
-0000255326 00000 n
-0000255390 00000 n
-0000255454 00000 n
-0000255519 00000 n
-0000255584 00000 n
-0000255649 00000 n
-0000255714 00000 n
-0000255779 00000 n
-0000255844 00000 n
-0000255908 00000 n
-0000255973 00000 n
-0000256038 00000 n
-0000256103 00000 n
-0000262299 00000 n
-0000258283 00000 n
-0000256371 00000 n
-0000258408 00000 n
-0000258472 00000 n
-0000258537 00000 n
-0000258601 00000 n
-0000258666 00000 n
-0000258731 00000 n
-0000258796 00000 n
-0000258861 00000 n
-0000258926 00000 n
-0000258991 00000 n
-0000259056 00000 n
-0000259121 00000 n
-0000259186 00000 n
-0000259251 00000 n
-0000259315 00000 n
-0000259380 00000 n
-0000259445 00000 n
-0000259510 00000 n
-0000259575 00000 n
-0000259640 00000 n
-0000259705 00000 n
-0000259770 00000 n
-0000259835 00000 n
-0000259899 00000 n
-0000259964 00000 n
-0000260029 00000 n
-0000260094 00000 n
-0000260159 00000 n
-0000260224 00000 n
-0000260289 00000 n
-0000260352 00000 n
-0000260417 00000 n
-0000260482 00000 n
-0000260547 00000 n
-0000260612 00000 n
-0000260677 00000 n
-0000260742 00000 n
-0000260807 00000 n
-0000260872 00000 n
-0000260937 00000 n
-0000261002 00000 n
-0000261067 00000 n
-0000261132 00000 n
-0000261197 00000 n
-0000261262 00000 n
-0000261327 00000 n
-0000261392 00000 n
-0000261457 00000 n
-0000261522 00000 n
-0000261586 00000 n
-0000261651 00000 n
-0000261716 00000 n
-0000261781 00000 n
-0000261846 00000 n
-0000261911 00000 n
-0000261976 00000 n
-0000262041 00000 n
-0000262106 00000 n
-0000262171 00000 n
-0000262235 00000 n
-0000265483 00000 n
-0000268234 00000 n
-0000265310 00000 n
-0000262463 00000 n
-0000265641 00000 n
-0000265705 00000 n
-0000265770 00000 n
-0000265834 00000 n
-0000265899 00000 n
-0000265964 00000 n
-0000266029 00000 n
-0000266094 00000 n
-0000266159 00000 n
-0000266224 00000 n
-0000266289 00000 n
-0000266354 00000 n
-0000266418 00000 n
-0000266483 00000 n
-0000266548 00000 n
-0000266613 00000 n
-0000266678 00000 n
-0000266743 00000 n
-0000266808 00000 n
-0000266873 00000 n
-0000266938 00000 n
-0000267003 00000 n
-0000267067 00000 n
-0000267132 00000 n
-0000267197 00000 n
-0000267262 00000 n
-0000267327 00000 n
-0000267392 00000 n
-0000267457 00000 n
-0000267522 00000 n
-0000267587 00000 n
-0000267651 00000 n
-0000267716 00000 n
-0000267781 00000 n
-0000267846 00000 n
-0000267910 00000 n
-0000267975 00000 n
-0000268040 00000 n
-0000268105 00000 n
-0000268170 00000 n
-0000265452 00000 n
-0000274296 00000 n
-0000270153 00000 n
-0000268502 00000 n
-0000270278 00000 n
-0000270342 00000 n
-0000270407 00000 n
-0000270471 00000 n
-0000270536 00000 n
-0000270601 00000 n
-0000270666 00000 n
-0000270731 00000 n
-0000270796 00000 n
-0000270861 00000 n
-0000270926 00000 n
-0000270991 00000 n
-0000271055 00000 n
-0000271120 00000 n
-0000271185 00000 n
-0000271250 00000 n
-0000271315 00000 n
-0000271379 00000 n
-0000271444 00000 n
-0000271509 00000 n
-0000271574 00000 n
-0000271638 00000 n
-0000271703 00000 n
-0000271768 00000 n
-0000271833 00000 n
-0000271898 00000 n
-0000271963 00000 n
-0000272028 00000 n
-0000272093 00000 n
-0000272158 00000 n
-0000272222 00000 n
-0000272287 00000 n
-0000272352 00000 n
-0000272417 00000 n
-0000272482 00000 n
-0000272547 00000 n
-0000272612 00000 n
-0000272677 00000 n
-0000272742 00000 n
-0000272807 00000 n
-0000272871 00000 n
-0000272936 00000 n
-0000273001 00000 n
-0000273066 00000 n
-0000273131 00000 n
-0000273196 00000 n
-0000273261 00000 n
-0000273326 00000 n
-0000273391 00000 n
-0000273454 00000 n
-0000273519 00000 n
-0000273584 00000 n
-0000273649 00000 n
-0000273714 00000 n
-0000273779 00000 n
-0000273844 00000 n
-0000273909 00000 n
-0000273974 00000 n
-0000274038 00000 n
-0000274103 00000 n
-0000274168 00000 n
-0000274232 00000 n
-0000280172 00000 n
-0000277136 00000 n
-0000274460 00000 n
-0000277261 00000 n
-0000277325 00000 n
-0000277390 00000 n
-0000277454 00000 n
-0000277519 00000 n
-0000277584 00000 n
-0000277649 00000 n
-0000277714 00000 n
-0000277779 00000 n
-0000277844 00000 n
-0000277909 00000 n
-0000277974 00000 n
-0000278038 00000 n
-0000278101 00000 n
-0000278166 00000 n
-0000278231 00000 n
-0000278296 00000 n
-0000278361 00000 n
-0000278425 00000 n
-0000278490 00000 n
-0000278554 00000 n
-0000278619 00000 n
-0000278684 00000 n
-0000278749 00000 n
-0000278814 00000 n
-0000278879 00000 n
-0000278944 00000 n
-0000279007 00000 n
-0000279072 00000 n
-0000279137 00000 n
-0000279202 00000 n
-0000279267 00000 n
-0000279332 00000 n
-0000279397 00000 n
-0000279461 00000 n
-0000279525 00000 n
-0000279590 00000 n
-0000279655 00000 n
-0000279720 00000 n
-0000279785 00000 n
-0000279850 00000 n
-0000279915 00000 n
-0000279980 00000 n
-0000280044 00000 n
-0000280108 00000 n
-0000595935 00000 n
-0000285852 00000 n
-0000283716 00000 n
-0000280375 00000 n
-0000283841 00000 n
-0000283905 00000 n
-0000283970 00000 n
-0000284034 00000 n
-0000284099 00000 n
-0000284164 00000 n
-0000284229 00000 n
-0000284294 00000 n
-0000284359 00000 n
-0000284424 00000 n
-0000284489 00000 n
-0000284554 00000 n
-0000284619 00000 n
-0000284684 00000 n
-0000284749 00000 n
-0000284814 00000 n
-0000284879 00000 n
-0000284944 00000 n
-0000285009 00000 n
-0000285074 00000 n
-0000285139 00000 n
-0000285203 00000 n
-0000285268 00000 n
-0000285333 00000 n
-0000285397 00000 n
-0000285462 00000 n
-0000285527 00000 n
-0000285592 00000 n
-0000285657 00000 n
-0000285722 00000 n
-0000285787 00000 n
-0000294300 00000 n
-0000291442 00000 n
-0000288528 00000 n
-0000286068 00000 n
-0000288653 00000 n
-0000288717 00000 n
-0000288781 00000 n
-0000288846 00000 n
-0000288911 00000 n
-0000288976 00000 n
-0000289041 00000 n
-0000289106 00000 n
-0000289171 00000 n
-0000289236 00000 n
-0000289300 00000 n
-0000289365 00000 n
-0000289429 00000 n
-0000289494 00000 n
-0000289558 00000 n
-0000289623 00000 n
-0000289688 00000 n
-0000289753 00000 n
-0000289818 00000 n
-0000289883 00000 n
-0000289948 00000 n
-0000290013 00000 n
-0000290078 00000 n
-0000290142 00000 n
-0000290207 00000 n
-0000290272 00000 n
-0000290337 00000 n
-0000290402 00000 n
-0000290467 00000 n
-0000290532 00000 n
-0000290597 00000 n
-0000290662 00000 n
-0000290727 00000 n
-0000290792 00000 n
-0000290857 00000 n
-0000290922 00000 n
-0000290987 00000 n
-0000291052 00000 n
-0000291117 00000 n
-0000291182 00000 n
-0000291247 00000 n
-0000291312 00000 n
-0000291377 00000 n
-0000298022 00000 n
-0000294127 00000 n
-0000291645 00000 n
-0000294458 00000 n
-0000294522 00000 n
-0000294587 00000 n
-0000294652 00000 n
-0000294717 00000 n
-0000294781 00000 n
-0000294846 00000 n
-0000294911 00000 n
-0000294976 00000 n
-0000295041 00000 n
-0000295106 00000 n
-0000295171 00000 n
-0000295236 00000 n
-0000295301 00000 n
-0000295365 00000 n
-0000295430 00000 n
-0000295494 00000 n
-0000295622 00000 n
-0000295687 00000 n
-0000295752 00000 n
-0000295817 00000 n
-0000295882 00000 n
-0000295947 00000 n
-0000296012 00000 n
-0000296077 00000 n
-0000296141 00000 n
-0000296206 00000 n
-0000296271 00000 n
-0000296336 00000 n
-0000296401 00000 n
-0000296466 00000 n
-0000296531 00000 n
-0000296596 00000 n
-0000296661 00000 n
-0000296725 00000 n
-0000296790 00000 n
-0000296855 00000 n
-0000296920 00000 n
-0000296985 00000 n
-0000297050 00000 n
-0000297115 00000 n
-0000297180 00000 n
-0000297245 00000 n
-0000297309 00000 n
-0000297374 00000 n
-0000297439 00000 n
-0000297504 00000 n
-0000297569 00000 n
-0000297634 00000 n
-0000297699 00000 n
-0000297764 00000 n
-0000297829 00000 n
-0000297893 00000 n
-0000297958 00000 n
-0000294269 00000 n
-0000304189 00000 n
-0000300371 00000 n
-0000298251 00000 n
-0000300496 00000 n
-0000300560 00000 n
-0000300625 00000 n
-0000300689 00000 n
-0000300754 00000 n
-0000300819 00000 n
-0000300884 00000 n
-0000300949 00000 n
-0000301014 00000 n
-0000301079 00000 n
-0000301144 00000 n
-0000301209 00000 n
-0000301273 00000 n
-0000301338 00000 n
-0000301403 00000 n
-0000301468 00000 n
-0000301533 00000 n
-0000301598 00000 n
-0000301663 00000 n
-0000301728 00000 n
-0000301792 00000 n
-0000301857 00000 n
-0000301922 00000 n
-0000301986 00000 n
-0000302051 00000 n
-0000302115 00000 n
-0000302180 00000 n
-0000302245 00000 n
-0000302310 00000 n
-0000302375 00000 n
-0000302440 00000 n
-0000302505 00000 n
-0000302570 00000 n
-0000302635 00000 n
-0000302699 00000 n
-0000302764 00000 n
-0000302828 00000 n
-0000302893 00000 n
-0000302958 00000 n
-0000303023 00000 n
-0000303088 00000 n
-0000303153 00000 n
-0000303218 00000 n
-0000303283 00000 n
-0000303348 00000 n
-0000303412 00000 n
-0000303477 00000 n
-0000303542 00000 n
-0000303607 00000 n
-0000303672 00000 n
-0000303737 00000 n
-0000303802 00000 n
-0000303867 00000 n
-0000303932 00000 n
-0000303996 00000 n
-0000304061 00000 n
-0000304125 00000 n
-0000310143 00000 n
-0000306064 00000 n
-0000304353 00000 n
-0000306189 00000 n
-0000306253 00000 n
-0000306318 00000 n
-0000306382 00000 n
-0000306447 00000 n
-0000306512 00000 n
-0000306577 00000 n
-0000306642 00000 n
-0000306707 00000 n
-0000306772 00000 n
-0000306837 00000 n
-0000306902 00000 n
-0000306966 00000 n
-0000307031 00000 n
-0000307096 00000 n
-0000307161 00000 n
-0000307226 00000 n
-0000307291 00000 n
-0000307356 00000 n
-0000307421 00000 n
-0000307486 00000 n
-0000307550 00000 n
-0000307615 00000 n
-0000307680 00000 n
-0000307745 00000 n
-0000307810 00000 n
-0000307875 00000 n
-0000307940 00000 n
-0000308005 00000 n
-0000308070 00000 n
-0000308134 00000 n
-0000308199 00000 n
-0000308263 00000 n
-0000308328 00000 n
-0000308393 00000 n
-0000308458 00000 n
-0000308522 00000 n
-0000308587 00000 n
-0000308652 00000 n
-0000308717 00000 n
-0000308782 00000 n
-0000308847 00000 n
-0000308912 00000 n
-0000308977 00000 n
-0000309042 00000 n
-0000309106 00000 n
-0000309171 00000 n
-0000309236 00000 n
-0000309301 00000 n
-0000309366 00000 n
-0000309431 00000 n
-0000309496 00000 n
-0000309561 00000 n
-0000309626 00000 n
-0000309691 00000 n
-0000309756 00000 n
-0000309820 00000 n
-0000309885 00000 n
-0000309950 00000 n
-0000310015 00000 n
-0000310079 00000 n
-0000315812 00000 n
-0000312899 00000 n
-0000310307 00000 n
-0000313024 00000 n
-0000313088 00000 n
-0000313153 00000 n
-0000313217 00000 n
-0000313282 00000 n
-0000313347 00000 n
-0000313412 00000 n
-0000313477 00000 n
-0000313542 00000 n
-0000313607 00000 n
-0000313672 00000 n
-0000313737 00000 n
-0000313802 00000 n
-0000313867 00000 n
-0000313932 00000 n
-0000313997 00000 n
-0000314062 00000 n
-0000314126 00000 n
-0000314191 00000 n
-0000314256 00000 n
-0000314321 00000 n
-0000314386 00000 n
-0000314451 00000 n
-0000314516 00000 n
-0000314581 00000 n
-0000314646 00000 n
-0000314710 00000 n
-0000314775 00000 n
-0000314840 00000 n
-0000314904 00000 n
-0000314968 00000 n
-0000315033 00000 n
-0000315098 00000 n
-0000315163 00000 n
-0000315228 00000 n
-0000315293 00000 n
-0000315358 00000 n
-0000315423 00000 n
-0000315488 00000 n
-0000315553 00000 n
-0000315618 00000 n
-0000315683 00000 n
-0000315748 00000 n
-0000318293 00000 n
-0000321627 00000 n
-0000318120 00000 n
-0000316015 00000 n
-0000318451 00000 n
-0000318515 00000 n
-0000318579 00000 n
-0000318644 00000 n
-0000318709 00000 n
-0000318774 00000 n
-0000318839 00000 n
-0000318904 00000 n
-0000318969 00000 n
-0000319032 00000 n
-0000319097 00000 n
-0000319161 00000 n
-0000319226 00000 n
-0000319291 00000 n
-0000319356 00000 n
-0000319421 00000 n
-0000319486 00000 n
-0000319551 00000 n
-0000319615 00000 n
-0000319680 00000 n
-0000319745 00000 n
-0000319810 00000 n
-0000319875 00000 n
-0000319940 00000 n
-0000320005 00000 n
-0000320070 00000 n
-0000320135 00000 n
-0000320198 00000 n
-0000320263 00000 n
-0000320328 00000 n
-0000320393 00000 n
-0000320458 00000 n
-0000320523 00000 n
-0000320588 00000 n
-0000320653 00000 n
-0000320718 00000 n
-0000320783 00000 n
-0000320848 00000 n
-0000320913 00000 n
-0000320977 00000 n
-0000321042 00000 n
-0000321107 00000 n
-0000321172 00000 n
-0000321237 00000 n
-0000321302 00000 n
-0000321367 00000 n
-0000321432 00000 n
-0000321497 00000 n
-0000321562 00000 n
-0000318262 00000 n
-0000327331 00000 n
-0000323964 00000 n
-0000321856 00000 n
-0000324089 00000 n
-0000324216 00000 n
-0000324281 00000 n
-0000324346 00000 n
-0000324410 00000 n
-0000324475 00000 n
-0000324540 00000 n
-0000324605 00000 n
-0000324670 00000 n
-0000324735 00000 n
-0000324800 00000 n
-0000324865 00000 n
-0000324930 00000 n
-0000324994 00000 n
-0000325059 00000 n
-0000325124 00000 n
-0000325189 00000 n
-0000325254 00000 n
-0000325319 00000 n
-0000325384 00000 n
-0000325449 00000 n
-0000325514 00000 n
-0000325578 00000 n
-0000325643 00000 n
-0000325708 00000 n
-0000325773 00000 n
-0000325838 00000 n
-0000325903 00000 n
-0000325968 00000 n
-0000326033 00000 n
-0000326098 00000 n
-0000326163 00000 n
-0000326227 00000 n
-0000326292 00000 n
-0000326357 00000 n
-0000326422 00000 n
-0000326487 00000 n
-0000326552 00000 n
-0000326617 00000 n
-0000326682 00000 n
-0000326747 00000 n
-0000326811 00000 n
-0000326876 00000 n
-0000326941 00000 n
-0000327006 00000 n
-0000327071 00000 n
-0000327136 00000 n
-0000327201 00000 n
-0000327266 00000 n
-0000332855 00000 n
-0000330335 00000 n
-0000327534 00000 n
-0000330460 00000 n
-0000330587 00000 n
-0000330651 00000 n
-0000330716 00000 n
-0000330781 00000 n
-0000330846 00000 n
-0000330911 00000 n
-0000330976 00000 n
-0000331041 00000 n
-0000331106 00000 n
-0000331234 00000 n
-0000331299 00000 n
-0000331364 00000 n
-0000331429 00000 n
-0000331493 00000 n
-0000331558 00000 n
-0000331623 00000 n
-0000331688 00000 n
-0000331753 00000 n
-0000331818 00000 n
-0000331883 00000 n
-0000331948 00000 n
-0000332013 00000 n
-0000332077 00000 n
-0000332142 00000 n
-0000332207 00000 n
-0000332272 00000 n
-0000332337 00000 n
-0000332402 00000 n
-0000332467 00000 n
-0000332532 00000 n
-0000332597 00000 n
-0000332662 00000 n
-0000332726 00000 n
-0000332791 00000 n
-0000338472 00000 n
-0000335300 00000 n
-0000333084 00000 n
-0000335425 00000 n
-0000335489 00000 n
-0000335554 00000 n
-0000335619 00000 n
-0000335684 00000 n
-0000335749 00000 n
-0000335814 00000 n
-0000335879 00000 n
-0000335944 00000 n
-0000336009 00000 n
-0000336074 00000 n
-0000336139 00000 n
-0000336204 00000 n
-0000336269 00000 n
-0000336334 00000 n
-0000336399 00000 n
-0000336464 00000 n
-0000336529 00000 n
-0000336594 00000 n
-0000336658 00000 n
-0000336723 00000 n
-0000336788 00000 n
-0000336853 00000 n
-0000336918 00000 n
-0000336983 00000 n
-0000337048 00000 n
-0000337113 00000 n
-0000337178 00000 n
-0000337243 00000 n
-0000337308 00000 n
-0000337373 00000 n
-0000337438 00000 n
-0000337503 00000 n
-0000337568 00000 n
-0000337633 00000 n
-0000337698 00000 n
-0000337762 00000 n
-0000337827 00000 n
-0000337892 00000 n
-0000337957 00000 n
-0000338085 00000 n
-0000338149 00000 n
-0000338214 00000 n
-0000338279 00000 n
-0000338344 00000 n
-0000338408 00000 n
-0000596099 00000 n
-0000343568 00000 n
-0000340855 00000 n
-0000338675 00000 n
-0000340980 00000 n
-0000341044 00000 n
-0000341109 00000 n
-0000341174 00000 n
-0000341238 00000 n
-0000341303 00000 n
-0000341368 00000 n
-0000341433 00000 n
-0000341498 00000 n
-0000341563 00000 n
-0000341628 00000 n
-0000341693 00000 n
-0000341758 00000 n
-0000341821 00000 n
-0000341886 00000 n
-0000341951 00000 n
-0000342016 00000 n
-0000342081 00000 n
-0000342146 00000 n
-0000342210 00000 n
-0000342275 00000 n
-0000342340 00000 n
-0000342405 00000 n
-0000342470 00000 n
-0000342535 00000 n
-0000342599 00000 n
-0000342664 00000 n
-0000342729 00000 n
-0000342794 00000 n
-0000342859 00000 n
-0000342924 00000 n
-0000342989 00000 n
-0000343054 00000 n
-0000343119 00000 n
-0000343183 00000 n
-0000343248 00000 n
-0000343376 00000 n
-0000343440 00000 n
-0000343504 00000 n
-0000347191 00000 n
-0000347347 00000 n
-0000347503 00000 n
-0000347661 00000 n
-0000347822 00000 n
-0000347982 00000 n
-0000348137 00000 n
-0000348298 00000 n
-0000348457 00000 n
-0000356458 00000 n
-0000349319 00000 n
-0000346946 00000 n
-0000343758 00000 n
-0000348616 00000 n
-0000348680 00000 n
-0000348744 00000 n
-0000348808 00000 n
-0000348872 00000 n
-0000348936 00000 n
-0000349000 00000 n
-0000349064 00000 n
-0000349128 00000 n
-0000349255 00000 n
-0000347088 00000 n
-0000356614 00000 n
-0000356775 00000 n
-0000356936 00000 n
-0000357102 00000 n
-0000357269 00000 n
-0000357434 00000 n
-0000357593 00000 n
-0000357759 00000 n
-0000357926 00000 n
-0000358093 00000 n
-0000358252 00000 n
-0000358419 00000 n
-0000358586 00000 n
-0000358746 00000 n
-0000358907 00000 n
-0000359063 00000 n
-0000359223 00000 n
-0000359383 00000 n
-0000359543 00000 n
-0000359703 00000 n
-0000359863 00000 n
-0000360019 00000 n
-0000360180 00000 n
-0000360341 00000 n
-0000360508 00000 n
-0000360674 00000 n
-0000360841 00000 n
-0000361008 00000 n
-0000361175 00000 n
-0000361341 00000 n
-0000361506 00000 n
-0000361673 00000 n
-0000361840 00000 n
-0000362008 00000 n
-0000362175 00000 n
-0000362343 00000 n
-0000362504 00000 n
-0000362671 00000 n
-0000362838 00000 n
-0000363005 00000 n
-0000363172 00000 n
-0000363339 00000 n
-0000363505 00000 n
-0000363672 00000 n
-0000363892 00000 n
-0000355889 00000 n
-0000349496 00000 n
-0000363828 00000 n
-0000356031 00000 n
-0000364148 00000 n
-0000364173 00000 n
-0000376158 00000 n
-0000364401 00000 n
-0000364504 00000 n
-0000376400 00000 n
-0000377124 00000 n
-0000377358 00000 n
-0000390870 00000 n
-0000377681 00000 n
-0000377788 00000 n
-0000391104 00000 n
-0000391855 00000 n
-0000392081 00000 n
-0000403115 00000 n
-0000392228 00000 n
-0000392326 00000 n
-0000403355 00000 n
-0000404033 00000 n
-0000404264 00000 n
-0000405375 00000 n
-0000404319 00000 n
-0000404416 00000 n
-0000405618 00000 n
-0000406228 00000 n
-0000406432 00000 n
-0000408983 00000 n
-0000406639 00000 n
-0000406745 00000 n
-0000409231 00000 n
-0000409926 00000 n
-0000410136 00000 n
-0000419946 00000 n
-0000410762 00000 n
-0000410897 00000 n
-0000420186 00000 n
-0000421270 00000 n
-0000421474 00000 n
-0000423479 00000 n
-0000421618 00000 n
-0000421724 00000 n
-0000423726 00000 n
-0000424391 00000 n
-0000424601 00000 n
-0000426286 00000 n
-0000424714 00000 n
-0000424820 00000 n
-0000426535 00000 n
-0000427188 00000 n
-0000427399 00000 n
-0000434480 00000 n
-0000427837 00000 n
-0000427952 00000 n
-0000434720 00000 n
-0000435592 00000 n
-0000435795 00000 n
-0000441197 00000 n
-0000436148 00000 n
-0000436262 00000 n
-0000441441 00000 n
-0000442214 00000 n
-0000442419 00000 n
-0000448674 00000 n
-0000442868 00000 n
-0000442976 00000 n
-0000448914 00000 n
-0000449791 00000 n
-0000449995 00000 n
-0000452307 00000 n
-0000450151 00000 n
-0000450257 00000 n
-0000452550 00000 n
-0000453209 00000 n
-0000453413 00000 n
-0000455433 00000 n
-0000453527 00000 n
-0000453631 00000 n
-0000455675 00000 n
-0000456320 00000 n
-0000456525 00000 n
-0000459578 00000 n
-0000456816 00000 n
-0000456923 00000 n
-0000459818 00000 n
-0000460554 00000 n
-0000460758 00000 n
-0000467467 00000 n
-0000461184 00000 n
-0000461299 00000 n
-0000467708 00000 n
-0000468563 00000 n
-0000593687 00000 n
-0000468768 00000 n
-0000593775 00000 n
-0000468795 00000 n
-0000593572 00000 n
-0000468822 00000 n
-0000468847 00000 n
-0000469080 00000 n
-0000469297 00000 n
-0000473453 00000 n
-0000469617 00000 n
-0000469723 00000 n
-0000473695 00000 n
-0000474438 00000 n
-0000474642 00000 n
-0000477110 00000 n
-0000474854 00000 n
-0000474960 00000 n
-0000477350 00000 n
-0000478033 00000 n
-0000478237 00000 n
-0000487392 00000 n
-0000478716 00000 n
-0000478837 00000 n
-0000487633 00000 n
-0000488626 00000 n
-0000488831 00000 n
-0000490841 00000 n
-0000488945 00000 n
-0000489049 00000 n
-0000491083 00000 n
-0000491729 00000 n
-0000491934 00000 n
-0000494352 00000 n
-0000492170 00000 n
-0000492276 00000 n
-0000494593 00000 n
-0000495292 00000 n
-0000495497 00000 n
-0000504730 00000 n
-0000496048 00000 n
-0000496174 00000 n
-0000504972 00000 n
-0000505958 00000 n
-0000506164 00000 n
-0000512185 00000 n
-0000506556 00000 n
-0000506664 00000 n
-0000512425 00000 n
-0000513247 00000 n
-0000513450 00000 n
-0000514499 00000 n
-0000513528 00000 n
-0000513628 00000 n
-0000514739 00000 n
-0000515361 00000 n
-0000515565 00000 n
-0000519551 00000 n
-0000515855 00000 n
-0000515961 00000 n
-0000519792 00000 n
-0000520525 00000 n
-0000520730 00000 n
-0000522289 00000 n
-0000520823 00000 n
-0000520924 00000 n
-0000522528 00000 n
-0000523154 00000 n
-0000523356 00000 n
-0000525593 00000 n
-0000523535 00000 n
-0000523641 00000 n
-0000525834 00000 n
-0000526503 00000 n
-0000526708 00000 n
-0000529498 00000 n
-0000526903 00000 n
-0000527010 00000 n
-0000529740 00000 n
-0000530436 00000 n
-0000530642 00000 n
-0000530730 00000 n
-0000531774 00000 n
-0000530808 00000 n
-0000530908 00000 n
-0000532015 00000 n
-0000532639 00000 n
-0000532844 00000 n
-0000534647 00000 n
-0000532955 00000 n
-0000533058 00000 n
-0000534889 00000 n
-0000535532 00000 n
-0000542709 00000 n
-0000535738 00000 n
-0000546482 00000 n
-0000542942 00000 n
-0000549242 00000 n
-0000546762 00000 n
-0000572900 00000 n
-0000549483 00000 n
-0000587282 00000 n
-0000573207 00000 n
-0000590554 00000 n
-0000587520 00000 n
-0000593320 00000 n
-0000590820 00000 n
-0000596208 00000 n
-0000596325 00000 n
-0000601463 00000 n
-0000602128 00000 n
-0000602797 00000 n
-0000603466 00000 n
-0000604132 00000 n
-0000604801 00000 n
-0000605469 00000 n
-0000606140 00000 n
-0000606804 00000 n
-0000607473 00000 n
-0000608142 00000 n
-0000608808 00000 n
-0000609477 00000 n
-0000610146 00000 n
-0000610811 00000 n
-0000611482 00000 n
-0000612150 00000 n
-0000612819 00000 n
-0000613485 00000 n
-0000614154 00000 n
-0000614823 00000 n
-0000615489 00000 n
-0000616158 00000 n
-0000616826 00000 n
-0000617497 00000 n
-0000618162 00000 n
-0000618831 00000 n
-0000619500 00000 n
-0000620166 00000 n
-0000620835 00000 n
-0000621504 00000 n
-0000622157 00000 n
-0000622761 00000 n
-0000623367 00000 n
-0000623973 00000 n
-0000624576 00000 n
-0000625183 00000 n
-0000625788 00000 n
-0000626394 00000 n
-0000626998 00000 n
-0000627604 00000 n
-0000628210 00000 n
-0000628814 00000 n
-0000629444 00000 n
-0000630078 00000 n
-0000630715 00000 n
-0000631345 00000 n
-0000631980 00000 n
-0000632615 00000 n
-0000633247 00000 n
-0000633882 00000 n
-0000634517 00000 n
-0000635148 00000 n
-0000635785 00000 n
-0000636419 00000 n
-0000637054 00000 n
-0000637686 00000 n
-0000638321 00000 n
-0000638956 00000 n
-0000639618 00000 n
-0000640409 00000 n
-0000641057 00000 n
-0000641738 00000 n
-0000642529 00000 n
-0000643511 00000 n
-0000644148 00000 n
-0000644503 00000 n
-0000644871 00000 n
-0000644960 00000 n
-0000645054 00000 n
-0000645094 00000 n
-0000645226 00000 n
+0000018024 00000 n
+0000018086 00000 n
+0000535771 00000 n
+0000532879 00000 n
+0000594841 00000 n
+0000530675 00000 n
+0000526754 00000 n
+0000523408 00000 n
+0000520776 00000 n
+0000515613 00000 n
+0000513500 00000 n
+0000506208 00000 n
+0000495543 00000 n
+0000491980 00000 n
+0000488877 00000 n
+0000478285 00000 n
+0000474690 00000 n
+0000595199 00000 n
+0000594481 00000 n
+0000594662 00000 n
+0000595375 00000 n
+0000595021 00000 n
+0000468814 00000 n
+0000460806 00000 n
+0000456571 00000 n
+0000018208 00000 n
+0000453461 00000 n
+0000450043 00000 n
+0000017836 00000 n
+0000018271 00000 n
+0000595549 00000 n
+0000017280 00000 n
+0000022581 00000 n
+0000022742 00000 n
+0000022903 00000 n
+0000023426 00000 n
+0000022399 00000 n
+0000018770 00000 n
+0000023059 00000 n
+0000442465 00000 n
+0000435845 00000 n
+0000023363 00000 n
+0000022536 00000 n
+0000028167 00000 n
+0000028323 00000 n
+0000028786 00000 n
+0000027993 00000 n
+0000023667 00000 n
+0000028478 00000 n
+0000427433 00000 n
+0000028662 00000 n
+0000028724 00000 n
+0000028130 00000 n
+0000033154 00000 n
+0000033315 00000 n
+0000033475 00000 n
+0000033630 00000 n
+0000033786 00000 n
+0000033952 00000 n
+0000034306 00000 n
+0000032948 00000 n
+0000029079 00000 n
+0000034118 00000 n
+0000424637 00000 n
+0000421193 00000 n
+0000034180 00000 n
+0000034243 00000 n
+0000033085 00000 n
+0000039639 00000 n
+0000039800 00000 n
+0000039956 00000 n
+0000040114 00000 n
+0000040269 00000 n
+0000040694 00000 n
+0000039441 00000 n
+0000034573 00000 n
+0000040447 00000 n
+0000409843 00000 n
+0000040570 00000 n
+0000040633 00000 n
+0000039578 00000 n
+0000094167 00000 n
+0000044369 00000 n
+0000044530 00000 n
+0000044936 00000 n
+0000044195 00000 n
+0000041052 00000 n
+0000044691 00000 n
+0000044332 00000 n
+0000047327 00000 n
+0000047144 00000 n
+0000045164 00000 n
+0000047265 00000 n
+0000051297 00000 n
+0000051458 00000 n
+0000051619 00000 n
+0000051780 00000 n
+0000051941 00000 n
+0000052405 00000 n
+0000051099 00000 n
+0000047503 00000 n
+0000052097 00000 n
+0000052342 00000 n
+0000051236 00000 n
+0000055659 00000 n
+0000055415 00000 n
+0000052659 00000 n
+0000055536 00000 n
+0000059734 00000 n
+0000059891 00000 n
+0000060048 00000 n
+0000060204 00000 n
+0000060857 00000 n
+0000059544 00000 n
+0000055874 00000 n
+0000060361 00000 n
+0000060605 00000 n
+0000060668 00000 n
+0000060731 00000 n
+0000060794 00000 n
+0000059681 00000 n
+0000064031 00000 n
+0000063787 00000 n
+0000061111 00000 n
+0000063908 00000 n
+0000595702 00000 n
+0000067895 00000 n
+0000068358 00000 n
+0000067729 00000 n
+0000064220 00000 n
+0000068052 00000 n
+0000068295 00000 n
+0000067866 00000 n
+0000073269 00000 n
+0000073429 00000 n
+0000073897 00000 n
+0000073095 00000 n
+0000068625 00000 n
+0000073589 00000 n
+0000073232 00000 n
+0000077471 00000 n
+0000077226 00000 n
+0000074138 00000 n
+0000077347 00000 n
+0000081334 00000 n
+0000081495 00000 n
+0000081656 00000 n
+0000081813 00000 n
+0000082217 00000 n
+0000081144 00000 n
+0000077660 00000 n
+0000081969 00000 n
+0000082093 00000 n
+0000082155 00000 n
+0000081281 00000 n
+0000086118 00000 n
+0000086275 00000 n
+0000086432 00000 n
+0000086589 00000 n
+0000086746 00000 n
+0000086907 00000 n
+0000087068 00000 n
+0000087225 00000 n
+0000087838 00000 n
+0000085896 00000 n
+0000082458 00000 n
+0000087402 00000 n
+0000406151 00000 n
+0000087464 00000 n
+0000087527 00000 n
+0000087652 00000 n
+0000087715 00000 n
+0000087777 00000 n
+0000086033 00000 n
+0000090816 00000 n
+0000090571 00000 n
+0000088105 00000 n
+0000090692 00000 n
+0000403952 00000 n
+0000391779 00000 n
+0000377040 00000 n
+0000091825 00000 n
+0000091642 00000 n
+0000091044 00000 n
+0000091763 00000 n
+0000094229 00000 n
+0000093984 00000 n
+0000091962 00000 n
+0000094105 00000 n
+0000098244 00000 n
+0000098401 00000 n
+0000098557 00000 n
+0000098714 00000 n
+0000099307 00000 n
+0000098054 00000 n
+0000094392 00000 n
+0000098871 00000 n
+0000099057 00000 n
+0000099120 00000 n
+0000099183 00000 n
+0000099246 00000 n
+0000098191 00000 n
+0000105034 00000 n
+0000102276 00000 n
+0000099600 00000 n
+0000102397 00000 n
+0000594336 00000 n
+0000102583 00000 n
+0000102646 00000 n
+0000102709 00000 n
+0000102772 00000 n
+0000102835 00000 n
+0000102898 00000 n
+0000102961 00000 n
+0000103022 00000 n
+0000103085 00000 n
+0000103148 00000 n
+0000103211 00000 n
+0000103274 00000 n
+0000103337 00000 n
+0000103399 00000 n
+0000103462 00000 n
+0000103525 00000 n
+0000103588 00000 n
+0000103651 00000 n
+0000103714 00000 n
+0000103777 00000 n
+0000103840 00000 n
+0000103903 00000 n
+0000103966 00000 n
+0000104029 00000 n
+0000104092 00000 n
+0000104155 00000 n
+0000104218 00000 n
+0000104281 00000 n
+0000104344 00000 n
+0000104407 00000 n
+0000104469 00000 n
+0000104532 00000 n
+0000104595 00000 n
+0000104658 00000 n
+0000104721 00000 n
+0000104784 00000 n
+0000104847 00000 n
+0000104910 00000 n
+0000104972 00000 n
+0000595855 00000 n
+0000110843 00000 n
+0000107391 00000 n
+0000105237 00000 n
+0000107512 00000 n
+0000107574 00000 n
+0000107637 00000 n
+0000107699 00000 n
+0000107762 00000 n
+0000107825 00000 n
+0000107887 00000 n
+0000107949 00000 n
+0000108012 00000 n
+0000108075 00000 n
+0000108138 00000 n
+0000108201 00000 n
+0000108264 00000 n
+0000108327 00000 n
+0000108390 00000 n
+0000108453 00000 n
+0000108515 00000 n
+0000108578 00000 n
+0000108641 00000 n
+0000108704 00000 n
+0000108767 00000 n
+0000108830 00000 n
+0000108893 00000 n
+0000108956 00000 n
+0000109019 00000 n
+0000109082 00000 n
+0000109145 00000 n
+0000109208 00000 n
+0000109271 00000 n
+0000109334 00000 n
+0000109397 00000 n
+0000109460 00000 n
+0000109523 00000 n
+0000109586 00000 n
+0000109649 00000 n
+0000109711 00000 n
+0000109774 00000 n
+0000109837 00000 n
+0000109900 00000 n
+0000109963 00000 n
+0000110026 00000 n
+0000110089 00000 n
+0000110152 00000 n
+0000110215 00000 n
+0000110278 00000 n
+0000110341 00000 n
+0000110403 00000 n
+0000110466 00000 n
+0000110529 00000 n
+0000110592 00000 n
+0000110655 00000 n
+0000110718 00000 n
+0000110781 00000 n
+0000116080 00000 n
+0000114076 00000 n
+0000111006 00000 n
+0000114197 00000 n
+0000114259 00000 n
+0000114322 00000 n
+0000114384 00000 n
+0000114447 00000 n
+0000114510 00000 n
+0000114573 00000 n
+0000114636 00000 n
+0000114699 00000 n
+0000114762 00000 n
+0000114825 00000 n
+0000114888 00000 n
+0000114949 00000 n
+0000115012 00000 n
+0000115075 00000 n
+0000115138 00000 n
+0000115201 00000 n
+0000115264 00000 n
+0000115327 00000 n
+0000115452 00000 n
+0000115515 00000 n
+0000115578 00000 n
+0000115641 00000 n
+0000115704 00000 n
+0000115767 00000 n
+0000115830 00000 n
+0000115893 00000 n
+0000115956 00000 n
+0000116018 00000 n
+0000120669 00000 n
+0000118726 00000 n
+0000116282 00000 n
+0000118847 00000 n
+0000118909 00000 n
+0000118972 00000 n
+0000119035 00000 n
+0000119096 00000 n
+0000119159 00000 n
+0000119222 00000 n
+0000119285 00000 n
+0000119348 00000 n
+0000119411 00000 n
+0000119474 00000 n
+0000119537 00000 n
+0000119599 00000 n
+0000119662 00000 n
+0000119725 00000 n
+0000119788 00000 n
+0000119851 00000 n
+0000119914 00000 n
+0000119977 00000 n
+0000120040 00000 n
+0000120103 00000 n
+0000120166 00000 n
+0000120229 00000 n
+0000120291 00000 n
+0000120354 00000 n
+0000120417 00000 n
+0000120480 00000 n
+0000120543 00000 n
+0000120606 00000 n
+0000125512 00000 n
+0000123251 00000 n
+0000120832 00000 n
+0000123372 00000 n
+0000123434 00000 n
+0000123497 00000 n
+0000123560 00000 n
+0000123623 00000 n
+0000123686 00000 n
+0000123749 00000 n
+0000123812 00000 n
+0000123875 00000 n
+0000123938 00000 n
+0000124001 00000 n
+0000124064 00000 n
+0000124127 00000 n
+0000124190 00000 n
+0000124252 00000 n
+0000124315 00000 n
+0000124378 00000 n
+0000124441 00000 n
+0000124504 00000 n
+0000124567 00000 n
+0000124630 00000 n
+0000124693 00000 n
+0000124756 00000 n
+0000124819 00000 n
+0000124882 00000 n
+0000124945 00000 n
+0000125008 00000 n
+0000125071 00000 n
+0000125134 00000 n
+0000125197 00000 n
+0000125260 00000 n
+0000125323 00000 n
+0000125386 00000 n
+0000125449 00000 n
+0000130916 00000 n
+0000127651 00000 n
+0000125688 00000 n
+0000127772 00000 n
+0000127834 00000 n
+0000127897 00000 n
+0000127960 00000 n
+0000128023 00000 n
+0000128086 00000 n
+0000128149 00000 n
+0000128212 00000 n
+0000128275 00000 n
+0000128338 00000 n
+0000128401 00000 n
+0000128464 00000 n
+0000128527 00000 n
+0000128590 00000 n
+0000128653 00000 n
+0000128716 00000 n
+0000128779 00000 n
+0000128841 00000 n
+0000128904 00000 n
+0000128967 00000 n
+0000129030 00000 n
+0000129093 00000 n
+0000129156 00000 n
+0000129219 00000 n
+0000129282 00000 n
+0000129345 00000 n
+0000129408 00000 n
+0000129471 00000 n
+0000129533 00000 n
+0000129596 00000 n
+0000129659 00000 n
+0000129722 00000 n
+0000129785 00000 n
+0000129848 00000 n
+0000129911 00000 n
+0000129974 00000 n
+0000130037 00000 n
+0000130100 00000 n
+0000130163 00000 n
+0000130225 00000 n
+0000130288 00000 n
+0000130351 00000 n
+0000130414 00000 n
+0000130477 00000 n
+0000130540 00000 n
+0000130603 00000 n
+0000130666 00000 n
+0000130729 00000 n
+0000130792 00000 n
+0000130854 00000 n
+0000137041 00000 n
+0000133591 00000 n
+0000131079 00000 n
+0000133712 00000 n
+0000133836 00000 n
+0000133898 00000 n
+0000133961 00000 n
+0000134024 00000 n
+0000134087 00000 n
+0000134150 00000 n
+0000134213 00000 n
+0000134276 00000 n
+0000134339 00000 n
+0000134402 00000 n
+0000134465 00000 n
+0000134528 00000 n
+0000134590 00000 n
+0000134653 00000 n
+0000134716 00000 n
+0000134779 00000 n
+0000134842 00000 n
+0000134905 00000 n
+0000134968 00000 n
+0000135031 00000 n
+0000135094 00000 n
+0000135156 00000 n
+0000135219 00000 n
+0000135282 00000 n
+0000135345 00000 n
+0000135408 00000 n
+0000135471 00000 n
+0000135533 00000 n
+0000135596 00000 n
+0000135659 00000 n
+0000135722 00000 n
+0000135785 00000 n
+0000135848 00000 n
+0000135911 00000 n
+0000135974 00000 n
+0000136037 00000 n
+0000136099 00000 n
+0000136162 00000 n
+0000136225 00000 n
+0000136288 00000 n
+0000136351 00000 n
+0000136414 00000 n
+0000136477 00000 n
+0000136540 00000 n
+0000136603 00000 n
+0000136665 00000 n
+0000136728 00000 n
+0000136791 00000 n
+0000136854 00000 n
+0000136917 00000 n
+0000136979 00000 n
+0000143288 00000 n
+0000139774 00000 n
+0000137217 00000 n
+0000139895 00000 n
+0000139957 00000 n
+0000140020 00000 n
+0000140082 00000 n
+0000140145 00000 n
+0000140208 00000 n
+0000140271 00000 n
+0000140334 00000 n
+0000140397 00000 n
+0000140460 00000 n
+0000140523 00000 n
+0000140586 00000 n
+0000140649 00000 n
+0000140712 00000 n
+0000140775 00000 n
+0000140837 00000 n
+0000140900 00000 n
+0000140963 00000 n
+0000141026 00000 n
+0000141089 00000 n
+0000141152 00000 n
+0000141215 00000 n
+0000141278 00000 n
+0000141341 00000 n
+0000141404 00000 n
+0000141467 00000 n
+0000141530 00000 n
+0000141593 00000 n
+0000141656 00000 n
+0000141719 00000 n
+0000141782 00000 n
+0000141845 00000 n
+0000141908 00000 n
+0000141971 00000 n
+0000142032 00000 n
+0000142095 00000 n
+0000142158 00000 n
+0000142221 00000 n
+0000142284 00000 n
+0000142347 00000 n
+0000142410 00000 n
+0000142473 00000 n
+0000142535 00000 n
+0000142598 00000 n
+0000142661 00000 n
+0000142724 00000 n
+0000142787 00000 n
+0000142850 00000 n
+0000142913 00000 n
+0000142976 00000 n
+0000143038 00000 n
+0000143101 00000 n
+0000143164 00000 n
+0000143226 00000 n
+0000148875 00000 n
+0000145488 00000 n
+0000143451 00000 n
+0000145609 00000 n
+0000145671 00000 n
+0000145734 00000 n
+0000145796 00000 n
+0000145859 00000 n
+0000145921 00000 n
+0000145984 00000 n
+0000146047 00000 n
+0000146110 00000 n
+0000146173 00000 n
+0000146236 00000 n
+0000146299 00000 n
+0000146362 00000 n
+0000146425 00000 n
+0000146488 00000 n
+0000146551 00000 n
+0000146614 00000 n
+0000146677 00000 n
+0000146740 00000 n
+0000146803 00000 n
+0000146866 00000 n
+0000146929 00000 n
+0000146992 00000 n
+0000147054 00000 n
+0000147117 00000 n
+0000147180 00000 n
+0000147243 00000 n
+0000147306 00000 n
+0000147369 00000 n
+0000147432 00000 n
+0000147495 00000 n
+0000147558 00000 n
+0000147620 00000 n
+0000147683 00000 n
+0000147746 00000 n
+0000147809 00000 n
+0000147872 00000 n
+0000147935 00000 n
+0000147998 00000 n
+0000148061 00000 n
+0000148124 00000 n
+0000148185 00000 n
+0000148248 00000 n
+0000148311 00000 n
+0000148374 00000 n
+0000148499 00000 n
+0000148562 00000 n
+0000148625 00000 n
+0000148688 00000 n
+0000148751 00000 n
+0000148813 00000 n
+0000155137 00000 n
+0000151245 00000 n
+0000149064 00000 n
+0000151366 00000 n
+0000151428 00000 n
+0000151491 00000 n
+0000151553 00000 n
+0000151616 00000 n
+0000151679 00000 n
+0000151742 00000 n
+0000151805 00000 n
+0000151868 00000 n
+0000151931 00000 n
+0000151994 00000 n
+0000152057 00000 n
+0000152119 00000 n
+0000152182 00000 n
+0000152245 00000 n
+0000152308 00000 n
+0000152371 00000 n
+0000152434 00000 n
+0000152497 00000 n
+0000152560 00000 n
+0000152623 00000 n
+0000152685 00000 n
+0000152748 00000 n
+0000152811 00000 n
+0000152874 00000 n
+0000152937 00000 n
+0000153000 00000 n
+0000153063 00000 n
+0000153126 00000 n
+0000153189 00000 n
+0000153251 00000 n
+0000153314 00000 n
+0000153377 00000 n
+0000153440 00000 n
+0000153503 00000 n
+0000153566 00000 n
+0000153629 00000 n
+0000153692 00000 n
+0000153755 00000 n
+0000153817 00000 n
+0000153880 00000 n
+0000153943 00000 n
+0000154006 00000 n
+0000154069 00000 n
+0000154132 00000 n
+0000154195 00000 n
+0000154258 00000 n
+0000154321 00000 n
+0000154383 00000 n
+0000154446 00000 n
+0000154509 00000 n
+0000154572 00000 n
+0000154635 00000 n
+0000154698 00000 n
+0000154761 00000 n
+0000154824 00000 n
+0000154887 00000 n
+0000154949 00000 n
+0000155012 00000 n
+0000155075 00000 n
+0000160772 00000 n
+0000157449 00000 n
+0000155300 00000 n
+0000157570 00000 n
+0000157694 00000 n
+0000157756 00000 n
+0000157818 00000 n
+0000157881 00000 n
+0000157944 00000 n
+0000158007 00000 n
+0000158070 00000 n
+0000158133 00000 n
+0000158196 00000 n
+0000158259 00000 n
+0000158384 00000 n
+0000158447 00000 n
+0000158510 00000 n
+0000158573 00000 n
+0000158636 00000 n
+0000158699 00000 n
+0000158762 00000 n
+0000158825 00000 n
+0000158887 00000 n
+0000158950 00000 n
+0000159013 00000 n
+0000159076 00000 n
+0000159139 00000 n
+0000159202 00000 n
+0000159265 00000 n
+0000159328 00000 n
+0000159391 00000 n
+0000159454 00000 n
+0000159516 00000 n
+0000159579 00000 n
+0000159642 00000 n
+0000159705 00000 n
+0000159768 00000 n
+0000159831 00000 n
+0000159894 00000 n
+0000159957 00000 n
+0000160020 00000 n
+0000160082 00000 n
+0000160207 00000 n
+0000160270 00000 n
+0000160333 00000 n
+0000160396 00000 n
+0000160459 00000 n
+0000160522 00000 n
+0000160585 00000 n
+0000160648 00000 n
+0000160710 00000 n
+0000596008 00000 n
+0000166727 00000 n
+0000163060 00000 n
+0000160948 00000 n
+0000163181 00000 n
+0000163243 00000 n
+0000163306 00000 n
+0000163368 00000 n
+0000163431 00000 n
+0000163494 00000 n
+0000163557 00000 n
+0000163620 00000 n
+0000163683 00000 n
+0000163746 00000 n
+0000163809 00000 n
+0000163872 00000 n
+0000163934 00000 n
+0000163997 00000 n
+0000164060 00000 n
+0000164123 00000 n
+0000164186 00000 n
+0000164249 00000 n
+0000164312 00000 n
+0000164375 00000 n
+0000164437 00000 n
+0000164500 00000 n
+0000164563 00000 n
+0000164626 00000 n
+0000164689 00000 n
+0000164752 00000 n
+0000164815 00000 n
+0000164878 00000 n
+0000164940 00000 n
+0000165004 00000 n
+0000165068 00000 n
+0000165132 00000 n
+0000165196 00000 n
+0000165260 00000 n
+0000165324 00000 n
+0000165388 00000 n
+0000165452 00000 n
+0000165515 00000 n
+0000165579 00000 n
+0000165643 00000 n
+0000165707 00000 n
+0000165771 00000 n
+0000165835 00000 n
+0000165899 00000 n
+0000165962 00000 n
+0000166026 00000 n
+0000166090 00000 n
+0000166154 00000 n
+0000166218 00000 n
+0000166282 00000 n
+0000166346 00000 n
+0000166410 00000 n
+0000166474 00000 n
+0000166537 00000 n
+0000166601 00000 n
+0000166664 00000 n
+0000172943 00000 n
+0000169058 00000 n
+0000166890 00000 n
+0000169182 00000 n
+0000169246 00000 n
+0000169311 00000 n
+0000169375 00000 n
+0000169440 00000 n
+0000169505 00000 n
+0000169570 00000 n
+0000169635 00000 n
+0000169700 00000 n
+0000169765 00000 n
+0000169830 00000 n
+0000169895 00000 n
+0000169959 00000 n
+0000170024 00000 n
+0000170089 00000 n
+0000170154 00000 n
+0000170219 00000 n
+0000170284 00000 n
+0000170349 00000 n
+0000170413 00000 n
+0000170478 00000 n
+0000170543 00000 n
+0000170608 00000 n
+0000170673 00000 n
+0000170738 00000 n
+0000170803 00000 n
+0000170868 00000 n
+0000170933 00000 n
+0000170997 00000 n
+0000171062 00000 n
+0000171127 00000 n
+0000171192 00000 n
+0000171257 00000 n
+0000171322 00000 n
+0000171387 00000 n
+0000171452 00000 n
+0000171517 00000 n
+0000171581 00000 n
+0000171646 00000 n
+0000171711 00000 n
+0000171776 00000 n
+0000171841 00000 n
+0000171906 00000 n
+0000171971 00000 n
+0000172036 00000 n
+0000172101 00000 n
+0000172166 00000 n
+0000172231 00000 n
+0000172296 00000 n
+0000172361 00000 n
+0000172426 00000 n
+0000172491 00000 n
+0000172556 00000 n
+0000172621 00000 n
+0000172685 00000 n
+0000172750 00000 n
+0000172815 00000 n
+0000172879 00000 n
+0000179206 00000 n
+0000175583 00000 n
+0000173107 00000 n
+0000175707 00000 n
+0000175771 00000 n
+0000175836 00000 n
+0000175900 00000 n
+0000175965 00000 n
+0000176030 00000 n
+0000176094 00000 n
+0000176159 00000 n
+0000176224 00000 n
+0000176289 00000 n
+0000176354 00000 n
+0000176419 00000 n
+0000176483 00000 n
+0000176548 00000 n
+0000176613 00000 n
+0000176678 00000 n
+0000176743 00000 n
+0000176808 00000 n
+0000176873 00000 n
+0000176938 00000 n
+0000177003 00000 n
+0000177067 00000 n
+0000177132 00000 n
+0000177197 00000 n
+0000177262 00000 n
+0000177327 00000 n
+0000177392 00000 n
+0000177457 00000 n
+0000177522 00000 n
+0000177587 00000 n
+0000177652 00000 n
+0000177717 00000 n
+0000177782 00000 n
+0000177847 00000 n
+0000177912 00000 n
+0000177977 00000 n
+0000178040 00000 n
+0000178105 00000 n
+0000178170 00000 n
+0000178235 00000 n
+0000178300 00000 n
+0000178365 00000 n
+0000178430 00000 n
+0000178495 00000 n
+0000178560 00000 n
+0000178624 00000 n
+0000178689 00000 n
+0000178754 00000 n
+0000178819 00000 n
+0000178883 00000 n
+0000178948 00000 n
+0000179013 00000 n
+0000179078 00000 n
+0000179142 00000 n
+0000185615 00000 n
+0000182056 00000 n
+0000179370 00000 n
+0000182180 00000 n
+0000182244 00000 n
+0000182309 00000 n
+0000182373 00000 n
+0000182438 00000 n
+0000182503 00000 n
+0000182568 00000 n
+0000182633 00000 n
+0000182698 00000 n
+0000182763 00000 n
+0000182828 00000 n
+0000182893 00000 n
+0000182957 00000 n
+0000183022 00000 n
+0000183087 00000 n
+0000183151 00000 n
+0000183216 00000 n
+0000183281 00000 n
+0000183346 00000 n
+0000183411 00000 n
+0000183476 00000 n
+0000183541 00000 n
+0000183605 00000 n
+0000183670 00000 n
+0000183735 00000 n
+0000183800 00000 n
+0000183865 00000 n
+0000183930 00000 n
+0000183995 00000 n
+0000184059 00000 n
+0000184124 00000 n
+0000184189 00000 n
+0000184254 00000 n
+0000184319 00000 n
+0000184384 00000 n
+0000184449 00000 n
+0000184514 00000 n
+0000184579 00000 n
+0000184643 00000 n
+0000184708 00000 n
+0000184773 00000 n
+0000184838 00000 n
+0000184903 00000 n
+0000184968 00000 n
+0000185033 00000 n
+0000185098 00000 n
+0000185163 00000 n
+0000185227 00000 n
+0000185292 00000 n
+0000185357 00000 n
+0000185422 00000 n
+0000185487 00000 n
+0000185551 00000 n
+0000191373 00000 n
+0000188336 00000 n
+0000185792 00000 n
+0000188460 00000 n
+0000188524 00000 n
+0000188589 00000 n
+0000188653 00000 n
+0000188718 00000 n
+0000188783 00000 n
+0000188848 00000 n
+0000188913 00000 n
+0000188978 00000 n
+0000189043 00000 n
+0000189108 00000 n
+0000189173 00000 n
+0000189237 00000 n
+0000189302 00000 n
+0000189367 00000 n
+0000189432 00000 n
+0000189497 00000 n
+0000189562 00000 n
+0000189627 00000 n
+0000189692 00000 n
+0000189757 00000 n
+0000189822 00000 n
+0000189887 00000 n
+0000189952 00000 n
+0000190017 00000 n
+0000190082 00000 n
+0000190147 00000 n
+0000190212 00000 n
+0000190275 00000 n
+0000190340 00000 n
+0000190405 00000 n
+0000190470 00000 n
+0000190535 00000 n
+0000190600 00000 n
+0000190665 00000 n
+0000190730 00000 n
+0000190795 00000 n
+0000190860 00000 n
+0000190925 00000 n
+0000190986 00000 n
+0000191051 00000 n
+0000191116 00000 n
+0000191181 00000 n
+0000191309 00000 n
+0000197605 00000 n
+0000193528 00000 n
+0000191563 00000 n
+0000193652 00000 n
+0000193716 00000 n
+0000193779 00000 n
+0000193844 00000 n
+0000193909 00000 n
+0000193974 00000 n
+0000194039 00000 n
+0000194104 00000 n
+0000194169 00000 n
+0000194234 00000 n
+0000194299 00000 n
+0000194363 00000 n
+0000194428 00000 n
+0000194493 00000 n
+0000194558 00000 n
+0000194623 00000 n
+0000194688 00000 n
+0000194753 00000 n
+0000194818 00000 n
+0000194883 00000 n
+0000194947 00000 n
+0000195012 00000 n
+0000195077 00000 n
+0000195142 00000 n
+0000195207 00000 n
+0000195272 00000 n
+0000195337 00000 n
+0000195402 00000 n
+0000195467 00000 n
+0000195531 00000 n
+0000195596 00000 n
+0000195661 00000 n
+0000195726 00000 n
+0000195791 00000 n
+0000195856 00000 n
+0000195921 00000 n
+0000195986 00000 n
+0000196051 00000 n
+0000196116 00000 n
+0000196180 00000 n
+0000196245 00000 n
+0000196310 00000 n
+0000196375 00000 n
+0000196440 00000 n
+0000196505 00000 n
+0000196570 00000 n
+0000196635 00000 n
+0000196700 00000 n
+0000196763 00000 n
+0000196828 00000 n
+0000196893 00000 n
+0000196958 00000 n
+0000197023 00000 n
+0000197088 00000 n
+0000197153 00000 n
+0000197218 00000 n
+0000197283 00000 n
+0000197347 00000 n
+0000197412 00000 n
+0000197477 00000 n
+0000197541 00000 n
+0000203502 00000 n
+0000199686 00000 n
+0000197756 00000 n
+0000199810 00000 n
+0000199874 00000 n
+0000199939 00000 n
+0000200003 00000 n
+0000200068 00000 n
+0000200133 00000 n
+0000200198 00000 n
+0000200263 00000 n
+0000200328 00000 n
+0000200393 00000 n
+0000200457 00000 n
+0000200522 00000 n
+0000200587 00000 n
+0000200652 00000 n
+0000200717 00000 n
+0000200782 00000 n
+0000200847 00000 n
+0000200912 00000 n
+0000200977 00000 n
+0000201041 00000 n
+0000201106 00000 n
+0000201171 00000 n
+0000201236 00000 n
+0000201301 00000 n
+0000201366 00000 n
+0000201431 00000 n
+0000201496 00000 n
+0000201561 00000 n
+0000201625 00000 n
+0000201690 00000 n
+0000201755 00000 n
+0000201820 00000 n
+0000201885 00000 n
+0000201950 00000 n
+0000202015 00000 n
+0000202080 00000 n
+0000202145 00000 n
+0000202272 00000 n
+0000202337 00000 n
+0000202401 00000 n
+0000202466 00000 n
+0000202531 00000 n
+0000202596 00000 n
+0000202661 00000 n
+0000202726 00000 n
+0000202791 00000 n
+0000202856 00000 n
+0000202921 00000 n
+0000202984 00000 n
+0000203049 00000 n
+0000203114 00000 n
+0000203179 00000 n
+0000203244 00000 n
+0000203309 00000 n
+0000203374 00000 n
+0000203438 00000 n
+0000209100 00000 n
+0000206576 00000 n
+0000203666 00000 n
+0000206700 00000 n
+0000206764 00000 n
+0000206829 00000 n
+0000206893 00000 n
+0000206958 00000 n
+0000207023 00000 n
+0000207088 00000 n
+0000207153 00000 n
+0000207218 00000 n
+0000207283 00000 n
+0000207348 00000 n
+0000207413 00000 n
+0000207541 00000 n
+0000207606 00000 n
+0000207671 00000 n
+0000207736 00000 n
+0000207801 00000 n
+0000207866 00000 n
+0000207931 00000 n
+0000207996 00000 n
+0000208061 00000 n
+0000208126 00000 n
+0000208191 00000 n
+0000208256 00000 n
+0000208321 00000 n
+0000208386 00000 n
+0000208451 00000 n
+0000208515 00000 n
+0000208580 00000 n
+0000208645 00000 n
+0000208710 00000 n
+0000208775 00000 n
+0000208840 00000 n
+0000208905 00000 n
+0000208970 00000 n
+0000209035 00000 n
+0000215313 00000 n
+0000211500 00000 n
+0000209290 00000 n
+0000211624 00000 n
+0000211688 00000 n
+0000211753 00000 n
+0000211817 00000 n
+0000211882 00000 n
+0000211947 00000 n
+0000212012 00000 n
+0000212076 00000 n
+0000212141 00000 n
+0000212206 00000 n
+0000212270 00000 n
+0000212335 00000 n
+0000212400 00000 n
+0000212465 00000 n
+0000212530 00000 n
+0000212595 00000 n
+0000212723 00000 n
+0000212787 00000 n
+0000212852 00000 n
+0000212917 00000 n
+0000212982 00000 n
+0000213047 00000 n
+0000213112 00000 n
+0000213177 00000 n
+0000213242 00000 n
+0000213307 00000 n
+0000213434 00000 n
+0000213499 00000 n
+0000213564 00000 n
+0000213629 00000 n
+0000213694 00000 n
+0000213759 00000 n
+0000213824 00000 n
+0000213888 00000 n
+0000213953 00000 n
+0000214018 00000 n
+0000214083 00000 n
+0000214148 00000 n
+0000214213 00000 n
+0000214278 00000 n
+0000214343 00000 n
+0000214408 00000 n
+0000214471 00000 n
+0000214536 00000 n
+0000214601 00000 n
+0000214666 00000 n
+0000214731 00000 n
+0000214796 00000 n
+0000214861 00000 n
+0000214926 00000 n
+0000214991 00000 n
+0000215055 00000 n
+0000215120 00000 n
+0000215185 00000 n
+0000215249 00000 n
+0000220615 00000 n
+0000217638 00000 n
+0000215490 00000 n
+0000217763 00000 n
+0000217827 00000 n
+0000217892 00000 n
+0000217956 00000 n
+0000218021 00000 n
+0000218086 00000 n
+0000218151 00000 n
+0000218216 00000 n
+0000218281 00000 n
+0000218346 00000 n
+0000218411 00000 n
+0000218476 00000 n
+0000218541 00000 n
+0000218606 00000 n
+0000218670 00000 n
+0000218735 00000 n
+0000218800 00000 n
+0000218865 00000 n
+0000218930 00000 n
+0000218995 00000 n
+0000219060 00000 n
+0000219125 00000 n
+0000219190 00000 n
+0000219255 00000 n
+0000219320 00000 n
+0000219385 00000 n
+0000219450 00000 n
+0000219515 00000 n
+0000219580 00000 n
+0000219645 00000 n
+0000219710 00000 n
+0000219838 00000 n
+0000219903 00000 n
+0000219968 00000 n
+0000220033 00000 n
+0000220097 00000 n
+0000220161 00000 n
+0000220226 00000 n
+0000220290 00000 n
+0000220355 00000 n
+0000220420 00000 n
+0000220485 00000 n
+0000220550 00000 n
+0000596169 00000 n
+0000229714 00000 n
+0000225857 00000 n
+0000224046 00000 n
+0000220792 00000 n
+0000224171 00000 n
+0000224298 00000 n
+0000224363 00000 n
+0000224428 00000 n
+0000224493 00000 n
+0000224558 00000 n
+0000224623 00000 n
+0000224687 00000 n
+0000224752 00000 n
+0000224817 00000 n
+0000224882 00000 n
+0000224947 00000 n
+0000225012 00000 n
+0000225077 00000 n
+0000225142 00000 n
+0000225207 00000 n
+0000225272 00000 n
+0000225337 00000 n
+0000225402 00000 n
+0000225467 00000 n
+0000225532 00000 n
+0000225597 00000 n
+0000225662 00000 n
+0000225727 00000 n
+0000225792 00000 n
+0000229870 00000 n
+0000231712 00000 n
+0000229532 00000 n
+0000226086 00000 n
+0000230028 00000 n
+0000230092 00000 n
+0000230157 00000 n
+0000230222 00000 n
+0000230287 00000 n
+0000230352 00000 n
+0000230417 00000 n
+0000230481 00000 n
+0000230546 00000 n
+0000230610 00000 n
+0000230675 00000 n
+0000230740 00000 n
+0000230805 00000 n
+0000230870 00000 n
+0000230935 00000 n
+0000231000 00000 n
+0000231065 00000 n
+0000231130 00000 n
+0000231194 00000 n
+0000231259 00000 n
+0000231324 00000 n
+0000231389 00000 n
+0000231454 00000 n
+0000231519 00000 n
+0000231584 00000 n
+0000231648 00000 n
+0000229674 00000 n
+0000237737 00000 n
+0000234634 00000 n
+0000231980 00000 n
+0000234759 00000 n
+0000234823 00000 n
+0000234888 00000 n
+0000234952 00000 n
+0000235017 00000 n
+0000235082 00000 n
+0000235147 00000 n
+0000235211 00000 n
+0000235276 00000 n
+0000235341 00000 n
+0000235406 00000 n
+0000235471 00000 n
+0000235536 00000 n
+0000235601 00000 n
+0000235666 00000 n
+0000235731 00000 n
+0000235858 00000 n
+0000235923 00000 n
+0000235988 00000 n
+0000236053 00000 n
+0000236118 00000 n
+0000236183 00000 n
+0000236248 00000 n
+0000236313 00000 n
+0000236378 00000 n
+0000236443 00000 n
+0000236508 00000 n
+0000236571 00000 n
+0000236636 00000 n
+0000236701 00000 n
+0000236766 00000 n
+0000236831 00000 n
+0000236896 00000 n
+0000236961 00000 n
+0000237026 00000 n
+0000237091 00000 n
+0000237155 00000 n
+0000237220 00000 n
+0000237285 00000 n
+0000237350 00000 n
+0000237415 00000 n
+0000237480 00000 n
+0000237545 00000 n
+0000237610 00000 n
+0000237674 00000 n
+0000244047 00000 n
+0000241070 00000 n
+0000237940 00000 n
+0000241195 00000 n
+0000241259 00000 n
+0000241324 00000 n
+0000241388 00000 n
+0000241453 00000 n
+0000241518 00000 n
+0000241583 00000 n
+0000241648 00000 n
+0000241713 00000 n
+0000241778 00000 n
+0000241843 00000 n
+0000241908 00000 n
+0000241972 00000 n
+0000242037 00000 n
+0000242102 00000 n
+0000242167 00000 n
+0000242232 00000 n
+0000242297 00000 n
+0000242362 00000 n
+0000242427 00000 n
+0000242492 00000 n
+0000242556 00000 n
+0000242621 00000 n
+0000242686 00000 n
+0000242751 00000 n
+0000242816 00000 n
+0000242881 00000 n
+0000242946 00000 n
+0000243011 00000 n
+0000243076 00000 n
+0000243140 00000 n
+0000243205 00000 n
+0000243270 00000 n
+0000243335 00000 n
+0000243400 00000 n
+0000243465 00000 n
+0000243530 00000 n
+0000243595 00000 n
+0000243660 00000 n
+0000243725 00000 n
+0000243789 00000 n
+0000243854 00000 n
+0000243919 00000 n
+0000243983 00000 n
+0000248070 00000 n
+0000248227 00000 n
+0000250197 00000 n
+0000247888 00000 n
+0000244250 00000 n
+0000248384 00000 n
+0000248448 00000 n
+0000248513 00000 n
+0000248577 00000 n
+0000248642 00000 n
+0000248707 00000 n
+0000248771 00000 n
+0000248836 00000 n
+0000248901 00000 n
+0000248965 00000 n
+0000249030 00000 n
+0000249095 00000 n
+0000249159 00000 n
+0000249224 00000 n
+0000249289 00000 n
+0000249354 00000 n
+0000249419 00000 n
+0000249484 00000 n
+0000249549 00000 n
+0000249614 00000 n
+0000249679 00000 n
+0000249744 00000 n
+0000249808 00000 n
+0000249873 00000 n
+0000249938 00000 n
+0000250003 00000 n
+0000250068 00000 n
+0000250133 00000 n
+0000248030 00000 n
+0000256286 00000 n
+0000252658 00000 n
+0000250478 00000 n
+0000252783 00000 n
+0000252847 00000 n
+0000252912 00000 n
+0000252976 00000 n
+0000253041 00000 n
+0000253106 00000 n
+0000253171 00000 n
+0000253236 00000 n
+0000253301 00000 n
+0000253366 00000 n
+0000253431 00000 n
+0000253496 00000 n
+0000253561 00000 n
+0000253626 00000 n
+0000253690 00000 n
+0000253755 00000 n
+0000253820 00000 n
+0000253885 00000 n
+0000253950 00000 n
+0000254015 00000 n
+0000254080 00000 n
+0000254145 00000 n
+0000254210 00000 n
+0000254274 00000 n
+0000254339 00000 n
+0000254404 00000 n
+0000254469 00000 n
+0000254534 00000 n
+0000254599 00000 n
+0000254664 00000 n
+0000254729 00000 n
+0000254794 00000 n
+0000254859 00000 n
+0000254924 00000 n
+0000254989 00000 n
+0000255054 00000 n
+0000255119 00000 n
+0000255184 00000 n
+0000255249 00000 n
+0000255314 00000 n
+0000255379 00000 n
+0000255444 00000 n
+0000255508 00000 n
+0000255572 00000 n
+0000255637 00000 n
+0000255702 00000 n
+0000255767 00000 n
+0000255832 00000 n
+0000255897 00000 n
+0000255962 00000 n
+0000256026 00000 n
+0000256091 00000 n
+0000256156 00000 n
+0000256221 00000 n
+0000262417 00000 n
+0000258401 00000 n
+0000256489 00000 n
+0000258526 00000 n
+0000258590 00000 n
+0000258655 00000 n
+0000258719 00000 n
+0000258784 00000 n
+0000258849 00000 n
+0000258914 00000 n
+0000258979 00000 n
+0000259044 00000 n
+0000259109 00000 n
+0000259174 00000 n
+0000259239 00000 n
+0000259304 00000 n
+0000259369 00000 n
+0000259433 00000 n
+0000259498 00000 n
+0000259563 00000 n
+0000259628 00000 n
+0000259693 00000 n
+0000259758 00000 n
+0000259823 00000 n
+0000259888 00000 n
+0000259953 00000 n
+0000260017 00000 n
+0000260082 00000 n
+0000260147 00000 n
+0000260212 00000 n
+0000260277 00000 n
+0000260342 00000 n
+0000260407 00000 n
+0000260470 00000 n
+0000260535 00000 n
+0000260600 00000 n
+0000260665 00000 n
+0000260730 00000 n
+0000260795 00000 n
+0000260860 00000 n
+0000260925 00000 n
+0000260990 00000 n
+0000261055 00000 n
+0000261120 00000 n
+0000261185 00000 n
+0000261250 00000 n
+0000261315 00000 n
+0000261380 00000 n
+0000261445 00000 n
+0000261510 00000 n
+0000261575 00000 n
+0000261640 00000 n
+0000261704 00000 n
+0000261769 00000 n
+0000261834 00000 n
+0000261899 00000 n
+0000261964 00000 n
+0000262029 00000 n
+0000262094 00000 n
+0000262159 00000 n
+0000262224 00000 n
+0000262289 00000 n
+0000262353 00000 n
+0000265601 00000 n
+0000268352 00000 n
+0000265428 00000 n
+0000262581 00000 n
+0000265759 00000 n
+0000265823 00000 n
+0000265888 00000 n
+0000265952 00000 n
+0000266017 00000 n
+0000266082 00000 n
+0000266147 00000 n
+0000266212 00000 n
+0000266277 00000 n
+0000266342 00000 n
+0000266407 00000 n
+0000266472 00000 n
+0000266536 00000 n
+0000266601 00000 n
+0000266666 00000 n
+0000266731 00000 n
+0000266796 00000 n
+0000266861 00000 n
+0000266926 00000 n
+0000266991 00000 n
+0000267056 00000 n
+0000267121 00000 n
+0000267185 00000 n
+0000267250 00000 n
+0000267315 00000 n
+0000267380 00000 n
+0000267445 00000 n
+0000267510 00000 n
+0000267575 00000 n
+0000267640 00000 n
+0000267705 00000 n
+0000267769 00000 n
+0000267834 00000 n
+0000267899 00000 n
+0000267964 00000 n
+0000268028 00000 n
+0000268093 00000 n
+0000268158 00000 n
+0000268223 00000 n
+0000268288 00000 n
+0000265570 00000 n
+0000274414 00000 n
+0000270271 00000 n
+0000268620 00000 n
+0000270396 00000 n
+0000270460 00000 n
+0000270525 00000 n
+0000270589 00000 n
+0000270654 00000 n
+0000270719 00000 n
+0000270784 00000 n
+0000270849 00000 n
+0000270914 00000 n
+0000270979 00000 n
+0000271044 00000 n
+0000271109 00000 n
+0000271173 00000 n
+0000271238 00000 n
+0000271303 00000 n
+0000271368 00000 n
+0000271433 00000 n
+0000271497 00000 n
+0000271562 00000 n
+0000271627 00000 n
+0000271692 00000 n
+0000271756 00000 n
+0000271821 00000 n
+0000271886 00000 n
+0000271951 00000 n
+0000272016 00000 n
+0000272081 00000 n
+0000272146 00000 n
+0000272211 00000 n
+0000272276 00000 n
+0000272340 00000 n
+0000272405 00000 n
+0000272470 00000 n
+0000272535 00000 n
+0000272600 00000 n
+0000272665 00000 n
+0000272730 00000 n
+0000272795 00000 n
+0000272860 00000 n
+0000272925 00000 n
+0000272989 00000 n
+0000273054 00000 n
+0000273119 00000 n
+0000273184 00000 n
+0000273249 00000 n
+0000273314 00000 n
+0000273379 00000 n
+0000273444 00000 n
+0000273509 00000 n
+0000273572 00000 n
+0000273637 00000 n
+0000273702 00000 n
+0000273767 00000 n
+0000273832 00000 n
+0000273897 00000 n
+0000273962 00000 n
+0000274027 00000 n
+0000274092 00000 n
+0000274156 00000 n
+0000274221 00000 n
+0000274286 00000 n
+0000274350 00000 n
+0000280290 00000 n
+0000277254 00000 n
+0000274578 00000 n
+0000277379 00000 n
+0000277443 00000 n
+0000277508 00000 n
+0000277572 00000 n
+0000277637 00000 n
+0000277702 00000 n
+0000277767 00000 n
+0000277832 00000 n
+0000277897 00000 n
+0000277962 00000 n
+0000278027 00000 n
+0000278092 00000 n
+0000278156 00000 n
+0000278219 00000 n
+0000278284 00000 n
+0000278349 00000 n
+0000278414 00000 n
+0000278479 00000 n
+0000278543 00000 n
+0000278608 00000 n
+0000278672 00000 n
+0000278737 00000 n
+0000278802 00000 n
+0000278867 00000 n
+0000278932 00000 n
+0000278997 00000 n
+0000279062 00000 n
+0000279125 00000 n
+0000279190 00000 n
+0000279255 00000 n
+0000279320 00000 n
+0000279385 00000 n
+0000279450 00000 n
+0000279515 00000 n
+0000279579 00000 n
+0000279643 00000 n
+0000279708 00000 n
+0000279773 00000 n
+0000279838 00000 n
+0000279903 00000 n
+0000279968 00000 n
+0000280033 00000 n
+0000280098 00000 n
+0000280162 00000 n
+0000280226 00000 n
+0000596333 00000 n
+0000285970 00000 n
+0000283834 00000 n
+0000280493 00000 n
+0000283959 00000 n
+0000284023 00000 n
+0000284088 00000 n
+0000284152 00000 n
+0000284217 00000 n
+0000284282 00000 n
+0000284347 00000 n
+0000284412 00000 n
+0000284477 00000 n
+0000284542 00000 n
+0000284607 00000 n
+0000284672 00000 n
+0000284737 00000 n
+0000284802 00000 n
+0000284867 00000 n
+0000284932 00000 n
+0000284997 00000 n
+0000285062 00000 n
+0000285127 00000 n
+0000285192 00000 n
+0000285257 00000 n
+0000285321 00000 n
+0000285386 00000 n
+0000285451 00000 n
+0000285515 00000 n
+0000285580 00000 n
+0000285645 00000 n
+0000285710 00000 n
+0000285775 00000 n
+0000285840 00000 n
+0000285905 00000 n
+0000294418 00000 n
+0000291560 00000 n
+0000288646 00000 n
+0000286186 00000 n
+0000288771 00000 n
+0000288835 00000 n
+0000288899 00000 n
+0000288964 00000 n
+0000289029 00000 n
+0000289094 00000 n
+0000289159 00000 n
+0000289224 00000 n
+0000289289 00000 n
+0000289354 00000 n
+0000289418 00000 n
+0000289483 00000 n
+0000289547 00000 n
+0000289612 00000 n
+0000289676 00000 n
+0000289741 00000 n
+0000289806 00000 n
+0000289871 00000 n
+0000289936 00000 n
+0000290001 00000 n
+0000290066 00000 n
+0000290131 00000 n
+0000290196 00000 n
+0000290260 00000 n
+0000290325 00000 n
+0000290390 00000 n
+0000290455 00000 n
+0000290520 00000 n
+0000290585 00000 n
+0000290650 00000 n
+0000290715 00000 n
+0000290780 00000 n
+0000290845 00000 n
+0000290910 00000 n
+0000290975 00000 n
+0000291040 00000 n
+0000291105 00000 n
+0000291170 00000 n
+0000291235 00000 n
+0000291300 00000 n
+0000291365 00000 n
+0000291430 00000 n
+0000291495 00000 n
+0000298140 00000 n
+0000294245 00000 n
+0000291763 00000 n
+0000294576 00000 n
+0000294640 00000 n
+0000294705 00000 n
+0000294770 00000 n
+0000294835 00000 n
+0000294899 00000 n
+0000294964 00000 n
+0000295029 00000 n
+0000295094 00000 n
+0000295159 00000 n
+0000295224 00000 n
+0000295289 00000 n
+0000295354 00000 n
+0000295419 00000 n
+0000295483 00000 n
+0000295548 00000 n
+0000295612 00000 n
+0000295740 00000 n
+0000295805 00000 n
+0000295870 00000 n
+0000295935 00000 n
+0000296000 00000 n
+0000296065 00000 n
+0000296130 00000 n
+0000296195 00000 n
+0000296259 00000 n
+0000296324 00000 n
+0000296389 00000 n
+0000296454 00000 n
+0000296519 00000 n
+0000296584 00000 n
+0000296649 00000 n
+0000296714 00000 n
+0000296779 00000 n
+0000296843 00000 n
+0000296908 00000 n
+0000296973 00000 n
+0000297038 00000 n
+0000297103 00000 n
+0000297168 00000 n
+0000297233 00000 n
+0000297298 00000 n
+0000297363 00000 n
+0000297427 00000 n
+0000297492 00000 n
+0000297557 00000 n
+0000297622 00000 n
+0000297687 00000 n
+0000297752 00000 n
+0000297817 00000 n
+0000297882 00000 n
+0000297947 00000 n
+0000298011 00000 n
+0000298076 00000 n
+0000294387 00000 n
+0000304307 00000 n
+0000300489 00000 n
+0000298369 00000 n
+0000300614 00000 n
+0000300678 00000 n
+0000300743 00000 n
+0000300807 00000 n
+0000300872 00000 n
+0000300937 00000 n
+0000301002 00000 n
+0000301067 00000 n
+0000301132 00000 n
+0000301197 00000 n
+0000301262 00000 n
+0000301327 00000 n
+0000301391 00000 n
+0000301456 00000 n
+0000301521 00000 n
+0000301586 00000 n
+0000301651 00000 n
+0000301716 00000 n
+0000301781 00000 n
+0000301846 00000 n
+0000301910 00000 n
+0000301975 00000 n
+0000302040 00000 n
+0000302104 00000 n
+0000302169 00000 n
+0000302233 00000 n
+0000302298 00000 n
+0000302363 00000 n
+0000302428 00000 n
+0000302493 00000 n
+0000302558 00000 n
+0000302623 00000 n
+0000302688 00000 n
+0000302753 00000 n
+0000302817 00000 n
+0000302882 00000 n
+0000302946 00000 n
+0000303011 00000 n
+0000303076 00000 n
+0000303141 00000 n
+0000303206 00000 n
+0000303271 00000 n
+0000303336 00000 n
+0000303401 00000 n
+0000303466 00000 n
+0000303530 00000 n
+0000303595 00000 n
+0000303660 00000 n
+0000303725 00000 n
+0000303790 00000 n
+0000303855 00000 n
+0000303920 00000 n
+0000303985 00000 n
+0000304050 00000 n
+0000304114 00000 n
+0000304179 00000 n
+0000304243 00000 n
+0000310261 00000 n
+0000306182 00000 n
+0000304471 00000 n
+0000306307 00000 n
+0000306371 00000 n
+0000306436 00000 n
+0000306500 00000 n
+0000306565 00000 n
+0000306630 00000 n
+0000306695 00000 n
+0000306760 00000 n
+0000306825 00000 n
+0000306890 00000 n
+0000306955 00000 n
+0000307020 00000 n
+0000307084 00000 n
+0000307149 00000 n
+0000307214 00000 n
+0000307279 00000 n
+0000307344 00000 n
+0000307409 00000 n
+0000307474 00000 n
+0000307539 00000 n
+0000307604 00000 n
+0000307668 00000 n
+0000307733 00000 n
+0000307798 00000 n
+0000307863 00000 n
+0000307928 00000 n
+0000307993 00000 n
+0000308058 00000 n
+0000308123 00000 n
+0000308188 00000 n
+0000308252 00000 n
+0000308317 00000 n
+0000308381 00000 n
+0000308446 00000 n
+0000308511 00000 n
+0000308576 00000 n
+0000308640 00000 n
+0000308705 00000 n
+0000308770 00000 n
+0000308835 00000 n
+0000308900 00000 n
+0000308965 00000 n
+0000309030 00000 n
+0000309095 00000 n
+0000309160 00000 n
+0000309224 00000 n
+0000309289 00000 n
+0000309354 00000 n
+0000309419 00000 n
+0000309484 00000 n
+0000309549 00000 n
+0000309614 00000 n
+0000309679 00000 n
+0000309744 00000 n
+0000309809 00000 n
+0000309874 00000 n
+0000309938 00000 n
+0000310003 00000 n
+0000310068 00000 n
+0000310133 00000 n
+0000310197 00000 n
+0000315930 00000 n
+0000313017 00000 n
+0000310425 00000 n
+0000313142 00000 n
+0000313206 00000 n
+0000313271 00000 n
+0000313335 00000 n
+0000313400 00000 n
+0000313465 00000 n
+0000313530 00000 n
+0000313595 00000 n
+0000313660 00000 n
+0000313725 00000 n
+0000313790 00000 n
+0000313855 00000 n
+0000313920 00000 n
+0000313985 00000 n
+0000314050 00000 n
+0000314115 00000 n
+0000314180 00000 n
+0000314244 00000 n
+0000314309 00000 n
+0000314374 00000 n
+0000314439 00000 n
+0000314504 00000 n
+0000314569 00000 n
+0000314634 00000 n
+0000314699 00000 n
+0000314764 00000 n
+0000314828 00000 n
+0000314893 00000 n
+0000314958 00000 n
+0000315022 00000 n
+0000315086 00000 n
+0000315151 00000 n
+0000315216 00000 n
+0000315281 00000 n
+0000315346 00000 n
+0000315411 00000 n
+0000315476 00000 n
+0000315541 00000 n
+0000315606 00000 n
+0000315671 00000 n
+0000315736 00000 n
+0000315801 00000 n
+0000315866 00000 n
+0000318411 00000 n
+0000321745 00000 n
+0000318238 00000 n
+0000316133 00000 n
+0000318569 00000 n
+0000318633 00000 n
+0000318697 00000 n
+0000318762 00000 n
+0000318827 00000 n
+0000318892 00000 n
+0000318957 00000 n
+0000319022 00000 n
+0000319087 00000 n
+0000319150 00000 n
+0000319215 00000 n
+0000319279 00000 n
+0000319344 00000 n
+0000319409 00000 n
+0000319474 00000 n
+0000319539 00000 n
+0000319604 00000 n
+0000319669 00000 n
+0000319733 00000 n
+0000319798 00000 n
+0000319863 00000 n
+0000319928 00000 n
+0000319993 00000 n
+0000320058 00000 n
+0000320123 00000 n
+0000320188 00000 n
+0000320253 00000 n
+0000320316 00000 n
+0000320381 00000 n
+0000320446 00000 n
+0000320511 00000 n
+0000320576 00000 n
+0000320641 00000 n
+0000320706 00000 n
+0000320771 00000 n
+0000320836 00000 n
+0000320901 00000 n
+0000320966 00000 n
+0000321031 00000 n
+0000321095 00000 n
+0000321160 00000 n
+0000321225 00000 n
+0000321290 00000 n
+0000321355 00000 n
+0000321420 00000 n
+0000321485 00000 n
+0000321550 00000 n
+0000321615 00000 n
+0000321680 00000 n
+0000318380 00000 n
+0000327449 00000 n
+0000324082 00000 n
+0000321974 00000 n
+0000324207 00000 n
+0000324334 00000 n
+0000324399 00000 n
+0000324464 00000 n
+0000324528 00000 n
+0000324593 00000 n
+0000324658 00000 n
+0000324723 00000 n
+0000324788 00000 n
+0000324853 00000 n
+0000324918 00000 n
+0000324983 00000 n
+0000325048 00000 n
+0000325112 00000 n
+0000325177 00000 n
+0000325242 00000 n
+0000325307 00000 n
+0000325372 00000 n
+0000325437 00000 n
+0000325502 00000 n
+0000325567 00000 n
+0000325632 00000 n
+0000325696 00000 n
+0000325761 00000 n
+0000325826 00000 n
+0000325891 00000 n
+0000325956 00000 n
+0000326021 00000 n
+0000326086 00000 n
+0000326151 00000 n
+0000326216 00000 n
+0000326281 00000 n
+0000326345 00000 n
+0000326410 00000 n
+0000326475 00000 n
+0000326540 00000 n
+0000326605 00000 n
+0000326670 00000 n
+0000326735 00000 n
+0000326800 00000 n
+0000326865 00000 n
+0000326929 00000 n
+0000326994 00000 n
+0000327059 00000 n
+0000327124 00000 n
+0000327189 00000 n
+0000327254 00000 n
+0000327319 00000 n
+0000327384 00000 n
+0000332973 00000 n
+0000330453 00000 n
+0000327652 00000 n
+0000330578 00000 n
+0000330705 00000 n
+0000330769 00000 n
+0000330834 00000 n
+0000330899 00000 n
+0000330964 00000 n
+0000331029 00000 n
+0000331094 00000 n
+0000331159 00000 n
+0000331224 00000 n
+0000331352 00000 n
+0000331417 00000 n
+0000331482 00000 n
+0000331547 00000 n
+0000331611 00000 n
+0000331676 00000 n
+0000331741 00000 n
+0000331806 00000 n
+0000331871 00000 n
+0000331936 00000 n
+0000332001 00000 n
+0000332066 00000 n
+0000332131 00000 n
+0000332195 00000 n
+0000332260 00000 n
+0000332325 00000 n
+0000332390 00000 n
+0000332455 00000 n
+0000332520 00000 n
+0000332585 00000 n
+0000332650 00000 n
+0000332715 00000 n
+0000332780 00000 n
+0000332844 00000 n
+0000332909 00000 n
+0000338590 00000 n
+0000335418 00000 n
+0000333202 00000 n
+0000335543 00000 n
+0000335607 00000 n
+0000335672 00000 n
+0000335737 00000 n
+0000335802 00000 n
+0000335867 00000 n
+0000335932 00000 n
+0000335997 00000 n
+0000336062 00000 n
+0000336127 00000 n
+0000336192 00000 n
+0000336257 00000 n
+0000336322 00000 n
+0000336387 00000 n
+0000336452 00000 n
+0000336517 00000 n
+0000336582 00000 n
+0000336647 00000 n
+0000336712 00000 n
+0000336776 00000 n
+0000336841 00000 n
+0000336906 00000 n
+0000336971 00000 n
+0000337036 00000 n
+0000337101 00000 n
+0000337166 00000 n
+0000337231 00000 n
+0000337296 00000 n
+0000337361 00000 n
+0000337426 00000 n
+0000337491 00000 n
+0000337556 00000 n
+0000337621 00000 n
+0000337686 00000 n
+0000337751 00000 n
+0000337816 00000 n
+0000337880 00000 n
+0000337945 00000 n
+0000338010 00000 n
+0000338075 00000 n
+0000338203 00000 n
+0000338267 00000 n
+0000338332 00000 n
+0000338397 00000 n
+0000338462 00000 n
+0000338526 00000 n
+0000596497 00000 n
+0000343270 00000 n
+0000340621 00000 n
+0000338793 00000 n
+0000340746 00000 n
+0000340810 00000 n
+0000340875 00000 n
+0000340940 00000 n
+0000341004 00000 n
+0000341069 00000 n
+0000341134 00000 n
+0000341199 00000 n
+0000341264 00000 n
+0000341329 00000 n
+0000341394 00000 n
+0000341459 00000 n
+0000341524 00000 n
+0000341587 00000 n
+0000341652 00000 n
+0000341717 00000 n
+0000341782 00000 n
+0000341847 00000 n
+0000341912 00000 n
+0000341976 00000 n
+0000342041 00000 n
+0000342106 00000 n
+0000342171 00000 n
+0000342236 00000 n
+0000342301 00000 n
+0000342365 00000 n
+0000342430 00000 n
+0000342495 00000 n
+0000342560 00000 n
+0000342625 00000 n
+0000342690 00000 n
+0000342755 00000 n
+0000342820 00000 n
+0000342885 00000 n
+0000342949 00000 n
+0000343014 00000 n
+0000343142 00000 n
+0000343206 00000 n
+0000346208 00000 n
+0000355270 00000 n
+0000355426 00000 n
+0000347126 00000 n
+0000346035 00000 n
+0000343473 00000 n
+0000346362 00000 n
+0000346426 00000 n
+0000346490 00000 n
+0000346554 00000 n
+0000346617 00000 n
+0000346680 00000 n
+0000346744 00000 n
+0000346808 00000 n
+0000346872 00000 n
+0000346936 00000 n
+0000347062 00000 n
+0000346177 00000 n
+0000355586 00000 n
+0000355747 00000 n
+0000355907 00000 n
+0000356063 00000 n
+0000356224 00000 n
+0000356385 00000 n
+0000356546 00000 n
+0000356702 00000 n
+0000356863 00000 n
+0000357024 00000 n
+0000357191 00000 n
+0000357358 00000 n
+0000357523 00000 n
+0000357683 00000 n
+0000357849 00000 n
+0000358016 00000 n
+0000358183 00000 n
+0000358343 00000 n
+0000358510 00000 n
+0000358677 00000 n
+0000358837 00000 n
+0000358998 00000 n
+0000359154 00000 n
+0000359312 00000 n
+0000359473 00000 n
+0000359632 00000 n
+0000359793 00000 n
+0000359952 00000 n
+0000360108 00000 n
+0000360268 00000 n
+0000360428 00000 n
+0000360595 00000 n
+0000360760 00000 n
+0000360927 00000 n
+0000361093 00000 n
+0000361260 00000 n
+0000361427 00000 n
+0000361594 00000 n
+0000361760 00000 n
+0000361927 00000 n
+0000362091 00000 n
+0000362259 00000 n
+0000362426 00000 n
+0000362587 00000 n
+0000362754 00000 n
+0000362921 00000 n
+0000363088 00000 n
+0000363255 00000 n
+0000363422 00000 n
+0000363589 00000 n
+0000363756 00000 n
+0000363972 00000 n
+0000354629 00000 n
+0000347303 00000 n
+0000363908 00000 n
+0000354771 00000 n
+0000364228 00000 n
+0000364253 00000 n
+0000376238 00000 n
+0000364481 00000 n
+0000364584 00000 n
+0000376480 00000 n
+0000377204 00000 n
+0000377438 00000 n
+0000390950 00000 n
+0000377761 00000 n
+0000377868 00000 n
+0000391184 00000 n
+0000391935 00000 n
+0000392161 00000 n
+0000403195 00000 n
+0000392308 00000 n
+0000392406 00000 n
+0000403435 00000 n
+0000404113 00000 n
+0000404344 00000 n
+0000405455 00000 n
+0000404399 00000 n
+0000404496 00000 n
+0000405698 00000 n
+0000406308 00000 n
+0000406512 00000 n
+0000409063 00000 n
+0000406719 00000 n
+0000406825 00000 n
+0000409311 00000 n
+0000410006 00000 n
+0000410216 00000 n
+0000420026 00000 n
+0000410842 00000 n
+0000410977 00000 n
+0000420266 00000 n
+0000421350 00000 n
+0000421554 00000 n
+0000423880 00000 n
+0000421721 00000 n
+0000421827 00000 n
+0000424127 00000 n
+0000424800 00000 n
+0000425010 00000 n
+0000426695 00000 n
+0000425123 00000 n
+0000425229 00000 n
+0000426944 00000 n
+0000427597 00000 n
+0000427808 00000 n
+0000434889 00000 n
+0000428246 00000 n
+0000428361 00000 n
+0000435129 00000 n
+0000436001 00000 n
+0000436204 00000 n
+0000441606 00000 n
+0000436557 00000 n
+0000436671 00000 n
+0000441850 00000 n
+0000442623 00000 n
+0000442828 00000 n
+0000449083 00000 n
+0000443277 00000 n
+0000443385 00000 n
+0000449323 00000 n
+0000450200 00000 n
+0000450404 00000 n
+0000452716 00000 n
+0000450560 00000 n
+0000450666 00000 n
+0000452959 00000 n
+0000453618 00000 n
+0000453822 00000 n
+0000455842 00000 n
+0000453936 00000 n
+0000454040 00000 n
+0000456084 00000 n
+0000456729 00000 n
+0000456934 00000 n
+0000459987 00000 n
+0000457225 00000 n
+0000457332 00000 n
+0000460227 00000 n
+0000460963 00000 n
+0000461167 00000 n
+0000467876 00000 n
+0000461593 00000 n
+0000461708 00000 n
+0000468117 00000 n
+0000468972 00000 n
+0000594085 00000 n
+0000469177 00000 n
+0000594173 00000 n
+0000469204 00000 n
+0000593970 00000 n
+0000469231 00000 n
+0000469256 00000 n
+0000469489 00000 n
+0000469706 00000 n
+0000473862 00000 n
+0000470026 00000 n
+0000470132 00000 n
+0000474104 00000 n
+0000474847 00000 n
+0000475051 00000 n
+0000477519 00000 n
+0000475263 00000 n
+0000475369 00000 n
+0000477759 00000 n
+0000478442 00000 n
+0000478646 00000 n
+0000487801 00000 n
+0000479125 00000 n
+0000479246 00000 n
+0000488042 00000 n
+0000489035 00000 n
+0000489240 00000 n
+0000491250 00000 n
+0000489354 00000 n
+0000489458 00000 n
+0000491492 00000 n
+0000492138 00000 n
+0000492343 00000 n
+0000494761 00000 n
+0000492579 00000 n
+0000492685 00000 n
+0000495002 00000 n
+0000495701 00000 n
+0000495906 00000 n
+0000505139 00000 n
+0000496457 00000 n
+0000496583 00000 n
+0000505381 00000 n
+0000506367 00000 n
+0000506573 00000 n
+0000512594 00000 n
+0000506965 00000 n
+0000507073 00000 n
+0000512834 00000 n
+0000513656 00000 n
+0000513859 00000 n
+0000514908 00000 n
+0000513937 00000 n
+0000514037 00000 n
+0000515148 00000 n
+0000515770 00000 n
+0000515974 00000 n
+0000519960 00000 n
+0000516264 00000 n
+0000516370 00000 n
+0000520201 00000 n
+0000520934 00000 n
+0000521139 00000 n
+0000522698 00000 n
+0000521232 00000 n
+0000521333 00000 n
+0000522937 00000 n
+0000523563 00000 n
+0000523765 00000 n
+0000526002 00000 n
+0000523944 00000 n
+0000524050 00000 n
+0000526243 00000 n
+0000526912 00000 n
+0000527117 00000 n
+0000529898 00000 n
+0000527305 00000 n
+0000527412 00000 n
+0000530140 00000 n
+0000530834 00000 n
+0000531040 00000 n
+0000531128 00000 n
+0000532172 00000 n
+0000531206 00000 n
+0000531306 00000 n
+0000532413 00000 n
+0000533037 00000 n
+0000533242 00000 n
+0000535045 00000 n
+0000533353 00000 n
+0000533456 00000 n
+0000535287 00000 n
+0000535930 00000 n
+0000543107 00000 n
+0000536136 00000 n
+0000546880 00000 n
+0000543340 00000 n
+0000549640 00000 n
+0000547160 00000 n
+0000573298 00000 n
+0000549881 00000 n
+0000587680 00000 n
+0000573605 00000 n
+0000590952 00000 n
+0000587918 00000 n
+0000593718 00000 n
+0000591218 00000 n
+0000596606 00000 n
+0000596723 00000 n
+0000601861 00000 n
+0000602526 00000 n
+0000603195 00000 n
+0000603864 00000 n
+0000604530 00000 n
+0000605199 00000 n
+0000605867 00000 n
+0000606538 00000 n
+0000607202 00000 n
+0000607871 00000 n
+0000608540 00000 n
+0000609206 00000 n
+0000609875 00000 n
+0000610544 00000 n
+0000611209 00000 n
+0000611880 00000 n
+0000612548 00000 n
+0000613217 00000 n
+0000613883 00000 n
+0000614552 00000 n
+0000615221 00000 n
+0000615887 00000 n
+0000616556 00000 n
+0000617224 00000 n
+0000617895 00000 n
+0000618560 00000 n
+0000619229 00000 n
+0000619898 00000 n
+0000620564 00000 n
+0000621233 00000 n
+0000621902 00000 n
+0000622555 00000 n
+0000623159 00000 n
+0000623765 00000 n
+0000624371 00000 n
+0000624974 00000 n
+0000625581 00000 n
+0000626186 00000 n
+0000626792 00000 n
+0000627396 00000 n
+0000628002 00000 n
+0000628608 00000 n
+0000629212 00000 n
+0000629842 00000 n
+0000630476 00000 n
+0000631113 00000 n
+0000631743 00000 n
+0000632378 00000 n
+0000633013 00000 n
+0000633645 00000 n
+0000634280 00000 n
+0000634915 00000 n
+0000635546 00000 n
+0000636183 00000 n
+0000636817 00000 n
+0000637452 00000 n
+0000638084 00000 n
+0000638719 00000 n
+0000639354 00000 n
+0000640016 00000 n
+0000640807 00000 n
+0000641455 00000 n
+0000642136 00000 n
+0000642927 00000 n
+0000643909 00000 n
+0000644546 00000 n
+0000644901 00000 n
+0000645269 00000 n
+0000645358 00000 n
+0000645452 00000 n
+0000645492 00000 n
+0000645624 00000 n
trailer
-<< /Size 2874 /Root 2872 0 R /Info 2873 0 R /ID [ <FB25EC07E8D3F7378AD544A90F746A61> <FB25EC07E8D3F7378AD544A90F746A61> ] >>
+<< /Size 2874 /Root 2872 0 R /Info 2873 0 R /ID [ <42D6E246E3124F0765D2813A534851DE> <42D6E246E3124F0765D2813A534851DE> ] >>
startxref
-645787
+646185
%%EOF