From 17730aac5a7ece78e2f8b54e6986e6e16977038d Mon Sep 17 00:00:00 2001 From: Bertrand Benjamin Date: Mon, 25 Jul 2022 16:25:38 +0200 Subject: [PATCH] =?UTF-8?q?Feat:=20Initialise=20le=20depot=20pour=20l'ann?= =?UTF-8?q?=C3=A9e=202022-2023?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 37 + config.sh | 13 + requirements.txt | 17 + tools/examples/chapter/1B_premier_bilan.tex | 71 + .../chapter/1E_premiers_exercices.pdf | Bin 0 -> 13505 bytes .../chapter/1E_premiers_exercices.tex | 21 + tools/examples/chapter/cours.tex | 12 + tools/examples/chapter/exercises.tex | 33 + tools/examples/presentation.pdf | Bin 0 -> 57659 bytes tools/examples/presentation.tex | 49 + tools/examples/shortcuts_settings.pdf | Bin 0 -> 136876 bytes tools/examples/shortcuts_settings.tex | 260 ++ tools/examples/tikzpicture.pdf | Bin 0 -> 45053 bytes tools/examples/tikzpicture.tex | 63 + tools/git/hooks/pre-commit | 146 + tools/scripts/new_eval.sh | 66 + tools/scripts/new_sequence.sh | 112 + tools/skeleton/eval/exercises.tex | 7 + tools/skeleton/eval/sujet.tex | 27 + tools/skeleton/sequence/classique/1B.tex | 14 + tools/skeleton/sequence/classique/1E.tex | 17 + tools/skeleton/sequence/common/exercises.tex | 7 + tools/skeleton/sequence/common/index.rst | 12 + .../plan_de_travail/plan_de_travail.tex | 44 + .../sequence/plan_de_travail/solutions.tex | 28 + tools/style/base.sty | 89 + tools/style/classPres.cls | 22 + tools/style/code.sty | 47 + tools/style/colorscheme.sty | 51 + tools/style/myXsim.sty | 150 + tools/style/myhdr.sty | 97 + tools/style/notbeamer.sty | 82 + tools/style/qrcode.dtx | 3542 +++++++++++++++++ tools/style/qrcode.ins | 57 + tools/style/qrcode.sty | 3051 ++++++++++++++ tools/style/shortcuts.sty | 318 ++ 36 files changed, 8562 insertions(+) create mode 100644 Makefile create mode 100755 config.sh create mode 100644 requirements.txt create mode 100644 tools/examples/chapter/1B_premier_bilan.tex create mode 100644 tools/examples/chapter/1E_premiers_exercices.pdf create mode 100644 tools/examples/chapter/1E_premiers_exercices.tex create mode 100644 tools/examples/chapter/cours.tex create mode 100644 tools/examples/chapter/exercises.tex create mode 100644 tools/examples/presentation.pdf create mode 100755 tools/examples/presentation.tex create mode 100644 tools/examples/shortcuts_settings.pdf create mode 100644 tools/examples/shortcuts_settings.tex create mode 100644 tools/examples/tikzpicture.pdf create mode 100644 tools/examples/tikzpicture.tex create mode 100755 tools/git/hooks/pre-commit create mode 100644 tools/scripts/new_eval.sh create mode 100644 tools/scripts/new_sequence.sh create mode 100644 tools/skeleton/eval/exercises.tex create mode 100644 tools/skeleton/eval/sujet.tex create mode 100755 tools/skeleton/sequence/classique/1B.tex create mode 100755 tools/skeleton/sequence/classique/1E.tex create mode 100644 tools/skeleton/sequence/common/exercises.tex create mode 100644 tools/skeleton/sequence/common/index.rst create mode 100644 tools/skeleton/sequence/plan_de_travail/plan_de_travail.tex create mode 100644 tools/skeleton/sequence/plan_de_travail/solutions.tex create mode 100755 tools/style/base.sty create mode 100755 tools/style/classPres.cls create mode 100755 tools/style/code.sty create mode 100755 tools/style/colorscheme.sty create mode 100644 tools/style/myXsim.sty create mode 100644 tools/style/myhdr.sty create mode 100755 tools/style/notbeamer.sty create mode 100644 tools/style/qrcode.dtx create mode 100644 tools/style/qrcode.ins create mode 100644 tools/style/qrcode.sty create mode 100755 tools/style/shortcuts.sty diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..0d49fea --- /dev/null +++ b/Makefile @@ -0,0 +1,37 @@ +CLEUSB=Cle8G + +COMMON_EXCLUDE=--exclude "__pycache__" --exclude "venv/" --exclude ".git" --exclude ".gitignore" --exclude ".*" --exclude "**/*.ppm" + +VENV="enseignements" + +install: + git config core.hooksPath ./tools/git/hooks/ + python -m venv ~/.venv/$(VENV) + ( \ + . ~/.venv/$(VENV)/bin/activate;\ + pip install -r requirements.txt;\ + ) + +update: + ( \ + . ~/.venv/$(VENV)/bin/activate;\ + pip install --ignore-installed -r requirements.txt + ) + +clean: + git clean -idx -e venv/ -e video/ + +sequence: + sh ./tools/scripts/new_sequence.sh + +eval: + sh ./tools/scripts/new_eval.sh + +rsync_cleUSB: clean + rsync -rtv -u --del --exclude "venv" ./ $(COMMON_EXCLUDE) /run/media/lafrite/$(CLEUSB)/Enseignements + rsync -rtv -u $(COMMON_EXCLUDE) ../Divers/ /run/media/lafrite/$(CLEUSB)/Divers + rsync -rtv -u $(COMMON_EXCLUDE) ../Notes/ /run/media/lafrite/$(CLEUSB)/Notes + rsync -rtv -u $(COMMON_EXCLUDE) ../Productions\ Eleves/ /run/media/lafrite/$(CLEUSB)/Productions + + +.PHONY: diff --git a/config.sh b/config.sh new file mode 100755 index 0000000..f0c8401 --- /dev/null +++ b/config.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +export ROOT=`pwd` + +export TEXINPUTS=".:${ROOT}/tools/style//::" + +# activate virtual env +source ~/.venv/enseignements/bin/activate + +goroot(){ + cd $ROOT +} + diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..d7b08cb --- /dev/null +++ b/requirements.txt @@ -0,0 +1,17 @@ +docutils==0.18.1 +gitdb==4.0.9 +GitPython==3.1.24 +greenlet==1.1.2 +invoke==1.6.0 +jedi==0.18.1 +Jinja2==2.11.2 +MarkupSafe==1.1.1 +msgpack==1.0.0 +mypytex==0.4 +parso==0.8.3 +prompt-toolkit==3.0.24 +pynvim==0.4.3 +restructuredtext-lint==1.3.2 +smmap==3.0.4 +Unidecode==1.3.2 +wcwidth==0.2.5 diff --git a/tools/examples/chapter/1B_premier_bilan.tex b/tools/examples/chapter/1B_premier_bilan.tex new file mode 100644 index 0000000..d93be71 --- /dev/null +++ b/tools/examples/chapter/1B_premier_bilan.tex @@ -0,0 +1,71 @@ +\documentclass[a4paper,12pt]{article} +\usepackage{myXsim} + +\title{Étude de la fonction logarithme} +\tribe{Terminale TESL} +\date{Mai 2020} + +\begin{document} + +\maketitle + +\section{Représentation graphique} + +La \textbf{fonction logarithme} notée $\ln$ est définie sur $\R^{+*}=\intOO{0}{+\infty}$ par $\ln :x \mapsto ln(x)$. + + \begin{minipage}{0.5\textwidth} + \begin{itemize} + \item Elle est continue et dérivable sur $\R^{+*}$ + \item Elle est négative sur $\intOO{0}{1}$ + \item Elle est positive sur $\intOO{1}{+\infty}$ + \item $\ln(1) = 0$ et $\ln(e) = 1$ + \end{itemize} + \begin{tikzpicture} + \tkzTabInit[lgt=2,espcl=5]{$x$/1,$f(x)$/2}% + {$0$, $+\infty$}% + \tkzTabVar{D-/$-\infty$, +/$+\infty$}% + \end{tikzpicture} + \end{minipage} + \hfill + \begin{minipage}{0.4\textwidth} + \begin{tikzpicture}[yscale=0.8, xscale=1] + \tkzInit[xmin=0,xmax=6,xstep=1, + ymin=-3,ymax=3,ystep=1] + \tkzGrid + \tkzAxeXY[up space=0.5,right space=.5] + \tkzFct[domain = 0.01:6, line width=1pt]{log(x)} + \tkzText[draw,fill = brown!20](5,-2.5){$f(x)=\ln(x)$} + \end{tikzpicture} + \end{minipage} + +\section{Dérivée de $\ln$} + +\subsection*{Propriété} + +La dérivée de la fonction logarithme est la fonction inverse +\[ + \forall x \in \intOO{0}{+\infty} \qquad \ln'(x) = \frac{1}{x} +\] + +On en déduit, pour tout $x > 0$: +\begin{itemize} + \item $\ln'(x) = \dfrac{1}{x}$ et $\dfrac{1}{x} > 0$ alors la fonction logarithme est \dotfill + \item $\ln''(x) = \makebox[2cm]{\dotfill}$ et $\makebox[2cm]{\dotfill}$ alors la fonction logarithme est \dotfill +\end{itemize} + +\subsection*{Exemples de calculs} + +Calcul de la dérivée de $f(x) = 2x + 1 - 4\ln(x)$ +\afaire{} + +Calcul de la dérivée de $f(x) = (2x+1)\ln(x)$ +\afaire{} + +Calcul de la dérivée de $f(x) = \dfrac{2x+1}{\ln(x)}$ +\afaire{} + + + + + +\end{document} diff --git a/tools/examples/chapter/1E_premiers_exercices.pdf b/tools/examples/chapter/1E_premiers_exercices.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e60c95ced993da9a94f696d3c7c37c5f12d6b4fe GIT binary patch literal 13505 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 literal 0 HcmV?d00001 diff --git a/tools/examples/presentation.tex b/tools/examples/presentation.tex new file mode 100755 index 0000000..39c70af --- /dev/null +++ b/tools/examples/presentation.tex @@ -0,0 +1,49 @@ +\documentclass[14pt]{classPres} + +\author{} +\title{} +\date{} + +\begin{document} +\begin{frame}{Questions flashs} + \begin{center} + \vfill + Terminale ES-L + \vfill + 30 secondes par calcul + \vfill + \tiny \jobname + \end{center} +\end{frame} + +\begin{frame}{Calcul 1} + Un ordinateur coûte 400\euro. On a une remise de 5\%. \\ + Combien va-t-il nous coûter? +\end{frame} + +\begin{frame}{Calcul 2} + Sur une totale de recette de \np{2400}\euro, 40\% ont été réalisée par des paiement en espèce. \\ + Quelle est le montant des paiements réalisé en espèce? +\end{frame} + +\begin{frame}{Calcul 3} + \[ + 4x + 5 = 25 + \] +\end{frame} + +\begin{frame}{Calcul 4} + \[ + f(x) = 3x^2 + 4x - 10 + \] + Calculer $f(3)$ +\end{frame} + +\begin{frame}{Fin} + \begin{center} + On retourne son papier. + \end{center} +\end{frame} + + +\end{document} diff --git a/tools/examples/shortcuts_settings.pdf b/tools/examples/shortcuts_settings.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1e1785fda5c38400715f5c52a8d86fcf2b67776e GIT binary patch literal 136876 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

#N zQ(MyMD+Fq3f_*!v^F(%JqdceDWyz>cl*tq9SKSgn(&3jy#gQxC0)>x&x=1IzH?!EG zB%a|gwe)d)jSy4XnIXCKJOeCEEfVq)0;iGo__og$__14)Lzw zUnzMXg&>A!l8wnN!f_DVStg1WokIgmb(1XA#llC{JmeO#F5)Rz!(pS*@vlGrrjt|` zB=&8T5J10?c!uOK3bm}_!8Hz z0>wT3H#-(Q{x{)9f-lD+C?it^(Lq54Ohg#mEJN%8DZ2l{D`(XSvV2L3h2GjYR4SiN z{N&nf5te=d&&2$rxOFc+6R*rr=0Z{{lSm}z>=MdUtdWk}A-idbL&Mm6GIpI7bMho>68%dGI`ZE);PfYPGAIjpOBVfQw(%pr6fP zP0xH*KAd1UXmFl;9DFU4?DT1-XChH81N-ml6DP)OLk&)kT~hYLAO2P%N6+l@!Zp^S zSJe#KVvs;7->7^H08`gx`kO{|H>vDakO=PMFfGBxUkOQLOENLJe#z9NzC#}c=27pY zjwF;EN|3o`)HvATWuQo~gSh@8)R_f`Jk-1dbFEu#wiq$j?N{jB5MIl!Z;8VQ{b02? zAJrW-FSVSS$z=k-k=iAm7%S)UvR|^d)>`shxDLrzHFMseUT!Z!jMJEAv(tcEcr=LAY)IK%l0)uB&d$mGNBa_t+ z+NvQkW>oj?DGuxe-OMd`*Wam=>w+r+V?u~ozQL@0{!8S}JW=6l^Aejc3>fQK;0-a0d&4i|-gx_76&zbb5z-OOdeM=<-$qEgEXix-u>bQf~qH2eRP_Ee& z2kMG^@Rl}ZDyZ^)K^|I;>~>@UUqX&Ee6>Of63A;7DZQIt_wr$(CZQHhO+qQkSZQI^` zZYO>F4*tPSP1cuGB{izb%6ixH1Xp|rHu);tFE2neqdGA50X)ig@<)SN`8<3IWWtk{ ztp}F`1>#a~IFJD@A1)#Yy0&Pavn;lmh|V=NsBQ^VY!j)ifRP8|F6nMZMdHJeIdWlVADw40LhH+>2#B-Su!N&$&OTwn-EYuCK3F+?O=`oUAE? zi>Eb#bG~WhC)^60=Gfq>byM78)tG_M8q&yNJhD4lL7$4g46|;I*Tb z@z*hKWSdomrAR6^yJbOq-DAa6MG`sz6xH(GjqfG9T}4eToV=PCGCX*Xx;;!1SZ0V< z=O58amuM!CdTV<3%$@pBRoq;Vr39`*Y%}!aBqM5NkweAKuZkMdj+X2%JY=q0dd8%x znwhWu-H;3EfEJxCA5GgU1yo4w-+y1UpH2!~Fs-~x!!a&OBtAV)o(ewII57i&?E~Eg zlb^-@>gq*1#z5>h`9>{nab@1MM}_LSqeH1Z`BaVLF4NYw9=_%C)Wd+t{qh)Th!#R= z4u$k?PQemKH}C?rrGJ_7eW*?2d^ZMR6KuOqY@t!1vw?P!gDPGdLeqogI*`{GM*LCdrq3Z?K^8M_O&5R!o6Ff7bZ$6HK#?3pCz{0CxAdov!233pU2X$?HuQA_nNgakAiXK;!Wli zY$Yn4p?xnTWRA>$2X(0R_z|QZp+$XhRND>2ZtW!h!PuU1hoz<(WdTI+fDXVI{fyiv zr5R%mZ_AC^y?7I`iTI7UCjk7-rABzzGLI0#pyGHnQ32Lt4^>vaZ)pv}l$gZ}rwKC# z0}?iT`SJ#I)!CVE_QH^GyO{m^o*S@mjn;?9I59UU+e|!aa=eg=8?}~EonxE3$lr?ci^LfUq zF~LiC@*>B@-tcy_r))*;1Z8)i=i^&#EvQ$!RFS4p*yNi1`Y@MXlN~w{d?o`SGEH+i z;Xv_o(#N3O>itAXO&F$uFQOQ$G$XeLl4!tvTs}zc1`b$sMpxGCI&1U0FKc+&tBSi& zR+H4@DOQPJU{AwvvdSA0#)n^Q!%;y>s&xPlyYYQos3dq{sPs!mG8{+lu7%dTG6I^r zc7Yf6?&T~6Jk`-T_%ly2L+xAYgJ^0yLBPHLTGdMmM2&g@+__o^9>>-ck(K@75aF||C zOa7kojPpsYxKYfHv6OT`k%`{E%T})b-MpRFUeOBK+5b2QftJvLB1P^I4XtE2QZ)*> zRepRL0yiiy4S^}F|3gNam731H#&8Y8fmbh-DD+Fs8|u68mM-mRcAlq_6prvNLve!vGOAkWF=O~M zGV*-gg0N<$0;>$lsJ)gB!t+V!eG^;)BCJvi>Y8Ymnr;UW_ACv1iGG8{K2|#0iavI& z!2va@7#T4~rC-nQdvA#|Q(3{;48Tq>Zr-sp%6@eM!iHu%|H(>4ZNH^?o<+t_@oUUB zGy%ayQMujuA#cY+)bj&d2=!16O9VVGsiI+MTNir`;^d%&tw@tb@&b*pzg2R90%PSy z--QEnk@gB+i*4$Jd#J7e$-~J`*rE}Fl|BwY=&AMqP;MTq2?72eQ)nrm1k!=6oNsR8g*n z;A=B`+|#$Wi`lrdx~$jKNBmEzC!Wa=qK4(UdJjMJL-(^scqVO9+(HXU+aPuQpUZ@# z-R7w<+`%XobfN?A03xQ6Ee)YhYb73A8mq4I2$~I~th<1brd>e>)@XQNRrMV{-RY4% z-TbN2sOs92;M`WpMnyf(Zuebg2{gXETr>u97CheX_MRp$Zc{6GiZ2YAHPgHIVxst> z>a0`}lrG=?HELbwQ`z%zj=u_x5Nr-g@PGWigk1%xAY{lm=REN!o>NdJO4;dG^YJI#`fioNh)yIxceAL^K8;qahWBdVsqP+~eyBo1iusfNt!D|ePUygz z#D9C1#q=Ij3U5Y#JfV%PwjZda%*!?5n+Qv=om-J7(<+r`K>^? z#pzVg6;WycfL=T`<>+wPrd@T-E!Ae*s*8+X>#0faMW1^``_c0EIb-xz=cd4GogJ_2 zTIMvHo-A&wvgmF!Jt2$lwbKka6Dd#D$!wHHMFyxUan5X3tj;j%pkOG`0qcQ9K7sa` z3mQ^J;VevZM8p1hV~Hg$!W4i<Xub$ z{23YwFzNH{L=t2xh}sb;=THQA|GI?bqL+I|Nr@d_&5`lyV)&uFwrR12SWycq7a@(; ziGZykXAsnc(2Ui zO)AK3a>_sJcm&p%nVFj$l&`F^0$6EX=^v-thnliVEAHKmixNy<bs6jKw?`5=shSSz8J}T?S0_l2AG}Zmc9kbs<61BG(r5SBN)ZT+rJdFs z%^IbZoSx$WVTAh@oqKZy3iJ+KrNh3=^{@5yJ=K^K&WhyEWnj4q^<70CcR)&o@FS<- z!-_yoL3(B8QRcT&ArUso_~LAMSdR!x66ytlSeF@#;#1wDm!3qkFc3dK<@Zu|6T+6k zaZ6x>gUoglux23)6lRidBOG^DGY;=arl~9E3LH05<`cME*QfNn8zwE-l|Oyjo!fn* zpCIdNX^lD_$8V)d=4wrik13InsBA16Zt38qrq#qKqy8~9)t;bpHSxV3G34EXJ!PU6 z-TMjgdM3Vq${F$aPM1EI4OPrwcX>4TzA~H4yy;mgPs1or&3;2R^6aph!FM^hicQK0 z_P&oSu+0V7uMMdKGaVUhi`|xqL%}KkWTM0M&dAHraz<_KM3r39uf-9IxU3bd*z+ai zs`VYi`c(U6VMweA_SY5uX_92+H~5;eL$Oh$f#A_J0L5s;B{v& zof4i$P(;W2y3##vBU4r4(B-i|=}Y#R5IHk1T_FCEut)zYpJ;3JX|`v_TVV@GYr==n zI6|~=nc<@!$`p0?Ie389o5vrW$r@S*5`Q5UUpSrfP(>_VD_Op|*$!q?*7{MUcwNq- z{J~w`-cn7TlOMol>ZB>qx|IG%N978#DV3gl>Dc}`Ac)_WS)Q$s^RGrWBG&}EAPL(dkW#zqCD7{|6Nny+>T@z= z8}=LW3BQ-(&r5a)#_WvfBCYW6{WME~(RLuBQN|5Tl}8ATB#uk$2^>T+ zKx%xT(8;}_ym{9T&T8QlSk>PIIs5?EMr-T zBJ07vg3`{x^9^E5H+tzQNf~F-sj7$(j*K`RnGJ%JbNIDQDmQ#B;>|n&FlkBw-sCC9 zyP!t)90g%I-8O<1z=yexWWx6l`T_>4#<@9ONkT!T7;hBWEVt>$mQsW0U+0t2g=W5g z*onM(w6=g9j=V5^$7?5FxVC~8(>a=2Kbo_V{l|?ZHMWtNTW<7=6zDW)f4yvUs0pQI z1fJ98;!MlbWqp{=ix#_jdKzO2+8Z$}!F;dyTvk}!Thr_e5rJ%*tW$3X#x7>0M9!U2 zq)AaiT~;T#_WZRzHr~_EJFeZTBY|lr-=Dk*7+q#%}M;Rm4TONncBR9P% z*wPYLG6K`W8HxJ58)R0fgEQhswdvp}v&OM@R8VoeSBGNv8NtTlVYG2e3=Qx>a*e!7 z;6_ZsZ|v_Kbz`-Rd*#A87a*fyB(rJVHnFoKHYDH_USaE`kGWRj_+r3&lM=U4=&&0Y zSH_sLyFAZT>KXf1XcUL_WMj~Tin8Wb$U4LGbviJ=PXZS+X1OVP#eROW0A&m?zEtkw zA0$!eKFyjR377QkFf(}lhITe+$;A2^N7stD>6h2fy*nQ03{$ALuVEkkftD zOXXGaBMD_hnQW`>)Yb^ItCz?^NiXO8g=LJ&IE}27RGHt`=q_CU__RBplCeV5gB6bwt1n!)Zh&g#2eMRwraJqVRBoHq~@Zsdxcz# zBEbw$!*sxNi4GmvXtEr)fnDckTY?W%x+|m1h}^8%D5u+cw(b&+4OpsmTbRAqk3@)Z z|2D?Ll>n}kPcUKJN-bJ7qm9!K?yw@Ofjb6}aX=?wg$mu@d@ATtjjb#amHne?6$)aH zuiw;RHwGk{BwxKr)((|rEechy*OK{1b-oY%L54K-sy=bBn44kByvC+#lW%n5BZEB4 z%PdJEL!_(imdQ6kAy@cr^K`hnxLoiPs_?rolf&w5d-c6~+4Zg7*1cZ(yKw4*D>zVMNICYJ zC4{k1Y5|0RPTb1@F+BlKkM<)A0O;3z5x{^02GBq(#Z55${Re)@5-G&_r!oZd7sZXua3HEhh(6^ZWM`R4 z?$TK6>0p3>IoXL~8|flIalHNWt}T-&WZQjc(kXEQnb_;2L#*5e)hdftCo8OHau z5<-7zO{EJHvmXGA^O1d0iEIunKf@Ep`*FPSF-Kz$ET7^J>p`Zr=ShJO{L1y>!5&K5 z3nS-fI{+xl2xy>|zL4|hTOxNms4D@@EMWErSdxiOEn4)1q6#O4q1CLW&WTZss$Xn~q5(48rB31)OTkb1}bb$sZqKaF0esbSizk~~KQ zK4W`255H#UtqZ^EVMM0_OrKg_z?MK14;Vbhdn! znh|t{?-7-Y>?~a9wf{|jxpH0XVjZ4{7%f15m=3-tS?J)fZ5+_N$o4!)<3vRS{*=uJ z=hkr3H7Cb%w5p+`Ksey{vBUB*mz^dHay^}TZL8FR?^sJ=Yy4QZ<+a7tvXwKPBg#5C zeCP^2wFymrIG9Sp_CG@rV6~O_=VpNOM!bE#3h)c$*9e1YRww#p*uHd18dr9Ay9jeW zZ86UheylW`+egb88CnaRyenyrB~GL(-X)=+p9b!24_H)BF;B@0ZKNCr2GppQ>upDi zPCy(c*!jynqabY!X)HCpj_)*hd54Fi+Bvc; z1HYQob}@@yw|9O5`|Rp>@4S8OvkUG!L@MP#V+e=LA&+EDhSp>mgz_$K+VSX4_`v!*MpoXLb7+wtxWlJUC$(a!&ECcC9ICeG+V zy2F;wJ(TFPE^p#Gw@7CbyLq8VR_A0KnxfALy%tO3YPogDGU2-A2W0}ep?_Ba1MQ{Q zb8(a0=WvML-^R%};)V=F;pm2pO*;Hy3nDIS9y1pQDmfCyfC>|FIXv%;z$JlxI42bU zSo8x&*Y_iq&t7{G-D*2AJ9h%bi<$!kX>LoZ{+SD`I{&~{uO;GJRdlW>*7;MkK8&J? zTy!RuQb9{OSk3I;ZqXatS(DR2Q7!y!id%iI9XKW}d0iv|lquG_G*zi+5ewVKw~~uboU-mdD3yclzxM`{!C*M3w&%%=A{wAlnjv^KJX6{D!D&q@)NUml zyQW^tO`)jd+5EZ3^J0gkE=Z{9NXCWMxKTy!RL<=fUi2RNh0T!F0G zSs2$#zS6{%V<|l}v+kcY;JLQZo9=F7msrQg4fdZp)axQ__L2?dpIaceE|sy|lB=Vj zU8{nm>wFs^(BU*|Sc5I&Y#?SgOD>AlYUWr1-BpxMC-b<1nvnEj16v7PGHB(Lw7kM3mQk!UfRWeT6NdTgpA1 z0W`3rlvugS0>Z#nT|)9-!P#3hYgw~oYFz`I@olQ;NaJacu$dh}W0P3{-a7nozj zkNuE!HoIZG2CL9r-{QKDa+bgf=3^~Bp+-gk6g}aD5$-y60nv(UaXD3H!<^xiL!hYI z75#j(y7 z^XU#Vbd$34ODdYCfMol$Q!aZU@Q&oiJCO1_-LMu>=;4^dg5dF@G?kkW7mPNi9D(@E>Eo0%-yBSmY>DcHkG##yi#Ct zK4kJUYx3HQ<< z|5hql>LAOPvq~%V{UzII_KN%-5%3#fv8lqK>HG-J>_a|rm5te*vT3tOFP42Eo$WN* zy^&Z}_vvW%YB`bSC%W<;(@JjK3~Zq31ZwODWx4O77;~9|M}FUa6n+}3u}%P_ps3{m zP)7GwFPge7#<`+aH=j;jpwG8I=t(&ugt$qNITMDnOsvSS5rF! zd=lXTo&~wxacF&QWO9-&@S3?WH@m(}q=T1bsqr{%@%vEEYq)CL)yO!y;c8T85D2be ziY7U5wWSZvaxS>04=b_0(Na zN15B}>3)o9{$ykzr?6#Zt2&a~NLD@TL}v24T)F#7G%%e}BnY40 zjL1cau%=L)CV#@JWf}%DDPY?Sns&m*zn#D^j~{!mnK5trc~!d(RpQnA^~uncYuSwm zcNs@+j%y23_Ow!m0yoh+%{;@x>wAuj6B+fl$^W^0L)370^O+YS_vx_-TY6t;lS7Ae zpj3rPJG@_=ODlXvD&-S{$_>cn;Y?$KChQFE*|1SHkx@jScwzH;sZ%CGrP>mud5LA8gX->&a2u{u|G;vzfA4_*c)qg1%U#h(zXC zA$q3F-vO|eS`pb!%yAq4jxpsGQ%!(daKBWB{2_FF87`f7Zyfp)P7BcGn@sN zHd9si?;Kn~YBFZJC2Mdc-H1rdFtn2=2&DDZs9*htUU!=qXe3Kw`4sc~fXlo~v0JB0y(115fq z`P;tapruSmRPY&t9DM%5R$EN2F8*71#rPjl9KKD-^``R>5Y%gg0`zr>% zh^i6kz9UsTIK7uj2W01yC;!2hZ1WBdSl+dfuS4u=1A+o$ZJoxHgrVo?mDtQb0L5Ncc8)#cz1D5?);8tQ0{09aCt z4VoMup9ltdo|uRhZwo?lJmfT6<8=G#_3QrXyRvaP(X*cJ4D0Xs0-;sT2owwU@EAY} z00zeo%a#u`xC~nk@A70HKme$J2MYv-+|YnII8QtOJ3?s46iTE(52Agry9Omr0peq% z6r67dm%)DxsL5vebpTMG9-QwV9FM>c0E6}kju?;(K*3IEK*2mX11ULN>TmxjFo=^g zkL2Ii49GSJAd`-Z5*rAl?939e20$s#j^aUV2VegT_$4cd8Q>iJvw{j31qlJbo-=RG z28l4f59as=dtdO+P9V=5emPo$wDm&+8=m4F_8v!a2An z{Hxf44lZ#RPk-aMol2T|aq2YAWB& z$hyvkX{;jSex4r;$Trf)uCd`TNg?v8z)JL)9gnE*nqt5^`kgJ{tm(eY=@u4LzJ|G) z`D6)ZZ4Bj`_zL6wndBKfDLpXzMrhJXkg_1B-WoUJAe5_;BOMz z?X7+VMr3M!|5||)vaOw+R{l4A??&$^(ON4jXE7QSPVeEV=6)Q?*iAN zg!rH*WP^j>0NkXtg-{l+nFV;t?LF-1st6~?PMrwNSKrxiW6JK76`B~dz{@0ua*&h` zQ!}T)-(a#N@?^4R=ouLglQU;oYQ&5@Lx?fro6evIuL@#}bKXSXqjL^1a5c0q_IBQI zR`9sz1?(B)Wjn663m+z*R@v%_2U-InkfTR*2j2RN_Xr3qGaRw0TIz<3?F=QCG7 zXDbQCmY2(#9FXL2x-%R8bUx5e_st5&3_lz_666`OMdri@JWw|q`y2LWr)FA$LAQ;U z*F$A^sWD5hkwx}OnzNkm6k<`WRc!AA(J$N&^9UsgObKlW2^0+XgHJMjQ9#-_mbL>GVLQVq60?A2OKzXF_0U75l@X$#IeS2 zNh)e#vOO?Bjr@i2(i)icM5?W$!fGA=DgkA0A5SS!wqWiz#%$WRs|_$EF}Cjl^T&Es za+1#2W}zCxf_OX;C%aXFYG*mQ?FFxd?fesJbXxU!(;i6Ne+VF+?q&D2K4WOoYu{)p z+;vKm5=On*0C1H^%@!6p-#%qmA!Cx(Mn^m(YtB}c3Ws2mJLqyO9O6M zRrh+zRt@97CL6QhrL*F8;*ZQEsgb%WSf2_d;HoGpSx?Qv&*h*GUvKg}|Q# z6DxTtxyRE>c0HctGa-c{ZBS9=_qAv}xqFQmQCYn62v~nvuUL&-V-W{$N(w7AX12P< z-iS>(;)+t1go4_%t=w&g4q9)v6~W*v9~Nqt_8)=&#NzB`0P*3`=jfGe&DBeko8#%O zMMRubrN9puLp>~aS#3QmzgMDF^W`SOvpObYsNGP#OmX+CV8G)|6@-ycsz9qaq`E%4 zQZ-s#y_aX+RBgv<2g=6i<6$hA3dzEt9SBM+OWA#Riys3R}j+`>0LYc zaO1zG?kTq2ni__GorQIHeuFnB#kF8&PUU_i1;un{Pw4$w&2hk9=FKlK?z56GVx21* z>Rj%;-2OTnZxrFcN#pLN(vY~~0hjyYg1taaojFk~pDS8;8D^-O3qDz}gNVlJ{$N6& zz6k!44*EUfdS4u$SV75xNKKPx^sK_N;#D00b6vz<3E%df1#}_wQ9Ru&V=_^p&%_b+ zZ*y1USw@R7K&}4`onUTmm8ZQ@kQ)<2crd%iZ#sYku;doIW6vKvr5dmY?(@yNx(D1v z!>t@*XCnGT6P@yxsAgQm2Xp@Q#_mz0JFr1%Z=MqMCp%pqd?Ap>%Lb2jxQE=@TmLjg z*%c33Cy0inAuGC^l2J1j;{EzTbx!Q9h%*M|W3qU`E(@3;fppfIao8dQUB@;O1-Z;C zAda&yrk**aOqeW^fF{~ilBE>-M$+WAjL*VeG9Q`mgY5as;DcXO#>ZfnJ-8Rl!|@XJ zUd&A|U^Qs&=Jh;pQv{3?21nY~!sfaC+%XrIG31GSniN}i3SITD()&vW#<7|7xmp^{oHQ0o8%`*A-`Bdg}R4(tR=bCp}1j(a9Y5cEs@2$(g zq?g8mua#2bn&!gBKFilX&`%CJ3}ih~9jkh}XdmoL4Q8z(Wxh1O<$jcHE4RJi!;6ni z9Ks@X5JyoX0opycCbprelJSPTVsaGtuGZv&w}4&{0DD9BUEB-i=Hmd|Lhs;=RquNI z9Cdze-5hY%We9g>4={Y0H1iO(^pazG$sf&^6|3>c-rk2QyqarJl5$4xc5mm7{r3Pa zS4ZL}DG1vGp*|@U${r;7+(REM+6_vfe){%x!2DJ%Oa;*PXe-Q9+nWRC^ZJhrY)nVAT*Cn3uDsBp2oW7s>s z$=OyFNWF}n-84zk^1ExA?*VuZwF1u#ap{vpkejJ9s0nibxjwDzJ<&elt;^f2SK1I3 zCod@02)DO7PC;glo0YmhHM;+pJSUM*2X^~kk*lckZ_){)jGXY3e_oqcv`{32!w*I( z*pm*~=B)kl2O1<}p7h@>?gHE`-vGO%xiUx$>P2N7L_aS}sc3ZA7R9xZf*1=Q;JPrp z`&1kmtenUr9mn#1JUG=P`LOz~N=%m)v-#wA3f|VFL$yv-dEz?^1!URcMcjS)rb|^$ zS9x!X79gU}*VBFuJ{rLPIKH^PAY+zx^J0lDVM(1CTp;XJeWD6Wks-gnj zd5-|ztRCfJZtTX0xD40xdeXcPtQ5u+2CDXMAg_&IL*{xM>%yZ^YlCa+VK0e+k^KYG zj`U)QnEd(2%gLQ>nhkoAaI7LZQ*VdbnLNpYQ?YnW$VRoG*w zf7RFV&h7!@Tf*PulAP269xJTIe2TIx$+hFUPNDY^Sg-LngjAsngV_3~;3&KLYikkO zq8K(=vBuvlkF}vwjmh486!2`zdS=~dQ5zsdn-aj>BHhdJ*YZ7B;)6AD>Ef}nU#n^v zK}Xh7N9pjqS1=?lJi1CJ=pTuiyR&v@Ech8$$4veL)CYHTmz|p!>7A>iF z_v&h9Gr>#m+u89X*1cyN?A1th7;-~toz84!H4yt=SN1Q37AHSF^a0LXF8f}A;_pHY zc^vME8kVoIQiB*-7-mG-V;9gpLw8Yb9nFH)EVj><=EgI~jsOXztN=X&90EL7xVKwx zFH`$>$=X;L=G%ah#By>Dn%Sg!9np5AStrfB(z_*5!O_B{_V%Sc&?0>l(dR6irbqXW zF=HK7DRIQ*%k($g>Nm1GXf+I4sfOD}%Wyo5jH@9$=onBkVIRuwHY-2`Kf5~HZC2lK z#+5ofKeB@0hsrZ;>QP@P=edK>+q=MB&;8#mQqxBUS^u7U4q0=}b?!$WnhV9&^pG`- zxM`UyGy9uP>_;zEx&xq=#iCKYkXS?9}~(L zq|}3O_GZdk@*~pI1{B{+o}^jR4d!A)Ku;V2z2dnMQn>1`Z+( zZV_xe4j3%u4ZK(fkYI|&1f84NAiAQ-2c@w^@#qlNWXP$nU<#(v$7ipV1ISHK!%~yt ztASU~z8LVHPW?SVRmV`9bG+1NALSG7>J8)B zs`O)yyz6NriR?(|ul%cvLqP@DQVOHi>VYm@>P9PHloOhZhk>nt(|)^nCI|XdAutzX zpMh-NpGXIvmMG3x>8(gTBZL+|GDEdD0ZT4=ai$UDJaCpW znHBv$R$T>FxUaQ)xmEN>A?apoOs!^3YerGSs}Sf{nK!lG=#k@j`91C{k{4^i=#R#& z(6`9NlqnDym$7#Z7wD&Q+YX2FV|+XmoM~d;y*4u3gG6?* ztW(cetyMqPy(Hi7L%o4 zv5!z;7I~Ie3*m>~5@}8hL|6Ev=IY&auqYLJK`#2gsX`KHcY2uqVgZ=xk7Fn3g{xm5U9E)^6y49A%Q8O13? zU~auADDxdWXr-qoJ=GnsKbHCI(60iZ0I%<#e-#0Z#r4<_pIj1l2SnH;-kh)k8FFbc z?!NX=|5-0lHVIC1Ff%j5WpvQz^EZ7>k!nv?#_QavS+X`mxu0X01}Abm@6aIfSj+?Q zO{_mAAQ3;CBF?Tcc)lfplx3GLoIw%mx^|dMtFmWS^?(GPSsVUl!I;H$`IGus@P!>+ z@HXd;>#0G6>x~gnq}sLODwlPagSXjdsh~p5>_V!pgOO)9qkh;u4%KsZdKNWUx!Fi4 z+T4AfymM+?kOqpOKB-}w{bzpdh2^Pd1m5={iqAgTi0meWdBk6}M+G61O+@w;rTVX< zN-XS z*JZ~%P46}Vm(^v@JjTJ@%1g2DfsJV!3Y?8T-&R@QEFsU2>-Ba=(TXUui9yHPe&q6y}$=J~DDMx9rIH-y0+kkUqa3C@_Oi5t3fFi{V0ZL7psOH!Ctnlv8sUr#PA{b$37 zm-KL!;eNAQ>A_A32muD(IOp6H2G(~5>rHNhuzyUHo7I?XGHCNVCY2NQP7XIrvryos zqYCSD)!eP=g$5|Y$j!WABCVUdK^>1GO7IvaQV5t%6AUdh7zPO*6TNJwCHzH;@pITH_03i>!M8&Vflk)vnfY zH6CvH^P669k;hdp+K~PJ{Q&>wczTHj#0*_4jDZJ5q0ReO%40-;VkQy8)v!D@16(MxyWEj~jwB!vt$LY2ixvGbZG%vI>v!Gn)u zL}ak;fmoIUmMwVWl-HEi!d`Wg^J;mFeknNkSgWh-s^nHXytS>Dp-xR!J>mrF$fDSp zFy11uc*#4?jOuGQC#_D?$6Foa&Q2FzmSCXIcdclY?c3GqO@{j*{2BxEItMK9sjX<8 zY1orb<>rV`@IAc#pU7@UOKDknUH>4zS}oIT=RegVN=RF<{V3N)iQ1YRYQZh-V8hg(T!j z?O9l46!XH>Y$j&bym*nrS}VXXKW1+LcrSyuHZ@CUuYrm{sQe+7YgcaC&_XiRB?sPe zNR_>y>%gCkf@VHnmT1dk;e=zD=mUM9s@U$xwH4Y#SFXvEPZag_hGR4+OILn-^K%<} zi1|;WDdzt$nqs8q`0rs9BLN2kJJbKmC;rdT6azgIBgg-pO+nF#T39=qI1X|1yA1O_|9Z8JDaxVeds0RXc*ORym=in|eS z)6gsuio1ms6NGmkdgPw&aqK?pd=2$n^sZ`p-R{mSR$4ShYH_9q8RHPtR`avM3HYZ{ zRTUCffsJp>>`Y_!4*;?_+UGAUS_bG`3;a43EnN6#>-57R4DbPw<_MV9%4a2KT;95~ zA@Fbg%g;fA*h4@#IzT(x1G00lgZ!YM?NLL-H#>lJwR5s>_|Kb@;^OpV53I1(2KxW5 zfbl~YEdUt{AjC5@7nAmHLEmZBMh7*qoVn5X5|ER#`45aPFDu07Y(rf%eq0+mH5dl@ zYp-J#C@&&NNrbKb6FR7&GZTRKBU$f5(SvIQ5t?81Nm+Ps1Oo8;la62Tsjp8jV_reh z@A6leB_xfFBNue5Dv)EA%OOmkCq7? z`pgp0+xr(1RDk-ogdfXrUmr459hlw29nf@k)>PLVXFkN~;SQiX0D!)^ksRO%GG%ZU z%)vgS6aZ&i+XryoDfq?fp!*+7?0&cOmp~VwYZ&-e9zwFt z;lG0AzlzI$g-b3%vfM4C!28p$D3E-wnjA#s-z&Re*kdLq2T*~!o^2(F=Ja>uz|iz8 zjkS)otd6xW8&F5VmJF^e4gV_v)mp!Fj~}a_%X4>1ps%=fxTB9acfi`d>t9L#R{eXn zg8<4#`}(ll!M+fu-_~y5?dv2{K8S%Vf&Bmrz8bxP z2fO}|grRQ~e&2q+9EHuEKO+bC%3k>`feB(ex*LX#a`N;0wHI9A=55Vui!qrY9N}Xh zfc>m~%zfJnm~aMW|8`#cg+2V30CREM1YmQ*ig~s1fdChvm6e7160^lm>CsK^wsiPm z};3;0o^aDu48 zhw&lhvuyqN&-=9h0v2@R`DOc>x1Qo7XzpCXL*Tw`of&4X`)OTPZwQva{!lk(j9ILXYAc z-x$awxqCuKrg|__3Y&D2=lJ}qDpvKTt0c!^G&+K|o3yHNHF=oZYJN9d+!#?k^7wxm zd*>ief^J*1t!dk~ZQDI<+qP|6)3$A6+P3j)+jh_E@7;S|oQQWK?v1F3s?6G{s`_K+ zuC>;taUiY1U@jw)nVEl^N^$-D6#+@dlGh>Io%!ca|K=sEXmmaR*uVSaCpCk%{glxO_;;dhFP#=zfUv+%-aonQ6!0De*}TYh5dYFZk~~%zIu#B@5L2Ahp~LnD0n%=u zrA>}pj$mby=K5gmm_hPQ+2O@DZ{+GoUw|L7&e&B%w>d4Y(X58m%EB8i3j$$k{ldP0 z5wagF%nXlTkIk>^#uMXTicH`<4o0o!@Ocp@r&J)#xAhN)2K*Z=#BmVh6|DZX0-7fF zZ*a;Y-;T*k;|*`$$bTtfSDh9RYrhcAZ$k3-6-O{f1x+HBta|1yT)(%zit|=gKDjz+ z&wr~$++-@RVm?cA#V_FhKpwfh9UEU=Rd=zxUg*>Zdqsz?ioSe~_nB);_>R$-l=feH zDm1)1*xu%Lr*X}synQ52`%jP|a&moFq3ppGU1$kRI0oY`LJ`*8W$Z0xO%l3FlrzQ< z?BP`wRviRL0S!2D`-mUL=u=l(Y$^pa1I*qv3!@(#>b>2L&JO!%lefTn3}PDbe*N4m zY*l(#k?zmT>agwl(hOg~((5^Iq?HTQ#&5Z7mV9XWJ;A_Rhnn4*R) zj9&DAVT>CZgQCg@0g|KqJ?5D`#P`p?Dui+2bfWDPv76#Qr%q&5t_756!> zm`DYr7?kfx|2{`Jf}p>vHX5?%SKYb$q@0kE(4u}f_*FK#i@2;{#`*T^L(=gwH8;P$tprRU%+6rJ9n>DJo;%gj|-n#t>a%eVx7MBxWlsyg|k_vgKN(UPt;$$eAH*^gI~!*2TDvULXA$jl5foJeCTOBGapV1cE=p}06#1>#OXHQEci4c;m7 zNc!0C?8vg=$uUknV;_iN$!r_$uIHL|_yWVe4KUc{AgeH(f+pIxOFTg-T^v0tKEUnE zQA1+C46SmS&z`V2Yr|~`jHKOzMrFo^cX(=+*2(&HloSL;MU_vY4CRJ>PUCTy-+UhJ z{OAXaT8kV8hfjKwue+wsITkDSV5W+wLDG*(3ItP@co)?ob$F`ft*W{O|x%FH3$Il+!*T}o;UeB1cbreh41{@~!i>xiO-aLPQ)W}%_vJ)jj zFJ7RNLx_%mfuAcz)_dz23Bm!nf0%KD(|$tpH3=hKb}>G(qO}I9(pm^B`bv=40^aT; z7x|-dNu2Bk@lPI6oWfCr7pS5b?LV8@$=&eS)S6_rmYlnBD1%<|`$@%6W&bH=-M?27 z1%Tv21~Ht@egtVVyElD=;w0FJi?ZH{+-F=sytci%<&+Y*R+84}*U$jHE?}jyBU#A@ z{w2ynaMRE{_gK(&t6>p-oxN?WNEJZ*9#i)O^~KV4zK7gTbgr%w`3&fqY)5OoOOv$5 zlIc@uJ~`JoG)s5y0!AFvh&lm1gfqdU{i|aL&q!9O>{kbMW{vf6NdfDRUXN+3AeQu8 zojFp~U^2Pl<+9_=@usML+Mc9@rt)`7mL1yQR;|yHnxRV|QK}PLlbuqWX=Q^%wn1$q zwZv-GOwJd$f?iJ7gOh3hqApbb*ROT`%xOzR`YcJ7 zwbmCS1|2CX3iC|wU|3}t+P%l#UrOJ_$N{gkX5`f6uNQsMB5vv-@z1lrqGT*Bu^GmQ zB({`mllqPw+$Hh8mv8nO>oAs-nw4>E3E$l;_rsc4N9+i;o}NCo9c$y0K98WImU<>& z&WU3g|N7o-Gov(7`9aOPifc3CpP%4Gy|mNXrz7e}8@wINuvMcl4fG#V1az3Mi;S;L zCKgLvwiLRWRMDd9SZ`(!F!7`2^UF-_!e?ClgRrmKn7b9M{){?5FitI200YQ0Fh6$2 z?=6lTzwR?e`TWh#9E?{oIDc?=*l`rBcEqr*XZy)m9-$#=_h;)t| zUby0C(TuzwMp$KtI~%Cx8N$f}e0`equM!rd@v~nwc`$HM@ZJo8$@r0t&=kQgPn3ow z;40;SY7wyzjZ6y&noxRPaU1v^P|X41<|W>3wc3$m$I)0x#21WTV@klMDal2HkMUn9 zm67%%O$LfVK4?w$k7f?eygojwz9w#7!VQ_zWt{l_wnjX zqOqDZL*t$B2i0ExvmRC%eC}bjySdIC0|$!17d!Lk3v_KJQ9j*=@}W1E&nsU*S&AX< zS&cG_$*^TjQ=~4Ntdofst!5nh-#mcY-u9!K15vOJv!J+RbCvJp>phUHDGZ<6CB{DP zBNUsDh+J20g0j?|{uT+n#4w$3NgGmqNqg;0&wZIGGdohSMf9@N_JQpywL%CphpBBE zcinqso4sTtohS=l^^r*95_LDLUhhEt`r%<|G*F{#=AIqg9BmsepmeQ?U1?AwgRB`_ z4EUTN&aXuavQ5dIq5V((>it0Kk$R=HU`SvfR}+kQU<7pXei^0b=Wv}I92+o;Jr-g5 zov0bna`uemt%ZRjY76qg$99iNWW%XwwfAGefRr2g2wa&`Am?ESnJ)%x4|9+EST;!v ziF`~4GPC5ktuJ;@rMgiAxnXSgi4Y1U4L!(}`4^JtH$T-Dp2~(2n^@uC!m4V@c;$Q^ zecjxXFSXRwi0$8BEksAPAf-1ey$d{Opmcp^8YZ4SZ!KZ*Qz`As7dVGgwHcc3vzt8e zbJ{{}ddVlkjv}Qsi0uNVmNa`@?p=~VP(Ie^4|G^FEkE11a=TmI^QqlmC7*myT+6FE zi644kpvOKZfGQ!b1BiH?Uv?Q9KbA z=h!nCI`K}2&n5rvL?OK;=BzOr7Z^6%c>j=^yj zg|n?3nqZ=<7NHJTxO6!H{MxRO5tEo~J=f*c5a)tGe_9P8e0A>@0&fVBp8ScC_LbEk z`Q{e76^HJsP{y*?Ww+8qzm0>yw649kIG<=j^M~y*kGZdTX$LJv)^1qw{T6jn8eaQc z9W6rqcS)=`%D)ayZg?4!R3{3oV6u3rQ*d()%#ERy{kOT{RNq&#th(%)ul4WzUoMoe zJ27qOd2$F)&9>)f@BQv~t37cXRO5kFovq8-vksdU0+>lKZS454*zh)S3 zRudjvIP%c>7p%Qy({hje373m0{nDS5r2yEQ4Ds9N%)Qu$r5hTLO$ftvH^?+>Fd?X2 z5DkVLk&P$EE4U5?kFdE%s(B^Nu5ufyj?w8?8Ioyzb^S<^{zV&7ytGipb!XQ>L1v?R z^DvHv-5u&Jr^6kM&p=&`T#(>$KO|`(C z%n6&30AGz?YnW5*Qe!c-Q02Zyf^*y-p^@MOd+pL`5)~p|b!NaE%FChCzm1zzE>&+x zxxz)@VC^N?+qT!%+Kan3$wpeNzE8zqP0{fcE8|bRA#t`Cuq9y$sO|w~B03Pt(AxLa zoBY$=t!FeC%M>L0iV$~{*S5pxfJa!>q1AD)MGN!Hvr9JIc(Y8vnNp~=3XkX0UU~vx zW;9c%V`apLd4(h1w^vYk`F^&p!);TFYD;aK3SWPeHFl~N>H-?d8u`6vO2*!N9Ng^r z7rkbMzCoCCKl%6m1NwqEbV3c!;2_@(4%Mxfw-oUM9!F_z!^&g;I@+2X1_@^57di0p zI~~KJ_Ez@}%RuGz9J2c)UzF}ivKW7!E4#TZEiq3oLgg%JNOyU9qLJ_nUH z?#z%MELLm5SToh{k|-%j1{ARf;z5HjI8EJIgoNO`8kc0&ZiLZw6p-e8P9(N`PXDS< zg-tJXuk>Y=`^DD_IG$V-Ko zIK;Hqi@ofOaD`D@cbo~lwV5&H$`4bdI+wbb9lubrQ`OezcPe2}{UHfVY&Y4-1@LVE$ggz;W%J0K!6-TNFsl4@+-6XT$ zVYMD`p4N@6jsvrIW?#2_07gF!rhIkDmxnYwHILJdBi`68R^5)GGHhsT(uc4_amznl zRHu70UH!5Zg44Sxv;7F@sp(A}QR(G>EKQjb(NM2uX|qpC%bS8^(p~Dw7aCcjr;O>g z@4dX)9f!i_nvrHPgF@1aIL1|{(fMoJ@5u(?ku3695@P6w|Y~x#^Obr>~1={{v!h9j);-DP#x#b9^E#OsU1N zMM5JAew2x{5DsFz+XV&X)5rV{PFPp+y>zcq_Si~V4W)Tk2Wb!OFwIxHm~j!_OI2S4 zjrS@fGUgiW&SW+tIendVLgJLOUcP;ZPfJ<{jXIN&Rp4qKNsoVd*9upSif zv`@S495;tGZ7kG_*D=QrtWC;Hn=DcFZH)GkElfSvO=&VzaqXJt=w&oow41s}N+pMJ zLS6Ulj8iEmqpD;yzP{xz$ifzAUr@Qce?m1u9Td5yBDAC=%v}9&GlsfP{C7Kkqqo3V z(9Sbug(v8Edlh+|(`;ADqx&l_hvm~(DeL=NOA*-ODiMN-lz=l*v~apSBKDX9i#U%Q=-zCRj=jP_AQVr?;XCKb{HZg^E->DemFyl- zzjIEw8Q#DgP+PLMm896*HR$pGlX~3__R|pIYbL3~O~KD*Ib?6ZTg~VkV_8?4Ggd`% zbJX$8*{lFTDyxI?ZRPbs5}1qN9x#78+XrC*m&nJ%lF#25kaE#mskVnk9?^7T;p7bOs~^{91AK}#YJ2+X$2o!%wmp|9$9cWogJY`=OFzm4 zda+?;Zk!jr!o%d)!%H<;tpTML0?7~=;S_y9jF@A9QDfLySK6eK#c}p9#A&O@;@29@ z{OoU94K}GN`@xHVRCntlASLk2p@$^M`{>ljt2TsIyHEzV>3)Zv)rx ztO(eBaPhGf@NOxef2BZq?h-y_0YkTFG4R~~db3!GjjSi*lA(GFuH9_0Z9%_+lC@`d z0X!c_TTQKhGcg0=yEu?67rju*B?+6js}}MFG~3sicpp>|P^wDS;#9*p5b=VkQ=9`e z4i3tgJbIGhtN>|9yom*S^0pKem-s@)K~-;H==AFLabr58{4*uZxyp4_VW-d>cq=^V z-=i!h2VF&IXr=Y`>_bi!&6%1O1{xbpNr&Py%726OnRzjm=mLghJCg!Z2JvI|)qWJD z+(pBvNXF~rM==&I7IfBCCmeh9lEAPD!XzoTTE%?Q*@s9yhxIUvf_~nOdEvzACD$TM z5)o$K`T=u=8L_YZ@1P1=-EMCWz;d|2=Ss7Ixz-V*U8=`TaMxucft~^kK4|`)NEuJNE#PQL*(JM?x8XK^ttyIChK z+?s#Cn{sQ9-3G#cvGEecXLAZIyokc7w3Ya3CSWPN`3lqB;O&O{?nkBGC(G;t4()_uiC}T)xKi(@7H9?_h5$7hkdY<+225I zo<@Uzt6=y=;0ak;sMSdBL_vXonnNfVHoZ3;HFS;f(IVn6OrxT|j(3rD>=k$aC4&as>xSx8}Pk^F6Y{5QR>PY=60H}M+T znF2;oUEfQwvi}u|=osX6Y>U7iB?A;jG!XLGBCnI>Jho{tUd@imgugdK>-pz_lWoEiw1)@cwS}cMHi;!Z zDC$+7y+uDgfZ0?Q6+tcKuCuE_8?GHe>18k-(@QP{HD$idNZeZvi z)0DgDf}~^PC!UOlCYhPWAWDHrkpJJ7&~DDvKv>6N&fBRdb*r_^g{K50W#Cxeu#b@T z`5Hi9Ev-mX1;qqikSLgACY459=}95%bECX?&bh83{`M%J#1RCMC@rD&N!YP$2%Gu{ zQhb$c(DNxky;MZ$$>qXOzcb70gB(D)y}S|{&~hg{$U?|FPf|#)*@Dm(;bt3Bc_m@IT7<8uWtE3>Tv+fFhR4$fo0?A8gEt{_Gi zm46%qZ4BnuJ8fCf1&V#J3s{>T(DMc5yK48?!$-2_itH(G(k)SxjD(2n`aL*Q<>;Dj zhq3tNcXhSNx?T-Bdn8!~rCAh0Syd02RetNJJ{{U*znyxQ9s1M+K<3#XXdnRiqejmD zO|R(2vIvzEW|C7o*o0@}2<6De(jENeY0OvCmM$BdL+ooQ#;dom?0$&GjE93}PcUu? z1RGm@jD(UhC)(uv*EbwzB05)!0T#@TSeD<4oB*K3Z!{k(?}iJFe_wl=^; z@dUqC-05NU`p18!Q9WX6y)XLhXXpeKWsEEah6*|-EFDC;;K#o-G z6`7=7h?wbeEmzfrB0)s&5?_V;%`;mbj?iNuXL}6e{e2r5TSRE7Ij0(dz6zZ{}N8_S;Qp7MWsf1#YtWntO=UEq?<&vjyIx?NPrZhw+_`;!`KkR*~2!Ur#H z2K#A^22*e!%`eXLRfa=M1CtpaBE7e8gK?m1dr0zm^1R=R$i>J&tK2gB?XGo+-7$d~Qs))6t5Va(z($Llqd? znc3Ee@*XDU48)-1aJ}B{C?rcXGAZ~!Bb!VRg#qH2>c3zWw&^s&R~tr8@!VL`^EO_q z`tevBhkDv4uS7ThF6U_iIG(Pcp$2ICZWr#FdMnqb`muJ-zcb0%B1!nEh&TW=#zm!W z;)X?a((}!$wwynz^wqZCcCuo?s&vDN4heeoTIm_RMd7idedY;@Cu$e#g6gsnr;%G$05mfurhtomZ;aWf7zPyXitm)0HN41eZ-t>pJ;a_O&$k==;&p+g* ziD;n=%NERgD6_w3-J?5xH4T<06|dp85&3w5F$M~$*}r~tPrZ|_ytk3?F5W3l$q6oe z{omvZtyEP;AgL8Mek-nM8+vL@dI-%KUvc3q(B+gbTicC=vgx&Uc?@mCzPVUjqK&!j zuYTZLlp51fT-HfuCVUWBXbc(=8<(Pff$-SjLyk5dWe0lD4c&ox)DDLET?Rj<1H6oL zsBTUYkC%bxz&H5M-rSp10VIE63pn9Uyq4NzRlQdsLnVCAEDJ_^12&5rU02x zvTU54Osdpy*HYsolx0EUeT;oYZ9>X^sT}iw&bg1}G-D3=a3`uWpi#heSDUQD@plz3 zUE{VYt{~Nx4-iEqgpED^HT-?hLdFob!+BE*HRzh-;o|N(k)eDKI#mbe5!+(hdw*4GpK%I;pNYsDGsL#R^95xJ4u;cpDP z$}z}i{&&aX5xPfSxAR#XsYDs&cYNVpa!zK>vDW&RSfcLe6H8(umT33^Hkp=8!tmir zRGj4KQ%)@59w6IET)Vl_Z=@`BNP}>xl|lV476g4{TY0Z}QM&p{c{_k+PJu&_Y*2^o zTM`h9&QbeU4L#g=_|iPrqga$Xk`B%0F6v6?9BfKVPqy`VP^aPO8*_u$jZdV{C}&p5vvT%nR2z-mST#i zNL`XEZDOg`HExZkY24VxI2jDhl7?kHrqr6!2rtqjoQADEruJ$s)hL>l;0sMBT(B>& zwE6Mux8v%&!?yY~vytdxX41m8i~pqQIJqUf%v z$-$%_Q^FNQSCa$TfxaILCJ;=?*I&jF_e!*+vtqyi008{XuA)fU-z%r5gY-x)mj^h`#{gHDvQM522J_W9~gPb|V z0WRAXyho^?M+m^ZeQ*QOf@2Ig1Zw;y{LbZM zK+N}=>j(Ph58>BF2n8lcic}7S??ReL*wjZy3N-lLsIm(* z_Vg9|b}7~G<&jbgt1p5D_kKzIs@O!&oz8l<&0ykCEwDm?uKpdjB&xCe>ND@^mK zCU<%9l*ztFOU1+mI}DVtzcYv^(}1JoHOw{&s+h3(C2Qo&98$_Z$Cnv&{yxh7LE`(9M=ZdpOQeP4P}|O7S6h32>boZtn)9cWDu{<|LoY;w?2PJf8R9lNQQB z2Xntzkxbk@E`3zUb8*Np;^>Gt>EoDqp3Yf-<1Z3ZLey+hhcTb_VX|%9*$fNu@(Udu z$W2Yn<(CcKdevi=5s%+g&O?R<;&#EyOZGfed`}|yl3ZX|J4w)Fz31^q^JtKUTKeW< ziKq6mxpLnwUF^-OJ!h*-^lqd&bDhy|pHMw{L>m~Vme3BjzQMkji5iISh(nn%urv8v zK&!jd6lz|=_t*&SU3|60dq@`qwuYzG$#i@3Y4vYviSDlp6~m845g)j46q7ZT755# zL^1A$)u2@LEd=>_9&I1o3Cjfj#gx}DO924>m_7zfSLXvUJ*x~5JKLNK9vRaHq%fLG zZ?BaUL&P4yW(~5N&c*=TL!A%fTfIJdu`dknm+|Eyd53#%mGCOMzQ!=Bp?0!jMt?yP z%E4cCmpZnFR5ciZWgy>;orBxEiQ$yyoJIBnWNv(pn$N?s56JOzj{40ahbDPmxCZ8@ zHvuaa5FhtH(vqnYknM6#JVCC^2k?-ymbqJPx(U4p!D94u-_yX!#huxB0r#GRb6My% z`f(cs{%wr<)Y$6(dJel1&8%VLiy_W7i{$|{KA=kA0AAJ(+j9rYp^`-!fBtf2P%|ZM zQ8IiHRDB6u7dUqlMv(`YRfoUVwNs%K^TOwO$L{YR6nCYt62^D4<`T9807u`G_ws5A z%vV5x5{NNY#?qh)DxLGk01iPpQe>JoL{g~uA!H{fvb?LhLi4dZl%A+c$n6K3&OK8| z`qppgllf18f5L=?|BELvcS&LV27OA_Se|uaDM}u)x5~>}f83#d7dO`c zU#V`a%f+SK`K0)ec9&aJ!-@Kxz>S0%`(;J2YRj(L@#q>Tj zBu|%9tq_yRJ9CSF4aX;=mQo(lP;nIS_CSV9I+=QcKMw0077@B}yD$BjNEDt!^~ZTm zq8!X6xN6N`_df6u?60&@HVBwr-WGG)w&X0)uB5r0voBJ49ox1P!odA`rYTIQ3Px-N0~J0!BC1FSFHxu}fJOpw*A@qCvfbjBCTEY@t8vUs ziB|=AEAooDKZYyt(F3`}SilJ!6ucf?zY3ZQ(zC@HAzF7tWb(+!O`&{S7HeTO9-LQ@((&h&i4Ru< zmeDO3{DgcIKMn5}9wZH0oDq!k<4&bv4Mv+% zCoh#qD`ssHtX=$vA%Kb;hPuk-Ga8$r9V#Q))8b$B%rB8}b@T{Oe)G}VHVGM&FG$}`OuXE5zH|J@Z8df;-Woh@cptxdA_nR}gLNRl8{-keYMI}JnOGgUQ(u-X zb0*a*lkUV?S99Mka}ug7B_40?Q#Y*bk}-(9Qcm?8t8O2(BaI3dYuZ+metphD;OD0_ z5^VIVr=Ltr#9=`FpuyH&;#B9iQS`xPL?f=V%&kISu+#zGzkd)xs}XnIpW~xpHc-sI z`TSo1>-Er&Rs|&E$4%FqFJGe9nX+y3scd`;8gtQC3x!HG+}8szk1XDom11WC+NQul zU>v0^s^8f~C;j}2F3fPUUF1Pkda@D?;hg^IG+DhfV=8p;+Bmv(bHA$ni8DfuTsu@} zUHzVk(4WH{Wrl8d#S^eDv%$E=UhLk2X0ZUl7~|`PUQSV zm@ys@zDaX^$irk_p15XQJD#B4GmnmR#ff#IqIBB;raFSJgGK0Br}4ka&G|_Gtly{? ziMQs+Y96EtKG(e;R-gEdv|;65#=JO0s&Z^uyQ#0!tr?2igL(FrJf#@6dO+|Vyav^%3;lNM za|o!8#aTk`T3U%3^|ek<0~goNjXJGPq*mg|jFa6^YGwZHXxHT^r1R>4??~cQXa&OZ zpS4Z&m)J)8gS}Kvw`MK}Gjtx}uN(52OO5vr5201X&(y=k)I_*K4}0YyBYcW4+0PP( z>i8cR9RA5}emEEP8yH#M+BZ4b3|3E*EpAz`T-@t2gNvIId~U!4!f-RTnMJvW$vq&(@omj8qM#aoe#o?ocuBsxGPvOVrndfq-kfmQ3j+ zGfuq!oC~m=3hvOVTG0F6W#-FD|7`nxZys)%J6x%(F)`v}VEEP*Zu&tgcGj@nYbqJS2JKBEGD9I+QzlS2el z9U-b^=tU#2_ zf)lgAmfM0fcjrRVl`lN@^*fUb@4lUKa@Z6SzN0n%y7hZoGu^S7tB>H_yepNY)B*pm z5B$@d0F29`6dW$%5hc`-ghiU03wx|2oAP0hf3n-ccCm@482W!kI4n~K#vf6ilO*SR z_fd>qvl4l0NLF=<7%WvZ`6C!So9Q7wW_DuX!a~e)_~5V{Vqj#G)7i&}i|BKCmAAf- zl&?#&x0a8;xbyTYf{pj}%w6?du41&qo_up{b&HrFsE{2=ozcXPRJ@lH6t8LlP6yS2 zW&)#C@~n_!M;ko56Mq7DNEV^{R5B(I%0}n`+q)dp-Gj@TLFGBx+`RyM({H83oh9FNI7*Bnl!6(M6m1 zh_pWCI%bUDg7h{qTd#UHNzoWIhVC(>8(jO&oHMc$a-IgX3Y&~c`C}@XX)-`!pRN_v zCzvaPFs;mM+&IuraYo2r{!pmQjS8gGnWh*Zt}=JGYq8};nfA3xv!lWa!K$ZcT=qdd zVPMQhX3b5rJE+vP&ka3dTg}}1jmVwUP8fS8d79|d>Bt8Z8`BIv zNTw#oA&%c|zVUAWz8p!(J7)baHkfWMOChuPD&ZFkJuF!JZmTZTn4jRKJ(HUE{8S5|3m` z1I%5{RW_+b(&4Mi-9Vs1c!m?6osQcvB7O;cV!wcL zf&ms${%~_a#5-X=g9t`)LqbF(VHtx8jDQel(Tc}JSR}Ydvsnq1utEyZAzo=AAkYD_ zBoHR--=thdv?-L2h$w^h_`sprj)6dwC-@@# z!DR}Fg!@4ul2BlEAkb^Opg^_%9!aZ{V+bJz5uXFa@gWK!iTC~zBlqjYW=kSKSIVU^ z4!7_n5$^>H6JsGKIbu2-dYds35}C!u`_$t@02>4aLkqreL4F5d=p*hTOg(`g^yvFv z?QP!3gx)%KQo^h9&+MBfn(;mOVNDyFdHA?Ec;DH1I6hF^84yRBaqYVe{}p-<`aWMo zd=ep$BpH$rBJ6#%YTE7{srWBRscC@B>Z#b zTebp3CL(C|?AMeP&byMy$P`!kZZ?vTIXJRhnK2*)GtI~9TVVWs5uXr+TddxG^;eYM z5sp`M{}Ff2fka)_0b^eIWS2k+4MVh8b#Pu-dn=~MdkNm*Ma*x5D^^`ok1ztqm^_D| z6OTaUYaEx}3sg!}?Hq^RX7QeqccLJ_I+>iD? z{yu-s4%&`BwI)?$)6FsSOrJ4eY0d-%y!$VRw`Os__E4YkHm5%FFW5ZLvvjhn%*U}k zuk4u<#aPFSSnRv=3u{#^&%R;>v9^}-M5sK(#pW;T|T(0X# z<`zcJ|0r_A&8p}P0ZnouI90f8^R`+%hz?rv+!CagxFSsW^1j~f?JXXKcS3$}NHtS_ zhk5-2?KN@LZ`AF*46oyEnnJuHn=WkVHM85jGQM7Z3s256w7h1_=|gVO!Kt+F3@F5h zurao%3G>1s>G3UMn{cf>R>(<3tR3Ww>H2i>;^Xyq*Y3`YMV=xCMs~YIkjWMXIJLZ{{kH>An(^F!0GM& zLnCXb;Rz5gpREWdY{i19Xp028e(-Wf?8V<~8RQv5akYSd9*wOIR$J**DY$R8ej>muTkdcanE^)d-t#4IK;Xp zK_jEkzZ18pSF&l2F|V+Hvo#nS!M^uUW9R?9n1Dik#ghVt136U9z-nQvGacgIE#OW~ z&!SIN-XuCb-Z(=}L(JfYkJf5d^#niC;p_kxo29WAI+eFvpA+Pmon#F?Em+R6wELYP z`6B(f0IwO5v0Tnrrv;^ZD3n6O7koRoJidL4y0KB@jndu%17b?caY6bjFDn(O__ ztJNo1{Eeg#HHzEIJ#ZbeUh?&DHhB9C+^nDNYLzZ`MeNd|ykCy+tnTmT@%(m;y`=AM z`O;JBMy~Udp98Pg?s>(JnHL*3*ZN8*+-XB)Mt3pPx}&e}`gm1VnaAGh#VYM1?#Raf zYC8`>4ps;S)Rpn~2rewymMb4iUcYzI#)1ZiVQ5YHE}PE6UCbv|yW5ijoCC16SgcH@ zUq$^_z>c1+PL{*i3}IN~@h*};a24H^21@$cl?X<9z5u9tlYj+?)o^EN69}pod~O`z zgF3SUS1Z7!q$?8t8&P2wyG@tdgr-SBtJnD;b%gKEQI+&gIM0ZYP_0wmc&_j04@Q-s z8jo>1p5oh8Fr>rs#(Zk;Cr4K;^HU6VAH!Ns_l6X=yIy5F$eYlpynT-{SWC|PNqMZ& z-n%E<-^}J(`juk-n!LW==Ut!H3!nX6R70E-ZV!lvaGn{eo7#KadH!&9T<3-h+~Zsk z?wJbA6O&P{siQpi+gY0Lb^7lNhuO0TAho+Gx4S8wTusQ?>irD6y>+`9#VQ_m$z+aT zleAos%RY*macxPIK_sVPm1r@Uspd8N$PV<$Gz|;KHRKOMv)pM(AN<*a!q|%5Z<)n_ zL6@yQs={iI=;G-oj(OH77Sqc+6S-nrqLN4?T%KI=V}sb*E!aHZxr<{p$y2RYTm=;? zQ@U<=FmuyiROMdO`5I{N2}vEK;S-=e??%tPbqH-U>`ousz(z%>^KsC&@Wyy38(cB& zvKB9E?apux32f5&>qDChe0!R~ zS=5ccz#pSygP8BB3nD=m5Us#M*g`THiLHcvi{Un6q2QZ+x(sw-XC`bl*aFzht&z%4 zn(0BRI`lDsHw%F&fspE=Nh1!?W3<|u>fs#OD$QEBzOhqiAdx@SY}nk{+f*tqduskY z7}8s5>a8WEC}{Cd{?ffypAZjcD}kZi7e z{eSr;8cL>SFbq<5CZ-;Q+KhxuTr9dU49b>XrvJHwVNfU3W+G%EWcsO8vbT5nsr*mY zFs1*rFth(D{l{bcPf3(eo0m(BjYCL;MMRW|OXjjFq48 z|7`Lzj;yJj`H$Pk#`wQ|BEtW(qzBnzmvf9E>gb&_VB1EN6o)-hN4;KXKPjUA8Z5DW zi0v=&by4z2%)G_aDJpi$xzOJ^#v(OEQ`po6fqXV&vz!}+hm0Mro37ap{#nn}DXsGi z%{|)e;0HT3)}#(~47v$>>h0+~8dEz>IVy9rnx}jy+uxO4M-!cy@r}v%=@Vg;T}4xU zYMK#^3=?7A)Hp?~J(I{9D8wEdyvI1dt=py_&WaRb!W0nDiZ`0@ehwd-dOmFVjb z-Flqoe!bj+@yp;Z2O#oYMBFfvtuiM00mVN-Se&2~+j?$iLe5)TlAS;pd&o<>%sPQp zj0mf{otvAGTDxJJ>E_ZL+kOgE+fFyWMJ}7Z_uy0+=F@z4|Js}K7q;`d)hD*}ebpv9 z{9lVx-1W0ntsMTbl&b*ow+~IBB+F+u_j>!DqG5uSrv6b|@OT_Y@LqW&(JOkK{{{}w iHK6_ff8Ne6hE6UXKRXSWpMR`OOq?)eWMT^9F#iwU2n+oH literal 0 HcmV?d00001 diff --git a/tools/examples/shortcuts_settings.tex b/tools/examples/shortcuts_settings.tex new file mode 100644 index 0000000..72df6e8 --- /dev/null +++ b/tools/examples/shortcuts_settings.tex @@ -0,0 +1,260 @@ +\documentclass[a4paper,10pt]{article} +\usepackage{myXsim} +\usepackage{qrcode} + +\title{TITRE} +\tribe{TRIBU} +\date{DATE} + +\begin{document} + +\maketitle + +\section{Raccourcis}% + +\begin{itemize} + \item \verb+\ds+ $\ds \frac{1}{2}$ + + \item \verb+\N+ $\N$ + \item \verb+\Z+ $\Z$ + \item \verb+\Q+ $\Q$ + \item \verb+\R+ $\R$ + \item \verb+\C+ $\C$ + + \item \verb+\intOO+ $\intOO{\#1}{\#2}$ + \item \verb+\intFO+ $\intOO{\#1}{\#2}$ + \item \verb+\intOF+ $\intOO{\#1}{\#2}$ + \item \verb+\intFF+ $\intOO{\#1}{\#2}$ + + \item \verb+\vect+ $\vect{\#1}$ + \item \verb+\norme+ $\norme{\#1}$ + \item \verb+\scal+ $\scal{\#1}{\#2}$ + \item \verb+\vectCoord+ $\vectCoord{\#1}{\#2}$ + + \item \verb+\e+ $\e$ + % \item \verb+\i+ $\i$ + + \item \verb+\coefBino+ $\coefBino{\#1}{\#2}$ + + \item \verb+\equiv+ $\equiv$ + + \item \verb+\calc+ $\calc{\#1}$ +\end{itemize} + +\section{Compétences} +\begin{itemize} + + \item \verb+\Cher+ \Cher + \item \verb+\Mod+ \Mod + \item \verb+\Rep+ \Rep + \item \verb+\Rai+ \Rai + \item \verb+\Cal+ \Cal + \item \verb+\Com+ \Com + \item \verb+\Con+ \Con + + \item \verb+\RepLevel+ \RepLevel{.}\RepLevel{0}\RepLevel{1}\RepLevel{2}\RepLevel{3} + + \item \verb+\SignalBar+ \SignalBar{2} + \item \verb+\Assesment+ \Assesment{3} + \item \verb+\competencesStatement+ \competencesStatement +\end{itemize} + +\section{tikzpicture} +\begin{verbatim} + \begin{tikzpicture}[scale=1] + ... + \end{tikzpicture} +\end{verbatim} +\begin{itemize} + \item \verb+\cercleTrigo+ + \begin{tikzpicture}[scale=1] + \cercleTrigo + \end{tikzpicture} + \item \verb+\cercleTrigoNoOIJ+ + \begin{tikzpicture}[scale=1] + \cercleTrigoNoOIJ + \end{tikzpicture} + \item \verb+\repere+ + \begin{tikzpicture}[scale=1] + \repere{-2}{2}{-2}{2} + \end{tikzpicture} + \item \verb+\repereNoGrid+ + \begin{tikzpicture}[scale=1] + \repereNoGrid{-2}{2}{-2}{2} + \end{tikzpicture} + \item \verb+\boxplot+ + \begin{tikzpicture}[scale=1] + \boxplot{2}{0}{1}{2}{3}{4}{5} + \end{tikzpicture} + \item \verb+\boxplotNoNames+ + \begin{tikzpicture}[scale=1] + \boxplotNoNames{2}{0}{1}{2}{3}{4}{5} + \end{tikzpicture} +\end{itemize} + +\section{Mise en avant} +\begin{itemize} + \item \verb+\afaire+ + \afaire{\#1} + \item \verb+\envideo+ + \envideo{\#linktaget}{\#linkname} + \item \verb+\enclasse+ + \enclasse{\#1} + \item \verb+\arediger+ + \arediger{\#1} +\end{itemize} + +\section{Algo} + +\begin{multicols}{2} + \begin{verbatim} +\begin{algorithm}[H] + \SetAlgoLined + \Entree{n} + \Deb{ + $u \leftarrow 3$ \; + \Pour{$i$ de 1 à 3}{ + $u \leftarrow u+2$ \; + } + } + \Sortie{u} +\end{algorithm} + \end{verbatim} + + \columnbreak + + \begin{algorithm}[H] + \SetAlgoLined + \Entree{n} + \Deb{ + $u \leftarrow 3$ \; + \Pour{$i$ de 1 à 3}{ + $u \leftarrow u+2$ \; + } + } + \Sortie{u} + \end{algorithm} +\end{multicols} + +\section{Programmation} +\begin{multicols}{2} + \begin{verbatim} + \begin{lstlisting}[language=Python, basicstyle=\small, frame=] + x = ("Nombre de tirage?") + if x < 200: + print("Le tarif est ", x*0.11) + else: + print("Le tarif est ", x*0.8) + \end{lstlisting} + \end{verbatim} + + \columnbreak + \begin{lstlisting}[language=Python, basicstyle=\small, frame=] + x = ("Nombre de tirage?") + if x < 200: + print("Le tarif est ", x*0.11) + else: + print("Le tarif est ", x*0.8) + \end{lstlisting} +\end{multicols} + +\section{QRcode} + +\verb+\usepackage{qrcode}+ + +\qrcode{phrase à coder} + +\section{Graphique et tableaux} + +\subsection{Grahique} + +\begin{multicols}{2} + \begin{verbatim} +\begin{tikzpicture}[baseline=(current bounding box.south), + xscale=1, yscale=0.5] + \tkzInit[xmin=-5,xmax=5,xstep=1, + ymin=-5,ymax=5,ystep=1] + \tkzGrid + \tkzAxeXY + \tkzFct[domain=-5:5,color=red,very thick]% + { 0.4*x*x - 3 }; +\end{tikzpicture} + + \end{verbatim} + \columnbreak + \begin{tikzpicture}[baseline=(current bounding box.south), + xscale=1, yscale=0.5] + \tkzInit[xmin=-5,xmax=5,xstep=1, + ymin=-5,ymax=5,ystep=1] + \tkzGrid + \tkzAxeXY + \tkzFct[domain=-5:5,color=red,very thick]% + { 0.4*x*x - 3 }; + \end{tikzpicture} + +\end{multicols} + +Quand on change la valeur de \verb+xstep+, il faut replacer \verb+x+ par \verb+\x+. + +\begin{multicols}{2} + \begin{verbatim} +\begin{tikzpicture}[baseline=(current bounding box.south), + xscale=0.5, yscale=0.4] + \tkzInit[xmin=-5,xmax=5,xstep=0.5, + ymin=-5,ymax=5,ystep=1] + \tkzGrid + \tkzAxeXY + \tkzFct[domain=-5:5,color=red,very thick]% + { 0.4*\x*\x - 3 }; +\end{tikzpicture} + \end{verbatim} + \columnbreak + \begin{tikzpicture}[baseline=(current bounding box.south), + xscale=0.5, yscale=0.4] + \tkzInit[xmin=-5,xmax=5,xstep=0.5, + ymin=-5,ymax=5,ystep=1] + \tkzGrid + \tkzAxeXY + \tkzFct[domain=-5:5,color=red,very thick]% + { 0.4*\x*\x - 3 }; + \end{tikzpicture} +\end{multicols} + +\subsection{Tableau de signes et variations} + +\begin{multicols}{2} + \begin{verbatim} +\begin{tikzpicture}[baseline=(current bounding box.south)] + \tkzTabInit[lgt=2,espcl=2] + {$ x $/1,$ f(x) $/2}{-1, 2, 3, 5} + \tkzTabLine{, +, z, +, z, -, d, + , } +\end{tikzpicture} + \end{verbatim} + \columnbreak + \begin{tikzpicture}[baseline=(current bounding box.south)] + \tkzTabInit[lgt=2,espcl=2] + {$ x $/1,$ f(x) $/2}{-1, 2, 3, 5} + \tkzTabLine{, +, z, +, z, -, d, + , } + \end{tikzpicture} +\end{multicols} + +\begin{multicols}{2} + \begin{verbatim} +\begin{tikzpicture}[baseline=(current bounding box.south)] + \tkzTabInit[lgt=2,espcl=2] + {$ x $/1, $ f(x) $/2}{-2, 0, 1 } + \tkzTabVar{ +/3, -/1, +/5} +\end{tikzpicture} + \end{verbatim} + \columnbreak + \begin{tikzpicture}[baseline=(current bounding box.south)] + \tkzTabInit[lgt=2,espcl=2] + {$ x $/1, $ f(x) $/2}{-2, 0, 1 } + \tkzTabVar{ +/3, -/1, +/5} + \end{tikzpicture} +\end{multicols} + + + +\end{document} + diff --git a/tools/examples/tikzpicture.pdf b/tools/examples/tikzpicture.pdf new file mode 100644 index 0000000000000000000000000000000000000000..488ca19c4bc3c1a1083922d5207284c1e906a7f2 GIT binary patch literal 45053 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 PWoP9=prjO&7f1LHTdVIZ literal 0 HcmV?d00001 diff --git a/tools/examples/tikzpicture.tex b/tools/examples/tikzpicture.tex new file mode 100644 index 0000000..551246f --- /dev/null +++ b/tools/examples/tikzpicture.tex @@ -0,0 +1,63 @@ +\documentclass[a4paper,10pt]{article} +\RequirePackage[utf8x]{inputenc} +\RequirePackage[french]{babel} +\RequirePackage[T1]{fontenc} +\usepackage{tikz} +\usepackage{pgfplots} +\pgfplotsset{compat = newest} +\usepgfplotslibrary{external} + + +\RequirePackage{tkz-tab} +\RequirePackage{tkz-fct} + + +\title{Snippets pour tikzpicture} +\date{} +\author{Benjamin Bertrand} + +\begin{document} + +\section{La base} + +\begin{tikzpicture} + % par défaut les unités sont en cm + % un segment + \draw (0, 0) -- (1, 0); + % Coordonnées relatives + \draw (0, 0) -- ++(0, 1); + % Coordonnées polaire (angle: rayon) + \draw (0, 0) -- (45: 1); + % une figure pleine + \fill (2, 2) -- (1, 1) -- (2, 3) -- cycle; + % Un cercle (centre et rayon) + \draw (4, 1) circle (1); + % rectangle + \draw (5, 0) rectangle (6, 6); +\end{tikzpicture} + +\section{Graphiques de fonctions} + + +\begin{tikzpicture} + \begin{axis}[ + axis lines = center, + %grid = both, + xlabel = {$x$}, + xtick distance=1, + ylabel = {$y$}, + ytick distance=1, + legend pos = north west, + legend entries={$f(x)$, $g(x)$} + ] + \addplot[domain=-6:7,samples=40, color=red, very thick]{-0.1*(x+5)*(x-1)*(x-6)}; + \end{axis} +\end{tikzpicture} + + +\begin{tikzpicture} + \begin{axis}[axis x line=bottom,axis y line = left] + \addplot[ybar,fill=blue,draw=blue,bar width=1cm] coordinates { (1,194) (2,213) (3,251)(4,233) (5,194)}; \end{axis} +\end{tikzpicture} + +\end{document} diff --git a/tools/git/hooks/pre-commit b/tools/git/hooks/pre-commit new file mode 100755 index 0000000..6b6c23e --- /dev/null +++ b/tools/git/hooks/pre-commit @@ -0,0 +1,146 @@ +#! /usr/bin/env python +# -*- coding: utf-8 -*- +# vim:fenc=utf-8 +# +# Copyright © 2017 lafrite +# +# Distributed under terms of the MIT license. + +""" +Git hook to ensure validity of all rst files +""" + +from git import Repo +from pathlib import Path +import re +import time +import restructuredtext_lint +import sys + +import logging + +formatter = logging.Formatter('%(name)s :: %(levelname)s :: %(message)s') +steam_handler = logging.StreamHandler() +#steam_handler = logging.FileHandler('logging.conf') +steam_handler.setLevel(logging.DEBUG) +steam_handler.setFormatter(formatter) + +# création de l'objet logger qui va nous servir à écrire dans les logs +logger = logging.getLogger("precommit") +# on met le niveau du logger à DEBUG, comme ça il écrit tout +logger.setLevel(logging.WARNING) +logger.addHandler(steam_handler) + +# Files selection + +def get_commited_files(repo): + hdiff = repo.head.commit.diff() + diff = {"A":[], "M":[]} + for f in hdiff.iter_change_type("A"): + diff["A"].append(f.b_path) + for f in hdiff.iter_change_type("M"): + diff["M"].append(f.b_path) + + return diff + +def select_by_extension(files, ext="rst"): + return [i for i in files if i.split(".")[-1] == ext and 'skeleton' not in i] + +# Rst linter + +def rst_lint(filename): + with open(filename, 'r') as f: + errors = restructuredtext_lint.lint(f.read()) + for e in errors: + logger.warning(f"{filename} \n{e.full_message}\n") + return errors + + +# Rst parameters normalize + +def normalize_file(filename, normalizers = {}): + logger.debug(f"Normalizing {filename}") + logger.debug(f"With {normalizers}") + new_file = "" + modified_lines = [] + with open(filename, 'r') as f: + for l in f.readlines(): + new_line = run_normalizers(l, normalizers) + if new_line != l: + modified_lines.append(f"{l}") + logger.warning(f"{filename}\n\t{l}\t{new_line}") + new_file += new_line + + with open(filename, "w") as f: + f.write(new_file) + logger.debug(f"{filename} written") + + return modified_lines + +def run_normalizers(line, normalizers): + for c in normalizers: + obs = re.search(c, line) + if obs: + logger.debug(f"Find for {c}") + return normalizers[c](line) + return line + +# Rst function tools + +def update_date(line): + date = time.strftime("%Y-%m-%d") + logger.debug(f"Update Date to: {date}") + return f":date: {date}\n" + +def update_modified(line): + modified = time.strftime("%Y-%m-%d") + logger.debug(f"Update modified to: {modified}") + return f":modified: {modified}\n" + +def normalize_tags(line): + logger.debug(f"Normaizing tags") + tags = line.split(":")[-1] + tags = [i.strip().capitalize() for i in tags.split(",")] + tags_str = ", ".join(tags) + logger.debug(f"Update tags to: {tags_str}") + return f":tags: {tags_str}\n" + +NORMALIZERS_MODIFIED = { + ":modified:.*": update_modified, + ":tags:.*": normalize_tags, + } + +NORMALIZERS_NEW = { + ":date:.*": update_date, + ":modified:.*": update_modified, + ":tags:.*": normalize_tags, + } + +if __name__ == "__main__": + r = Repo() + diff = get_commited_files(r) + + errors = [] + modified = [] + + # New files + for f in select_by_extension(diff["A"], "rst"): + errors += rst_lint(f) + modified += normalize_file(f, NORMALIZERS_NEW) + r.index.add([f]) + # Modified files + for f in select_by_extension(diff["M"], "rst"): + errors += rst_lint(f) + modified += normalize_file(f, NORMALIZERS_MODIFIED) + r.index.add([f]) + + if len(errors) > 0: + logger.warning("Errors in rst formating, commit aborted") + sys.exit(1) + + + +# ----------------------------- +# Reglages pour 'vim' +# vim:set autoindent expandtab tabstop=4 shiftwidth=4: +# cursor: 16 del diff --git a/tools/scripts/new_eval.sh b/tools/scripts/new_eval.sh new file mode 100644 index 0000000..1f8402f --- /dev/null +++ b/tools/scripts/new_eval.sh @@ -0,0 +1,66 @@ +#!/bin/bash + + +display_result() { + dialog --title "$1" \ + --no-collapse \ + --msgbox "$result" 0 0 +} + +exec 3>&1 +selection=$(dialog \ + --backtitle "Création d'une nouvelle évaluation: Classe" \ + --title "Menu" \ + --clear \ + --cancel-label "Exit" \ + --menu "Choisir un niveau:" 0 0 4 \ + "1" "2nd" \ + "2" "Enseignements Scientifique" \ + "3" "4e" \ + "4" "Technologique" \ + 2>&1 1>&3) +exec 3>&- +case $selection in + 1 ) + tribe="2nd" + ;; + 2 ) + tribe="EnseignementsScientifique" + ;; + 3 ) + tribe="4e" + ;; + 4 ) + tribe="Technologique" + ;; +esac + +exec 3>&1 +date=$(dialog --calendar "Date" 0 0 2>&1 1>&3 | awk -F "/" '{print $3"-"$2"-"$1}') +exec 3>&- + +exec 3>&1 +name=$(dialog \ + --inputbox "Nom de l'évaluation" \ + 0 0 \ + 2>&1 1>&3) +exec 3>&- + +exec 3>&1 +duration=$(dialog \ + --inputbox "Temps pour le travailler" \ + 0 0 \ + 2>&1 1>&3) +exec 3>&- + +mkdir -p $tribe/Evaluations/ +sequence_path=$tribe/Evaluations/DS_${date}/ +mkdir -p $sequence_path + +export name=$name +export date=$date +export tribe=$tribe +export duration=$duration +envsubst < ./tools/skeleton/eval/exercises.tex > $sequence_path/exercises.tex +envsubst < ./tools/skeleton/eval/sujet.tex > $sequence_path/sujet.tex + diff --git a/tools/scripts/new_sequence.sh b/tools/scripts/new_sequence.sh new file mode 100644 index 0000000..6d3239f --- /dev/null +++ b/tools/scripts/new_sequence.sh @@ -0,0 +1,112 @@ +#!/bin/bash + + +display_result() { + dialog --title "$1" \ + --no-collapse \ + --msgbox "$result" 0 0 +} + +exec 3>&1 +date=$(dialog --calendar "Date" 0 0 2>&1 1>&3 | awk -F "/" '{print $3"-"$2"-"$1}') +exec 3>&- + +exec 3>&1 +selection=$(dialog \ + --backtitle "Création d'une nouvelle séquence: Classe" \ + --title "Menu" \ + --clear \ + --cancel-label "Exit" \ + --menu "Choisir un niveau:" 0 0 4 \ + "1" "2nd" \ + "2" "Enseignements Scientifique" \ + "3" "4e" \ + "4" "Technologique" \ + 2>&1 1>&3) +exec 3>&- +case $selection in + 1 ) + tribe="2nd" + ;; + 2 ) + tribe="EnseignementsScientifique" + ;; + 3 ) + tribe="4e" + ;; + 4 ) + tribe="Technologique" + ;; +esac + +exec 3>&1 +cd $tribe +existing_seq=$(ls -d */) +nbr_seq=$(echo $existing_seq | wc -w) +next_seq_number=$(expr $nbr_seq) + +title=$(dialog \ + --inputbox "Séquences trouvée\n${existing_seq/ /\n} \nNom de la nouvelle sequence (n°$next_seq_number)" \ + 0 0 \ + 2>&1 1>&3) +exec 3>&- +cd .. + + +exec 3>&1 +summary=$(dialog \ + --inputbox "Résumé de la séquence" \ + 0 0 \ + 2>&1 1>&3) +exec 3>&- + +## ajouter les tags +exec 3>&1 +tags=$(dialog \ + --inputbox "Liste des tags séparés par une virgule" \ + 0 0 \ + 2>&1 1>&3) +exec 3>&- + +## Plan de travail ou classique +exec 3>&1 +selection=$(dialog \ + --backtitle "Création d'une nouvelle séquence: Type" \ + --title "Menu" \ + --clear \ + --cancel-label "Exit" \ + --menu "Type de séquence:" 0 0 4 \ + "1" "Classique" \ + "2" "Plan de travail" \ + 2>&1 1>&3) +exec 3>&- +case $selection in + 1 ) + sequence_type="classique" + ;; + 2 ) + sequence_type="plan_de_travail" + ;; +esac + + +sequence_path=$tribe/$(printf "%02d" $next_seq_number)_${title// /_}/ +mkdir -p $sequence_path + +export title=$title +export title_under=${title//?/#} +export author='Benjamin Bertrand' +export date=`date --date="$date 00:00" "+%B %Y"` +export tribe=$tribe +export tags=$tags +export summary=$summary +SKELETONPATH=./tools/skeleton/sequence +for i in `ls $SKELETONPATH/common/` +do + envsubst < $SKELETONPATH/common/$i > $sequence_path/$i +done +for i in `ls $SKELETONPATH/$sequence_type` +do + envsubst < $SKELETONPATH/$sequence_type/$i > $sequence_path/$i +done + diff --git a/tools/skeleton/eval/exercises.tex b/tools/skeleton/eval/exercises.tex new file mode 100644 index 0000000..ce8f3c6 --- /dev/null +++ b/tools/skeleton/eval/exercises.tex @@ -0,0 +1,7 @@ +\begin{exercise}[subtitle={<++>}, step={1}, origin={<++>}, topics={ ${title} }, tags={ ${tags} }] + <++> +\end{exercise} + +\begin{solution} + <++> +\end{solution} diff --git a/tools/skeleton/eval/sujet.tex b/tools/skeleton/eval/sujet.tex new file mode 100644 index 0000000..f01b210 --- /dev/null +++ b/tools/skeleton/eval/sujet.tex @@ -0,0 +1,27 @@ +\documentclass[a4paper,12pt]{article} +\usepackage{myXsim} + +% Title Page +\title{ ${name} \hfill ${subname}} +\tribe{${tribe}} +\date{${date}} +\duree{${duration}} + +\DeclareExerciseCollection[step=1]{banque} +\xsimsetup{collect} + + +\begin{document} +\maketitle + +Le barème est donné à titre indicatif, il pourra être modifié. + +\input{exercises.tex} +\printcollection{banque} +\end{document} + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "master" +%%% End: + diff --git a/tools/skeleton/sequence/classique/1B.tex b/tools/skeleton/sequence/classique/1B.tex new file mode 100755 index 0000000..2c8fa8c --- /dev/null +++ b/tools/skeleton/sequence/classique/1B.tex @@ -0,0 +1,14 @@ +\documentclass[a4paper,10pt]{article} +\usepackage{myXsim} + +\author{${author}} +\title{${title} - Cours} +\date{${date}} + +\pagestyle{empty} + +\begin{document} + +\maketitle + +\end{document} diff --git a/tools/skeleton/sequence/classique/1E.tex b/tools/skeleton/sequence/classique/1E.tex new file mode 100755 index 0000000..46562ce --- /dev/null +++ b/tools/skeleton/sequence/classique/1E.tex @@ -0,0 +1,17 @@ +\documentclass[a4paper,10pt]{article} +\usepackage{myXsim} + +\author{${author}} +\title{${title} - Exercices} +\date{${date}} + +\DeclareExerciseCollection[step=1]{banque} +\xsimsetup{collect} + + +\begin{document} +\input{exercises.tex} + +\printcollection{banque} + +\end{document} diff --git a/tools/skeleton/sequence/common/exercises.tex b/tools/skeleton/sequence/common/exercises.tex new file mode 100644 index 0000000..ce8f3c6 --- /dev/null +++ b/tools/skeleton/sequence/common/exercises.tex @@ -0,0 +1,7 @@ +\begin{exercise}[subtitle={<++>}, step={1}, origin={<++>}, topics={ ${title} }, tags={ ${tags} }] + <++> +\end{exercise} + +\begin{solution} + <++> +\end{solution} diff --git a/tools/skeleton/sequence/common/index.rst b/tools/skeleton/sequence/common/index.rst new file mode 100644 index 0000000..7226b60 --- /dev/null +++ b/tools/skeleton/sequence/common/index.rst @@ -0,0 +1,12 @@ +${title} +${title_under} + +:date: ${date} +:modified: ${date} +:authors: ${author} +:tags: ${tags} +:category: ${tribe} +:summary: ${summary} + +Étape 1: +======== diff --git a/tools/skeleton/sequence/plan_de_travail/plan_de_travail.tex b/tools/skeleton/sequence/plan_de_travail/plan_de_travail.tex new file mode 100644 index 0000000..dfd6250 --- /dev/null +++ b/tools/skeleton/sequence/plan_de_travail/plan_de_travail.tex @@ -0,0 +1,44 @@ +\documentclass[a4paper,12pt]{article} +\usepackage{myXsim} + +\author{${author}} +\title{${title} - Plan de travail} +\tribe{${tribe}} +\date{${date}} + +\pagestyle{empty} + +\DeclareExerciseCollection{banque} +\xsimsetup{ +} + + +\begin{document} +\maketitle + +% Résumé + +\bigskip + +Savoir-faire de la séquence +\begin{itemize} + \item +\end{itemize} + +\bigskip + +Ordre des étapes à respecter + + +\section{} + +\listsectionexercises + + +\pagebreak + +\input{exercises.tex} +\printcollection{banque} + + +\end{document} diff --git a/tools/skeleton/sequence/plan_de_travail/solutions.tex b/tools/skeleton/sequence/plan_de_travail/solutions.tex new file mode 100644 index 0000000..a02d6b1 --- /dev/null +++ b/tools/skeleton/sequence/plan_de_travail/solutions.tex @@ -0,0 +1,28 @@ +\documentclass[a4paper,10pt]{article} +\usepackage{myXsim} + +\usetikzlibrary{shapes.geometric} + +\author{${author}} +\title{${title} - Solutions} +\tribe{${tribe}} +\date{${date}} + +\DeclareExerciseCollection{banque} +\xsimsetup{ + exercise/print=false, + solution/print=true, +} + +\pagestyle{empty} + + +\begin{document} + +\maketitle + +\input{exercises.tex} +%\printcollection{banque} +%\printsolutions{exercises} + +\end{document} diff --git a/tools/style/base.sty b/tools/style/base.sty new file mode 100755 index 0000000..f5640e8 --- /dev/null +++ b/tools/style/base.sty @@ -0,0 +1,89 @@ +\NeedsTeXFormat{LaTeX2e} + +% extensions +%\RequirePackage[utf8x]{inputenc} +\RequirePackage[french]{babel} +%\usepackage[babel=true,kerning=true]{microtype} +%\RequirePackage{amssymb} +%\RequirePackage{amsmath} +%\RequirePackage{amsfonts} +\PassOptionsToPackage{table,usenames,dvipsnames}{xcolor} +\RequirePackage{hyperref} +%\RequirePackage{subfig} +\RequirePackage{fancybox} +\RequirePackage{graphicx} +\graphicspath{{./}{\string~/.Clipart/}} + +\RequirePackage{textcomp} +\RequirePackage{gensymb} +\RequirePackage{ifthen, calc} +\RequirePackage{tabularx} +\RequirePackage{tasks} + +% Géométrie +\RequirePackage{geometry} +\geometry{left=10mm, + right=10mm, + top=5mm, + bottom=5mm, + includeheadfoot, + headsep=0pt, + footskip=1em, +} + +\setlength{\columnsep}{30pt} % default=10pt +\setlength{\columnseprule}{1pt} % default=0pt (no line) + +% Symbole euro +\RequirePackage{eurosym} + +% Espaces pour écrire les grands nombres +\RequirePackage[np]{numprint} + +% Outils pour les tableaux et les fonctions +\RequirePackage{tkz-tab} +\RequirePackage{tkz-fct} + +% Pour les block scratch +\RequirePackage{scratch3} + +% Plusieurs colonnes +\RequirePackage{multicol} + +% inteligent import (see https://codeyarns.com/2010/05/27/latex-import-subimport-for-document-organization/) +\RequirePackage{import} + +% Lecture des fichiers csv et affichage des csv en table +\RequirePackage{csvsimple} + +% Mes racourcis +\RequirePackage{shortcuts} + +%Polices +\RequirePackage{kpfonts-otf} +\RequirePackage{fontspec} +\setmainfont{KpSans} +\setsansfont{KpSans} +\setmonofont{KpMono} + +% \RequirePackage[nomath]{kpfonts} +% \renewcommand*\familydefault{\sfdefault} +% \RequirePackage[T1]{fontenc} + + +% Les tableaux +\renewcommand{\arraystretch}{1.5} +\newcolumntype{C}[1]{>{\centering\arraybackslash }b{#1}} + +% Figure qui se fondent dans le texte +\RequirePackage{wrapfig} + +% Code formating with listing +\RequirePackage{code} + +% Write algorithm +\usepackage[linesnumbered, boxed, french]{algorithm2e} + +\RequirePackage{enumitem} +\setlist[itemize,1]{label=$\bullet$} + diff --git a/tools/style/classPres.cls b/tools/style/classPres.cls new file mode 100755 index 0000000..e41f7b0 --- /dev/null +++ b/tools/style/classPres.cls @@ -0,0 +1,22 @@ +\NeedsTeXFormat{LaTeX2e} + +\ProvidesClass{classPres} + +% Classe de base - Beamer +%\pdfminorversion=4 +\LoadClassWithOptions{beamer} + +\usetheme{Singapore} +%\usepackage[defaultsans]{droidsans} +%\usepackage[T1]{fontenc} +%\usefonttheme[onlymath]{serif} + +% extensions + +\RequirePackage{colorscheme} +\RequirePackage{base} +\geometry{left=10mm,right=10mm, top=0mm} + + +% Les tableaux +\renewcommand{\arraystretch}{1.5} diff --git a/tools/style/code.sty b/tools/style/code.sty new file mode 100755 index 0000000..503bbc9 --- /dev/null +++ b/tools/style/code.sty @@ -0,0 +1,47 @@ +\NeedsTeXFormat{LaTeX2e} + +\RequirePackage{listings} + +\lstset{literate= + {á}{{\'a}}1 {é}{{\'e}}1 {í}{{\'i}}1 {ó}{{\'o}}1 {ú}{{\'u}}1 + {Á}{{\'A}}1 {É}{{\'E}}1 {Í}{{\'I}}1 {Ó}{{\'O}}1 {Ú}{{\'U}}1 + {à}{{\`a}}1 {è}{{\`e}}1 {ì}{{\`i}}1 {ò}{{\`o}}1 {ù}{{\`u}}1 + {À}{{\`A}}1 {È}{{\'E}}1 {Ì}{{\`I}}1 {Ò}{{\`O}}1 {Ù}{{\`U}}1 + {ä}{{\"a}}1 {ë}{{\"e}}1 {ï}{{\"i}}1 {ö}{{\"o}}1 {ü}{{\"u}}1 + {Ä}{{\"A}}1 {Ë}{{\"E}}1 {Ï}{{\"I}}1 {Ö}{{\"O}}1 {Ü}{{\"U}}1 + {â}{{\^a}}1 {ê}{{\^e}}1 {î}{{\^i}}1 {ô}{{\^o}}1 {û}{{\^u}}1 + {Â}{{\^A}}1 {Ê}{{\^E}}1 {Î}{{\^I}}1 {Ô}{{\^O}}1 {Û}{{\^U}}1 + {Ã}{{\~A}}1 {ã}{{\~a}}1 {Õ}{{\~O}}1 {õ}{{\~o}}1 + {œ}{{\oe}}1 {Œ}{{\OE}}1 {æ}{{\ae}}1 {Æ}{{\AE}}1 {ß}{{\ss}}1 + {ű}{{\H{u}}}1 {Ű}{{\H{U}}}1 {ő}{{\H{o}}}1 {Ő}{{\H{O}}}1 + {ç}{{\c c}}1 {Ç}{{\c C}}1 {ø}{{\o}}1 {å}{{\r a}}1 {Å}{{\r A}}1 + {€}{{\euro}}1 {£}{{\pounds}}1 {«}{{\guillemotleft}}1 + {»}{{\guillemotright}}1 {ñ}{{\~n}}1 {Ñ}{{\~N}}1 {¿}{{?`}}1 +} +\lstset{ + backgroundcolor=\color{white}, % choose the background color; you must add \usepackage{color} or \usepackage{xcolor}; should come as last argument + %basicstyle=\tiny, % the size of the fonts that are used for the code + breakatwhitespace=false, % sets if automatic breaks should only happen at whitespace + breaklines=true, % sets automatic line breaking + captionpos=b, % sets the caption-position to bottom + commentstyle=\color{gray}, % comment style + deletekeywords={...}, % if you want to delete keywords from the given language + escapeinside={\%*}{*)}, % if you want to add LaTeX within your code + extendedchars=true, % lets you use non-ASCII characters; for 8-bits encodings only, does not work with UTF-8 + frame=single, % adds a frame around the coden, + keepspaces=true, % keeps spaces in text, useful for keeping indentation of code (possibly needs columns=flexible) + keywordstyle=\color{green}, % keyword style + language=Python, % the language of the code + morekeywords={*,...}, % if you want to add more keywords to the set + numbers=left, % where to put the line-numbers; possible values are (none, left, right) + % numbersep=5pt, % how far the line-numbers are from the code + numberstyle=\tiny\color{gray}, % the style that is used for the line-numbers + rulecolor=\color{black}, % if not set, the frame-color may be changed on line-breaks within not-black text (e.g. comments (green here)) + showspaces=false, % show spaces everywhere adding particular underscores; it overrides 'showstringspaces' + showstringspaces=false, % underline spaces within strings only + showtabs=false, % show tabs within strings adding particular underscores + %stepnumber=2, % the step between two line-numbers. If it's 1, each line will be numbered + stringstyle=\color{purple}, + tabsize=2, % sets default tabsize to 2 spaces + %title=\tiny\lstname % show the filename of files included with \lstinputlisting; also try caption instead of title +} diff --git a/tools/style/colorscheme.sty b/tools/style/colorscheme.sty new file mode 100755 index 0000000..1951b9a --- /dev/null +++ b/tools/style/colorscheme.sty @@ -0,0 +1,51 @@ +\NeedsTeXFormat{LaTeX2e} + + +% Couleurs, +\RequirePackage{xcolor} +\RequirePackage{colortbl} + +% Couleurs éléments + +% \definecolor{coulpied}{couleur3} +% \definecolor{coulnumexos}{couleur5} +% \definecolor{coulrule}{couleur5} +% \definecolor{coulsection}{couleur1} +% \definecolor{coultable1}{couleur4} +% \definecolor{coultable2}{couleur3} +% \definecolor{coultheo}{couleur4} +% \definecolor{couldef}{couleur3} + +% Solarized theme +\definecolor{base03}{HTML}{002b36} +\definecolor{base02}{HTML}{073642} +\definecolor{base01}{HTML}{586e75} +\definecolor{base00}{HTML}{657b83} +\definecolor{base0}{HTML}{839496} +\definecolor{base1}{HTML}{93a1a1} +\definecolor{base2}{HTML}{eee8d5} +\definecolor{base3}{HTML}{FDF6E3} +\definecolor{yellow}{HTML}{B58900} +\definecolor{orange}{HTML}{cb4b16} +\definecolor{red}{HTML}{DC322F} +\definecolor{magenta}{HTML}{d33682} +\definecolor{violet}{HTML}{6c71c4} +\definecolor{blue}{HTML}{268bd2} +\definecolor{cyan}{HTML}{2aa198} +\definecolor{green}{HTML}{859900} + +% My theme +\colorlet{text}{base03} +\colorlet{footer}{base02} +\colorlet{bgentete}{base2} + +\colorlet{title}{blue} +\colorlet{subtitle}{base02} +\colorlet{line}{base1} +\colorlet{comments}{base01} +\colorlet{exercise}{blue} +\colorlet{note}{red} + + +\colorlet{highlightbg}{base2} +\colorlet{tabular}{base3} diff --git a/tools/style/myXsim.sty b/tools/style/myXsim.sty new file mode 100644 index 0000000..c0931ef --- /dev/null +++ b/tools/style/myXsim.sty @@ -0,0 +1,150 @@ +\NeedsTeXFormat{LaTeX2e} +% extensions + +\RequirePackage{colorscheme} +\RequirePackage{base} +\RequirePackage{myhdr} +\RequirePackage{notbeamer} + +\RequirePackage{xsim} + +\DeclareExerciseTagging{step} +\DeclareExerciseTagging{type} +\DeclareExerciseTagging{tribe} +\DeclareExerciseTagging{difficulty} +\DeclareExerciseTagging{origin} +\DeclareExerciseTagging{mode} + +\DeclareExerciseTranslations{total}{ + French = total, +} + +\DeclareExerciseEnvironmentTemplate{exo}{% + \subsection* + {% + \color{exercise}{\XSIMmixedcase{\GetExerciseName}}\nobreakspace + \GetExerciseProperty{counter}% + \hspace{0.5cm} \GetExercisePropertyT{mode} + {{\PropertyValue}}% + \hspace{0.5cm} \color{line}\hrulefill \hspace{0.5cm} + \color{exercise} + \GetExercisePropertyT{subtitle} + {{\PropertyValue}}% + \GetExercisePropertyT{points} + {{(/\PropertyValue})}% + \noindent + } +}{} + +\xsimsetup{exercise/template=exo} + +\DeclareExerciseEnvironmentTemplate{sol}{% + \subsection* + {% + \color{exercise}\nobreakspace + Exercice \GetExerciseProperty{counter}% + \hspace{0.5cm} \color{line}\hrulefill \hspace{0.5cm} + \color{exercise}{\XSIMmixedcase{\GetExerciseName}} + \hspace{0.5cm} \color{line}\hrulefill \hspace{0.5cm} + \color{exercise} + \GetExercisePropertyT{subtitle} + {{\PropertyValue}}% + \noindent + } +}{} +\xsimsetup{solution/template=sol} + + +\DeclareExerciseTableTemplate{DNB}{% + \XSIMputright\ExerciseTableCode{% + \hline + \XSIMifblankTF{\ExerciseType} + {} + {\XSIMmixedcase{\GetExerciseParameter{exercise-name}}} + & + \XSIMmixedcase{\XSIMtranslate{points}} \\ + \hline + }% + \ForEachUsedExerciseByType{% + \XSIMifeqTF{#1}{\ExerciseTableType{#1}} + {% + \XSIMifblankTF{\ExerciseType} + {% + \XSIMputright\ExerciseTableCode{% + \XSIMmixedcase{\ExerciseParameterGet{#1}{exercise-name} }% + }% + } + {}% + \XSIMputright\ExerciseTableCode + {#3 & \XSIMifblankTF{#5}{\printgoal{0}}{\printgoal{#5}}\\ }% + } + {}% + } + \XSIMputright\ExerciseTableCode{% + \hline + \XSIMmixedcase{\XSIMtranslate{total}} & + \XSIMifblankTF{\ExerciseType} + {\TotalExerciseGoal{points}{}{}} + {\TotalExerciseTypeGoal{\ExerciseType}{points}{}{}} \\ + \hline + }% + \XSIMexpandcode{% + \noexpand\begin{tabular}{|\XSIMifblankTF{\ExerciseType}{l}{c}|c|} + \noexpand\ExerciseTableCode + \noexpand\end{tabular}% + }% +} + +\newcommand\printsectionexercises{% + \ForEachUsedExerciseByType{% + \ifnum\ExercisePropertyGet{##1}{##2}{step}=\value{section} + \printexercise{exercise}{##2} + \fi + }% +} + +\newcommand\listsectionexercises{% + + \begin{itemize}[label={$\square$}] + \ForEachUsedExerciseByType{% + \ifnum\ExercisePropertyGet{##1}{##2}{step}=\value{section}% + \item % + \GetExerciseProperty{mode}% + {{\PropertyValue}}\;% + \XSIMmixedcase{\GetExerciseName}\nobreakspace + \GetExerciseProperty{counter}% + {{\PropertyValue}}% + : % + \GetExerciseProperty{subtitle}% + {{\PropertyValue}}% + \dotfill + %Auto-évaluation + \begin{tikzpicture} + \foreach \k in {0,1,...,4}{ + \draw (\k*0.5, 0) node[draw, star, star points=5, star point ratio=0.5]{}; + } + \end{tikzpicture} + \fi + }% + \end{itemize} +} + +\xsimsetup{ + exercise/within = section, + exercise/the-counter = \arabic{exercise}, +} + +\newcommand\searchMode{\faIcon{search}} +\newcommand\groupMode{\faIcon{users}} +\newcommand\trainMode{\faIcon{tools}} +\newcommand\projectMode{\faIcon{sitemap}} + +\newcommand\legendMode{% + \textbf{Légende:} \hfill + \searchMode: pour découvrir quelque chose + \hfill + \groupMode: à faire en groupe + \hfill + \trainMode: pour s'entrainer +} + diff --git a/tools/style/myhdr.sty b/tools/style/myhdr.sty new file mode 100644 index 0000000..44a31cc --- /dev/null +++ b/tools/style/myhdr.sty @@ -0,0 +1,97 @@ +\NeedsTeXFormat{LaTeX2e} +% extensions + +\RequirePackage{colorscheme} +\RequirePackage{lastpage} + +\RequirePackage{fancyhdr} + +\newcommand{\op@entete}{} +\newcommand{\op@typedoctmp}{} +\newcommand{\op@tribe}{} +\newcommand{\op@duree}{} +\newcommand{\op@sujet}{} +\newcommand{\op@subtitle}{\op@tribe{} -- \@date{}} + +\newcommand{\tribe}[1]{\renewcommand{\op@tribe}{#1}} +\newcommand{\duree}[1]{\renewcommand{\op@duree}{#1}} +\newcommand{\sujet}[1]{\renewcommand{\op@sujet}{Sujet #1}} + +%% Redéfinition de maketitle +\renewcommand{\maketitle}{% + \noindent{\huge \color{title}\bfseries \@title}\par + \noindent{\color{line}\rule{\linewidth}{1ex}}\par + \noindent{\color{subtitle}\bfseries \op@subtitle \hfill \large\op@sujet}\par + %\vspace{2.5\baselineskip} + %\thispagestyle{plain} +} + +%%% Page de garde +\renewcommand{\titlepage}{% + \pagestyle{plain} + \begin{center} + {\Huge \@title} \\ + \vfill + {\Huge \op@tribe} \\ + + \vfill + \fbox{ + \parbox{0.7\textwidth}{\large Épreuve de : + \begin{center} + \Huge MATHÉMATIQUES + \\[1cm] + {\Large \@date} \\[1cm] + \end{center} + \Large Durée de l'épreuve : \op@duree + \\[1cm] + } + } + \vfill + + ~\\[1cm] + \normalsize + Ce sujet comporte \pageref{LastPage}\, pages, numérotées de 1 / \pageref{LastPage}\; à \pageref{LastPage} / \pageref{LastPage}\\ + Dès qu'il vous est remis, assurez-vous qu'il est complet. + ~\\[0.5cm] + + L'utilisation de la calculatrice en mode \textbf{examen} est autorisée. + + \medskip + L'échange de calculatrice entre les élèves est strictement interdit.\\ + L'usage du dictionnaire n'est pas autorisé. \\[1cm] + + %\textbf{10 points} sont réservés à l'orthographe et à la présentation. + + \gradingtable[type=exercise,template=DNB] + + \vfill + \end{center} + \clearpage +} + +% Header et Footer +\pagestyle{fancy} + +%\setlength{\headheight}{10pt} +%\fancyheadoffset{\textwidth} + +\renewcommand{\headrulewidth}{0pt} +\renewcommand{\footrulewidth}{0pt} + +\newcommand{\op@boiteentete}{\makebox[0pt][l]{\hspace*{-3ex}% + \color{bgentete}\rule[-0.8ex]{\textwidth-5ex}{3ex}% + }} +\lhead{\scriptsize\op@boiteentete \@title} +\chead{} +\rhead{\scriptsize\@date} +\lfoot{\scriptsize\op@boiteentete \op@subtitle} +\cfoot{} +\rfoot{\scriptsize\thepage\ / \pageref{LastPage}} +\fancypagestyle{plain}{ % + \fancyhf{} % remove everything + \renewcommand{\headrulewidth}{0pt} % remove lines as well + \renewcommand{\footrulewidth}{0pt} + \lfoot{\scriptsize\op@boiteentete \op@subtitle} + \cfoot{} + \rfoot{\scriptsize\thepage\ / \pageref{LastPage}} +} diff --git a/tools/style/notbeamer.sty b/tools/style/notbeamer.sty new file mode 100755 index 0000000..5485942 --- /dev/null +++ b/tools/style/notbeamer.sty @@ -0,0 +1,82 @@ +\NeedsTeXFormat{LaTeX2e} + + +% Pour gérer les todo +\RequirePackage[french]{todonotes} +\newcounter{afaire} +\newcommand{\afaire}[2][]{% + % initials of the author (optional) + note in the margin + \refstepcounter{afaire}% + {% + %\setstretch{0.7}% spacing + \todo[inline,#1]{% + \textbf{À faire au crayon à papier:}~#2}% +}} +\newcounter{envideo} +\newcommand{\envideo}[3][]{% + % initials of the author (optional) + note in the margin + \refstepcounter{envideo}% + {% + %\setstretch{0.7}% spacing + \todo[inline,backgroundcolor=green,#1]{% + \textbf{Voir la vidéo}~ #3 + + \begin{minipage}{0.2\linewidth} + \qrcode{#2} + \end{minipage} + \begin{minipage}{0.8\linewidth} + \url{#2} + \end{minipage} + + }% +}} +\newcounter{enclasse} +\newcommand{\enclasse}[2][]{% + % initials of the author (optional) + note in the margin + \refstepcounter{enclasse}% + {% + %\setstretch{0.7}% spacing + \todo[inline,backgroundcolor=green,#1]{% + \textbf{Sera complété en classe}~#2}% +}} +\newcounter{arediger} +\newcommand{\arediger}[2][]{% + % initials of the author (optional) + note in the margin + \refstepcounter{afaire}% + {% + %\setstretch{0.7}% spacing + \todo[inline,#1]{% + \textbf{À rédiger et m'envoyer par mail:}~#2}% +}} + + +\usepackage[tikz]{bclogo} +% Environnements théoreme, définition ... +\newenvironment{encadre}[1] +{ + \begin{bclogo}[barre=none, arrondi=0.1, logo=]{#1} + }{ + \end{bclogo} +} + +\newcounter{doc} +\newenvironment{doc}[1] +{\refstepcounter{doc} + \begin{encadre}{Document \thedoc: #1} + }{ + \end{encadre} +} + +\newenvironment{definition}[1][] +{ + \begin{encadre}{Définition: #1} + }{ + \end{encadre} +} + +\newenvironment{propriete}[1][] +{ + \begin{encadre}{Propriété: #1} + }{ + \end{encadre} +} diff --git a/tools/style/qrcode.dtx b/tools/style/qrcode.dtx new file mode 100644 index 0000000..02cf53a --- /dev/null +++ b/tools/style/qrcode.dtx @@ -0,0 +1,3542 @@ +% \iffalse meta-comment +% +% qrcode.ins +% Copyright 2014 by Anders O.F. Hendrickson (anders.hendrickson@snc.edu) +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3 +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3 or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This work has the LPPL maintenance status `maintained'. +% +% The Current Maintainer of this work is Anders O.F. Hendrickson. +% +% This work consists of the files qrcode.dtx and qrcode.ins +% and the derived file qrcode.sty. +% +% \fi +% +% \iffalse +%<*driver> +\ProvidesFile{qrcode.dtx} +% +%\NeedsTeXFormat{LaTeX2e}[1999/12/01] +%\ProvidesPackage{qrcode} +%<*package> + [2015/01/08 v1.51 QR code generation] +% +% +%<*driver> +\documentclass{ltxdoc} +\usepackage{hyperref} +\usepackage[nolinks]{qrcode} +\EnableCrossrefs +\CodelineIndex +\OnlyDescription +\RecordChanges +\begin{document} + \DocInput{qrcode.dtx} + \PrintChanges + %\PrintIndex +\end{document} +% +% \fi +% +% \CheckSum{0} +% +% \CharacterTable +% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +% Digits \0\1\2\3\4\5\6\7\8\9 +% Exclamation \! Double quote \" Hash (number) \# +% Dollar \$ Percent \% Ampersand \& +% Acute accent \' Left paren \( Right paren \) +% Asterisk \* Plus \+ Comma \, +% Minus \- Point \. Solidus \/ +% Colon \: Semicolon \; Less than \< +% Equals \= Greater than \> Question mark \? +% Commercial at \@ Left bracket \[ Backslash \\ +% Right bracket \] Circumflex \^ Underscore \_ +% Grave accent \` Left brace \{ Vertical bar \| +% Right brace \} Tilde \~} +% +% +% \changes{v1.0}{2014/09/26}{Initial version} +% \changes{v1.5}{2015/01/08}{Added support for new lines and hyperlinks.} +% \changes{v1.51}{2015/01/14}{Bug fix.} +% +% \GetFileInfo{qrcode.sty} +% +% \DoNotIndex{\newcommand,\newenvironment,\def} +% +% \def\F{F} +% +% \title{The \textsf{qrcode} package: \\ +% \makebox[0pt][r]{\raisebox{-0.3\height}[0pt][0pt]{\qrcode[hyperlink,tight]{http://ctan.org/pkg/qrcode}}\rule{0.75in}{0pt}}Quick Response code \\ +% generation in \LaTeX\thanks{This document +% corresponds to \textsf{qrcode}~\fileversion, dated \filedate.}} +% \author{Anders Hendrickson\\ St.~Norbert College, De~Pere, WI, USA \\ \texttt{anders.hendrickson@snc.edu}} +% \date{January 8, 2015} +% +% \maketitle +% +% +% \section{Introduction} +% +% The proliferation of smartphones and tablets has led to the widespread +% use of Quick Response (QR) codes, which encode numeric, alphanumeric, kanji, +% or binary information into a square matrix of black and white pixels called modules. +% Although QR codes can encode any information up to almost three kilobytes, +% their most common use is as physical hyperlinks: a mobile device scans +% a printed QR code, decodes a URL, and automatically points a browser to that location. +% +% It is natural to want to include QR codes in certain \LaTeX\ documents; +% for example, one may want to direct the reader of a printed page to +% related interactive content online. +% Before now, the only \LaTeX\ package for producing QR codes was the +% immensely flexible {\tt pst-barcode}. As that package relies on +% {\tt pstricks}, however, it can be difficult to integrate with +% a pdf\LaTeX\ workflow,\footnote{% +% The {\tt auto-pst-pdf} or {\tt pstool} packages can make this possible +% by automatically running +% \LaTeX${}\rightarrow \tt dvips \rightarrow ps2pdf \rightarrow pdfcrop$ +% for each barcode generated in {\tt pstricks}, +% so long as the user is able and willing to enable {\tt\string\write18} +% in {\tt pdflatex} and install Perl. +% Judging by questions on {\tt tex.stackexchange.com} and {\tt latexcommunity.org}, +% this is a significant hurdle for some users. +% Moreover, according to {\tt http://tex.stackexchange.com/questions/72876/} +% this workflow may have trouble if the QR code is in a header.} +% and a pdf\LaTeX\ user may not want the extra overhead just to produce a QR code. +% If one wants to avoid {\tt pstricks}, a Lua\TeX\ solution was proposed at +% {\tt http://tex.stackexchange.com/questions/89649/}, +% and a plain\TeX\ solution can be found at +% {\catcode`\~=12\tt http://ktiml.mff.cuni.cz/~maj/QRcode.TeX}, +% but until now no \LaTeX\ package had been available that did not call on outside machinery. +% +% The {\tt qrcode} package, in contrast, implements the QR code algorithm using +% only \TeX\ and \LaTeX\ commands, so it should work with any \LaTeX\ workflow. +% Because it draws the squares constituting a QR code using the \TeX\ primitive +% |\rule|, there is no need to load any graphics package whatsoever. +% For a user who merely wants a QR code, this is the simplest solution. +% +% \section{Usage}\label{sect:usage} +% +% +% \DescribeMacro{\qrcode} +% The package provides just one command, |\qrcode|, with the following syntax: +% \begin{center} +% |\qrcode|\oarg{options}\marg{text to be encoded} +% \end{center} +% For example, |\qrcode[hyperlink,height=0.5in]{http://www.ctan.org}| produces +% \begin{center} +% \qrcode[hyperlink,height=0.5in]{http://www.ctan.org} +% \end{center} +% Although the most common use of QR codes is as URLs, +% the \meta{text to be encoded} can be almost any typed text. +% The few exceptions to this are described in section \ref{sect:specialcharacters}. +% +% \subsection{Package Options} +% +% \DescribeMacro{nolinks} +% When the |hyperref| package is loaded, +% by default |\qrcode| assumes its argument is a URL +% and makes the QR code produced a hyperlink to that URL. +% This default behavior may be changed by invoking the |nolinks| package option. +% For example, most of the QR codes in this document are not in fact URLs, +% so this documentation was typeset with |\usepackage[nolinks]{qrcode}|. +% The |hyperlinks| option is an antonym to |nolinks| and is the default. +% These options have no effect if hyperref is not loaded. +% +% \DescribeMacro{draft} +% \DescribeMacro{final} +% Creating QR codes for short URLs takes relatively little time.\footnote{On +% this author's laptop, even a 60-character URL (version 4, level M) adds +% only about 0.7 seconds of compilation time.} +% Because \TeX\ was designed for typesetting, not for extensive computations, +% however, if many small QR codes or a single large one are required, +% the time spent can be quite noticeable. To save compilation +% time while working on a large document, calling the |draft| option +% causes the package not to compute QR codes, but merely to insert placeholder +% symbols with no data. The |final| option is an antonym to |draft| +% and is the default. +% \begin{quote} +% \begin{tabular}{p{1.25in}p{3.5in}} +% {\qrcode[draft,version=15]{http://www.tug.org}} +% & +% \begin{minipage}{3in} +% \tt +% |\documentclass{article}| \\ +% |\usepackage[draft]{qrcode}| \\ +% |\begin{document}| \\ +% | \qrcode[version=15]{Dummy code}| \\ +% |\end{document}| +% \end{minipage} +% \end{tabular} +% \end{quote} +% The placeholder symbol produced in {\tt draft} mode will have the same size +% and dimensions as the actual QR code. +% +% To conserve processing time, when |\qrcode| computes the binary matrix representing +% a QR code, it saves that binary data as a string of 1's and 0's +% both in a macro and in the {\tt .aux} file. +% Thus if the same QR code is desired later in the document, or upon the next +% run of \LaTeX, the QR symbol can be redrawn immediately from the saved binary data. +% +% \DescribeMacro{forget} +% There may be times when this is not desired; testing of this package is the chief +% example, but one might also have reason to believe that the {\tt .aux} file +% contains bad data. +% Invoking the |forget| package option causes |\qrcode| to calculate +% every QR code anew, even if a QR code for that \meta{text to be encoded}, level, +% and version +% was read from the {\tt .aux} file or was already computed earlier in the document. +% +% \subsection{Options} +% \DescribeMacro{\qrset} +% Several options affect the appearance and encoding of the QR code; +% {\tt qrcode} uses the {\tt xkeyval} package to handle the setting +% and processing of key-value pairs. +% The following options may either be given as optional arguments +% to |\qrcode| or changed within a \TeX-grouping using the +% macro |\qrset|. +% \begin{quote} +% \begin{tabular}{p{6cm}p{2in}} +% \qrcode{ABCD} +% {\qrset{height=1cm}% +% \qrcode{EFGH}} +% \qrcode{IJKL} +% & +% \begin{minipage}{3in} +% |\qrcode{ABCD}| \\ +% |{\qrset{height=1cm}%| \\ +% | \qrcode{EFGH}}| \\ +% |\qrcode{IJKL}| +% \end{minipage} +% \end{tabular} +% \end{quote} +% +% \DescribeMacro{height} +% The |height=|\meta{dimen} key sets the printed height (and width) of the +% QR code. The default value is {\tt 2cm}. +% \begin{quote} +% \begin{tabular}{p{2in}p{2in}} +% \qrcode{ABCD} \qrcode[height=1cm]{ABCD} +% & |\qrcode{ABCD}| |\qrcode[height=1cm]{ABCD}| +% \end{tabular} +% \end{quote} +% +% \DescribeMacro{level} +% The QR code specification (ISO 18004:2006) includes four +% levels of encoding: Low, Medium, Quality, and High, in +% increasing order of error-correction capabaility. +% In general, for a given text a higher error-correction +% level requires more bits of information in the QR code. +% The key |level=|\meta{level specification} +% selects the minimum acceptable level. +% The \meta{level specification} may be |L|, |M|, |Q|, or |H|; +% the default is |M|. +% It may happen that the smallest QR code able to encode +% the specified text at the desired level +% is in fact large enough to provide a higher level of +% error-correction. If so, {\tt qrcode} automatically upgrades to the higher +% error-correction level, and a message is printed in the log file. +% +% \DescribeMacro{version} +% QR codes range in size from $21\times 21$ modules (``version 1'') +% to $177\times 177$ modules (``version 40''), in steps of 4 modules. +% The package automatically selects the smallest version large enough to encode +% the specified text at the desired error-correction level. +% Nevertheless, there might be occasions when a specific version is required; +% for example, perhaps a set of QR codes should have the same dimensions for +% aesthetic reasons, even though some encode shorter texts than others. +% For this reason, the key |version=|\meta{version specification} allows the user +% to specify a minimum version number, from 1 through 40, for the QR code. +% Setting |version=0| means ``as small as possible''; this is the default. +% If the desired version is not large enough to encode the text, the version +% will automatically be increased to accommodate the text, and a message will +% be placed in the log file. +% \begin{quote} +% \begin{tabular}{p{5.2cm}p{3in}} +% \raggedright +% \qrcode{ABCD} +% \qrcode[version=5]{ABCD} +% \medskip \\ +% \qrcode[version=10]{ABCD} +% \qrcode[version=20]{ABCD} +% & +% \begin{minipage}{3in} +% |\qrcode{ABCD}| \\ +% |\qrcode[version=5]{ABCD}| \\ +% |\medskip \\| \\ +% |\qrcode[version=10]{ABCD}| \\ +% |\qrcode[version=20]{ABCD}| +% \end{minipage} +% \end{tabular} +% \end{quote} +% +% +% \DescribeMacro{tight} +% \DescribeMacro{padding} +% The QR specification states that a QR code should be surrounded by white\-space +% of a width equal to that of four modules. In many applications, a document +% author is likely to provide sufficient spacing anyway (e.g., by placing the +% QR code in a {\tt center} environment, header, or |\marginpar|), so by +% default the |qrcode| package adds no spacing. If the option |padding| is +% specified, however, the QR code will automatically be surrounded with 4 modules' +% worth of white\-space. The key |tight| is an antonym of |padding|; the default is |tight|. +% +% \DescribeMacro{link} +% \DescribeMacro{nolink} +% \DescribeMacro{\qrcode*} +% As described above, if the |hyperref| package is loaded, +% then the QR codes produced in a PDF document can be made +% into hyperlinks to their text. The default behavior +% can be controlled with the options |nolinks| and |hyperlinks|, +% but this default can be overridden for individual QR codes by invoking +% the options |link| or |nolink|. +% Moreover, the starred version of the macro, |\qrcode*|, is a shorthand +% equivalent to |\qrcode[nolink]|. +% \begin{quote} +% \begin{tabular}{p{5.2cm}p{3in}} +% \raggedright +% \qrset{link, height=1.5cm} +% \qrcode{http://www.ctan.org} +% \qrcode[nolink]{This is not a URL.} +% \qrcode*{Neither is this.} +% & +% \begin{minipage}{3in} +% |\qrset{link, height=1.5cm}| \\ +% |\qrcode{http://www.ctan.org}| \\ +% |\qrcode[nolink]{This is not a URL.}| \\ +% |\qrcode*{Neither is this.}| +% \end{minipage} +% \end{tabular} +% \end{quote} +% +% \subsection{Special characters}\label{sect:specialcharacters} +% Many URLs can be processed by \TeX\ with no hiccups, +% but not infrequently a URL may contain the symbols |%|, |#|, +% |~|, |_|, and |&|. Moreover, QR codes need not just contain +% URL's, so a user may wish to encode text containing |^|, |$|, or spaces. +% The |qrcode| package offers two ways of coping with these special characters. +% +% First, the |\qrcode| command itself processes its \meta{text to be encoded} +% in a limited verbatim mode. The following characters will be encoded into +% the QR code as typed: +% \begin{center} +% |#| |$| |&| |^| |_| |~| |%| {\tt\char32} +% \end{center} +% and line breaks as well.\footnote{Technically, when the input character +% {\tt\char`\^\char`\^M} (CR, charcode 13) is encountered, +% the character {\tt\char`\^\char`\^J} (LF, charcode 10) is placed into the QR code.} +% Conspicuously absent from this list are |\|, |{|, and |}|. +% This is intentional, so that macros may be used within |\qrcode| +% to generate the \meta{text to be encoded} automatically. +% If these characters are desired, they may be obtained by ``escaping'' them +% with an extra backslash. +% \begin{quote} +% \begin{tabular}{p{2in}p{3in}} +% \qrset{height=1.5cm}% +% \qrcode{We can include #$&^_~%.} +% \def\foo{bar}% +% \qrcode{Set the \foo\ high.} +% \qrcode{We must escape \\emph\{this\}.} +% & \begin{minipage}{3in} +% |\qrset{height=1.5cm}%| \\ +% |\qrcode{We can include #$&^_~%.}| \\ +% |\def\foo{bar}%| \\ +% |\qrcode{Set the \foo\ high.}| \\ +% |\qrcode{We must escape \\emph\{this\}.}| +% \end{minipage} +% \end{tabular} +% \end{quote} +% +% As with all verbatim modes, however, because \TeX\ irrevocably sets catcodes +% when it first encounters characters, this will not work if the |\qrcode| macro +% is contained in another macro. If you call |\qrcode| inside an +% |\fbox| or a |\marginpar|, for example, and if your URL contains one of those +% special characters, you will either encounter error messages or (worse, because +% it is undetectable to the naked eye) have the wrong QR code typeset. +% In this scenario, you can still include any of the characters +% |#$&^_~%|{\tt\char32}|\{}| +% by escaping them with an extra backslash; +% so long as they eventually pass unexpanded to |\qrcode|, +% they will produce the correct QR code. +% A line break may be obtained with |\?|. +% \begin{quote} +% \begin{tabular}{p{1.5cm}p{2in}} +% \fbox{\qrcode[height=1cm]{\#\$\&\^\_\~\?\%\ \\\{\}}} +% & |\fbox{qrcode[height=1cm]{\#\$\&\^\_\~\?\%\ \\\{\}}}| +% \end{tabular} +% \end{quote} +% +% \section{Limitations and Cautions} +% +% \begin{itemize} +% \item The QR specification includes modes for encoding numeric, alphanumeric, +% or Kanji data more efficiently. This package does not (yet) offer +% those options. +% \item The QR specification offers ways to string lengthy data across multiple +% QR codes. This package does not implement that possibility. +% \end{itemize} +% +% \StopEventually{} +% +% \section{Implementation} +% \subsection{Key handling and options} +% \begin{macrocode} +%%PACKAGE LOADING +\RequirePackage{xcolor}% +\RequirePackage{xkeyval}% + +%%INITIAL CODE +\newif\ifqr@draft@mode +\newif\ifqr@forget@mode + +%%DECLARATION OF OPTIONS +\define@boolkey{qr}[qr@]{draft}[true]{\ifqr@draft\qr@draft@modetrue\else\qr@draft@modefalse\fi}% +\define@boolkey{qr}[qr@]{final}[true]{\ifqr@final\qr@draft@modefalse\else\qr@draft@modetrue\fi}% +\define@boolkey{qr}[qr@]{forget}[true]{\ifqr@forget\qr@forget@modetrue\else\qr@forget@modefalse\fi}% +\define@boolkey{qr}[qr@]{hyperlink}[true]{}% %This creates \ifqr@hyperlink. +\define@boolkey{qr}[qr@]{hyperlinks}[true]{\ifqr@hyperlinks\qr@hyperlinktrue\else\qr@hyperlinkfalse\fi}% +\define@boolkey{qr}[qr@]{link}[true]{\ifqr@link\qr@hyperlinktrue\else\qr@hyperlinkfalse\fi}% +\define@boolkey{qr}[qr@]{nolink}[true]{\ifqr@nolink\qr@hyperlinkfalse\else\qr@hyperlinktrue\fi}% %Make nolink an antonym. +\define@boolkey{qr}[qr@]{links}[true]{\ifqr@links\qr@hyperlinktrue\else\qr@hyperlinkfalse\fi}% +\define@boolkey{qr}[qr@]{nolinks}[true]{\ifqr@nolinks\qr@hyperlinkfalse\else\qr@hyperlinktrue\fi}% %Make nolinks an antonym. + +%%EXECUTION OF OPTIONS +\qr@draft@modefalse +\qr@forget@modefalse +\qr@hyperlinktrue + +\ProcessOptionsX + +% \end{macrocode} +% \subsection{Utilities} +% \begin{macrocode} +%COUNTERS +\newcounter{qr@i}% +\newcounter{qr@j}% +\newcount\qr@a +\newcount\qr@b +\newcount\qr@c + +%BASICS +\let\xa=\expandafter + +%This is for messages. +\newlinechar=`\^^J + + +%Tests +\def\qr@relax{\relax}% + +%Manipulating macros +\def\qr@preface@macro#1#2{% + % #1 = macro name + % #2 = text to add to front of macro + \def\qr@tempb{#2}% + \xa\xa\xa\def\xa\xa\xa#1\xa\xa\xa{\xa\qr@tempb #1}% +}% + +\def\qr@g@preface@macro#1#2{% + % #1 = macro to be appended to + % #2 = code to add + \edef\qr@tempb{#2}% + \xa\xa\xa\gdef\xa\xa\xa#1\xa\xa\xa{\xa\qr@tempb#1}% +} + + +\def\qr@getstringlength#1{% + \bgroup + \qr@a=0% + \xdef\qr@thestring{#1}% + \xa\qr@stringlength@recursive\xa(\qr@thestring\relax\relax)% + \xdef\qr@stringlength{\the\qr@a}% + \egroup +}% + +\def\qr@stringlength@recursive(#1#2){% + \def\qr@testi{#1}% + \ifx\qr@testi\qr@relax + %we are done. + \let\qr@next=\relax% + \else + \advance\qr@a by 1% + \def\qr@next{\qr@stringlength@recursive(#2)}% + \fi + \qr@next +}% +% \end{macrocode} +% \subsubsection{For-loop macro} +% We implement a macro |\qr@for| with the syntax +% \begin{center} +% |\qr@for| \meta{control sequence}=\meta{number} to \meta{number} by \meta{number} \marg{loop body} +% \end{center} +% The \meta{control sequence} becomes the loop variable, +% which is a \TeX\ counter. +% For example, |\qr@for \i=1 to 8 by 2 {\fbox{\number\i}}| +% produces {\makeatletter\qr@for \i=1 to 8 by 2 {\fbox{\number\i}}}. +% \begin{macrocode} +%The \qr@for@depth counter measures the depth of our loop. +%The outermost loop has depth zero. +\newcount\qr@for@depth% +\newcount\qr@for@maxdepth% +\qr@for@depth=0% +\qr@for@maxdepth=0% +%These counters are used in the qr@for loop. +\newcount\qr@for@start% +\newcount\qr@for@end% +\newcount\qr@for@step% +%Now a macro to get a new count for every depth as needed. +\def\qr@allocate@new@for@counter{% + \global\advance\qr@for@maxdepth by 1% + \newcount\qr@newforcount% + \xa\global\xa\let\csname qr@for@var@\the\qr@for@maxdepth\endcsname=\qr@newforcount% +}% + +\newif\ifqr@loopshouldrun +%The extra # in the following definition makes sure #4 scoops up everything up to the next opening brace. +%This is needed so the step can include more than one character without being enclosed in braces itself. +\def\qr@for #1=#2to#3by#4#{% + \qr@for@int{#1}{#2}{#3}{#4}% +}% +\long\def\qr@for@int#1#2#3#4#5{% + \bgroup + %Because we're working within a TeX group, + %any values of \qr@for@start, \qr@for@end, and \qr@for@step from an outer loop + %will be restored after the \egroup. + % + %For the \qr@for@var itself, however, we need a different counter, + %because the user's text within the loop might need to access the variable from the outer loop. + \advance\qr@for@depth by 1\relax% This is a local change. + \ifnum\qr@for@depth>\qr@for@maxdepth% + %This is the first time we have gone to this depth of nesting! + %We should only be over by one. + \qr@allocate@new@for@counter% + \fi +% \showthe\qr@for@depth% + \xa\let\xa\qr@for@var\xa=\csname qr@for@var@\the\qr@for@depth\endcsname% + %Now \qr@for@var points to the same register as \qr@for@var@3 or something. + %The next line lets the user-level variable (e.g., \i or \j) point to the same count register. + \let#1=\qr@for@var% + %Now establish the looping parameters. + \edef\qr@for@start@text{#2}% + \edef\qr@for@end@text{#3}% + \edef\qr@for@step@text{#4}% + \def\qr@for@body{\bgroup #5\egroup}% + \xa\qr@for@start\qr@for@start@text\relax% + \xa\qr@for@end \qr@for@end@text\relax% + \xa\qr@for@step \qr@for@step@text\relax% + % + %Next, test whether the loop should run at all. + % * "\qr@for \i = 1 to 0 by 1" should fail. + % * "\qr@for \i = 3 to 5 by -1" should fail. + % * "\qr@for \i = 6 to 2 by 1" should fail. + % * "\qr@for \i = 4 to 4 by -1" should run. + % * "\qr@for \i = 4 to 4 by 1" should run. + % * "\qr@for \i = 5 to 7 by 0" should fail. + %The loop should fail if (step)=0 or if (step) and (end-start) have opposite signs. + %The loop will fail if (step=0) or (step)*(end-start)<0. + % TODO: "\qr@for \i = 5 to 5 by 0" should run (just one iteration). + \qr@loopshouldruntrue + \ifnum\qr@for@step=0\relax + \qr@loopshouldrunfalse + \fi + \qr@a=\qr@for@end% + \advance\qr@a by -\qr@for@start% + \multiply\qr@a by \qr@for@step% + \ifnum\qr@a<0\relax + \qr@loopshouldrunfalse + \fi + \ifqr@loopshouldrun + \qr@for@var=\qr@for@start% + \ifnum\qr@for@step>0\relax + \def\qr@for@recursive{% + \qr@for@body% + \advance\qr@for@var by \qr@for@step% + \ifnum\qr@for@var>\qr@for@end% + \let\qr@for@next=\relax% + \else% + \let\qr@for@next=\qr@for@recursive% + \fi% + \qr@for@next% + }% + \else + \def\qr@for@recursive{% + \qr@for@body% + \advance\qr@for@var by \qr@for@step% + \ifnum\qr@for@var<\qr@for@end% + \let\qr@for@next=\relax% + \else% + \let\qr@for@next=\qr@for@recursive% + \fi% + \qr@for@next% + }% + \fi + \qr@for@recursive% + \fi + \egroup +}% +% \end{macrocode} +% \subsubsection{Base conversions} +% \begin{macrocode} +\def\qr@padatfront#1#2{% + % #1 = macro containing text to pad + % #2 = desired number of characters + % Pads a number with initial zeros. + \qr@getstringlength{#1}% + \qr@a=\qr@stringlength\relax% + \advance\qr@a by 1\relax% + \qr@for \i = \qr@a to #2 by 1\relax% + {\qr@g@preface@macro{#1}{0}}% +} + + +\qr@a=-1\relax% +\def\qr@savehexsymbols(#1#2){% + \advance\qr@a by 1\relax% + \xa\def\csname qr@hexchar@\the\qr@a\endcsname{#1}% + \xa\edef\csname qr@hextodecimal@#1\endcsname{\the\qr@a}% + \ifnum\qr@a=15\relax + %Done. + \let\qr@next=\relax% + \else + \def\qr@next{\qr@savehexsymbols(#2)}% + \fi% + \qr@next% +}% +\qr@savehexsymbols(0123456789abcdef\relax\relax)% + + +\def\qr@decimaltobase#1#2#3{% + % #1 = macro to store result + % #2 = decimal representation of a positive integer + % #3 = new base + \bgroup + \edef\qr@newbase{#3}% + \gdef\qr@base@result{}% + \qr@a=#2\relax% + \qr@decimaltobase@recursive% + \xdef#1{\qr@base@result}% + \egroup +} +\def\qr@decimaltobase@recursive{% + \qr@b=\qr@a% + \divide\qr@b by \qr@newbase\relax + \multiply\qr@b by -\qr@newbase\relax + \advance\qr@b by \qr@a\relax% + \divide\qr@a by \qr@newbase\relax% + \ifnum\qr@b<10\relax + \edef\qr@newdigit{\the\qr@b}% + \else + \edef\qr@newdigit{\csname qr@hexchar@\the\qr@b\endcsname}% + \fi + \edef\qr@argument{{\noexpand\qr@base@result}{\qr@newdigit}}% + \xa\qr@g@preface@macro\qr@argument% + \ifnum\qr@a=0\relax + \relax + \else + \xa\qr@decimaltobase@recursive + \fi +} + +\newcommand\qr@decimaltohex[3][0]{% + % #1 (opt.) = number of hex digits to create + % #2 = macro to store result + % #3 = decimal digits to convert + \qr@decimaltobase{#2}{#3}{16}% + \qr@padatfront{#2}{#1}% +} + + +\newcommand\qr@decimaltobinary[3][0]{% + % #1 (opt.) = number of bits to create + % #2 = macro to store result + % #3 = decimal digits to convert + \qr@decimaltobase{#2}{#3}{2}% + \qr@padatfront{#2}{#1}% +} + +\qr@for \i = 0 to 15 by 1% + {% + \qr@decimaltohex[1]{\qr@hexchar}{\the\i}% + \qr@decimaltobinary[4]{\qr@bits}{\the\i}% + \xa\xdef\csname qr@b2h@\qr@bits\endcsname{\qr@hexchar}% + \xa\xdef\csname qr@h2b@\qr@hexchar\endcsname{\qr@bits}% + }% + + + +\newcommand\qr@binarytohex[3][\relax]{% + % #1 (optional) = # digits desired + % #2 = macro to save to + % #3 = binary string (must be multiple of 4 bits) + \def\qr@test@i{#1}% + \ifx\qr@test@i\qr@relax% + %No argument specified + \def\qr@desireddigits{0}% + \else + \def\qr@desireddigits{#1}% + \fi + \gdef\qr@base@result{}% + \edef\qr@argument{(#3\relax\relax\relax\relax\relax)}% + \xa\qr@binarytohex@int\qr@argument% + \qr@padatfront{\qr@base@result}{\qr@desireddigits}% + \xdef#2{\qr@base@result}% +} +\def\qr@binarytohex@int(#1#2#3#4#5){% + % #1#2#3#4 = 4 bits + % #5 = remainder, including \relax\relax\relax\relax\relax terminator + \def\qr@test@i{#1}% + \ifx\qr@test@i\qr@relax% + %Done. + \def\qr@next{\relax}% + \else% + \xdef\qr@base@result{\qr@base@result\csname qr@b2h@#1#2#3#4\endcsname}% + \def\qr@next{\qr@binarytohex@int(#5)}% + \fi% + \qr@next% +} + +\newcommand\qr@hextobinary[3][\relax]{% + % #1 (optional) = # bits desired + % #2 = macro to save to + % #3 = hexadecimal string + \bgroup + \def\qr@test@i{#1}% + \ifx\qr@test@i\qr@relax% + %No argument specified + \def\qr@desireddigits{0}% + \else + \def\qr@desireddigits{#1}% + \fi + \gdef\qr@base@result{}% + \edef\qr@argument{(#3\relax\relax)}% + \xa\qr@hextobinary@int\qr@argument% + \qr@padatfront{\qr@base@result}{\qr@desireddigits}% + \xdef#2{\qr@base@result}% + \egroup +} +\def\qr@hextobinary@int(#1#2){% + % #1 = hexadecimal character + % #2 = remainder, including \relax\relax terminator + \def\qr@test@@i{#1}% + \ifx\qr@test@@i\qr@relax% + %Done. + \def\qr@next{\relax}% + \else% + \xdef\qr@base@result{\qr@base@result\csname qr@h2b@#1\endcsname}% + \def\qr@next{\qr@hextobinary@int(#2)}% + \fi% + \qr@next% +} + +\def\qr@hextodecimal#1#2{% + \edef\qr@argument{#2}% + \xa\qr@a\xa=\xa\number\xa"\qr@argument\relax% + \edef#1{\the\qr@a}% +} + +\def\qr@hextodecimal#1#2{% + % #1 = macro to store result + % #2 = hexadecimal representation of a positive integer + \bgroup + \qr@a=0\relax% + \edef\qr@argument{(#2\relax)}% + \xa\qr@hextodecimal@recursive\qr@argument% + \xdef#1{\the\qr@a}% + \egroup +} +\def\qr@hextodecimal@recursive(#1#2){% + % #1 = first hex char + % #2 = remainder + \advance \qr@a by \csname qr@hextodecimal@#1\endcsname\relax% + \edef\qr@testii{#2}% + \ifx\qr@testii\qr@relax% + %Done. + \let\qr@next=\relax% + \else + %There's at least one more digit. + \multiply\qr@a by 16\relax + \edef\qr@next{\noexpand\qr@hextodecimal@recursive(#2)}% + \fi% + \qr@next% +} +% \end{macrocode} +% \subsubsection{Catcode setup} +% \begin{macrocode} +%The following catcode trickery creates special characters +%with catcode 12 (other) for use in our verbatim handling. +{\catcode`\ =12\relax\gdef\qr@otherspace{ }}% +{\catcode`\%=12\relax\gdef\qr@otherpercent{%}}% +{\catcode`\#=12\relax\gdef\qr@otherpound{#}}% +{\catcode`\|=0\relax|catcode`|\=12|relax|gdef|qr@otherbackslash{\}}% +{\catcode`\^^J=12\relax\gdef\qr@otherlf{^^J}}% +\bgroup + \catcode`\<=1\relax + \catcode`\>=2\relax + \catcode`\{=12\relax\gdef\qr@otherleftbrace<{>% + \catcode`\}=12\relax\gdef\qr@otherrightbrace<}>% +\egroup% +{\catcode`\&=12\relax\gdef\qr@otherampersand{&}}% +{\catcode`\~=12\relax\gdef\qr@othertilde{~}}% +{\catcode`\^=12\relax\gdef\qr@othercaret{^}}% +{\catcode`\_=12\relax\gdef\qr@otherunderscore{_}}% +{\catcode`\$=12\relax\gdef\qr@otherdollar{$}}% + +%Line feeds require some special handling. \TeX\ reads a line feed in the input +%as |^^M| (carriage return, character code 13), but it should be encoded in a +%QR code as |^^J| (line feed, character code 10). +%To do this, we make |^^M| an active character and a synonym for a |^^J| with catcode 12. +%Note that the macro |\qr@verbatimlinefeeds| must itself be processed with |^^M| active. +{\catcode`\^^M=13\relax\gdef\qr@verbatimlinefeeds{\let^^M=\qr@otherlf}} +\def\qr@verbatimcatcodes{% + \catcode`\#=12\relax + \catcode`\$=12\relax + \catcode`\&=12\relax + \catcode`\^=12\relax + \catcode`\_=12\relax + \catcode`\~=12\relax + \catcode`\%=12\relax + \catcode`\ =12\relax + \catcode`\^^M=13\relax\qr@verbatimlinefeeds}% + +\def\qr@setescapedspecials{% + \let\ =\qr@otherspace% + \let\%=\qr@otherpercent% + \let\#=\qr@otherpound% + \let\&=\qr@otherampersand% + \let\^=\qr@othercaret% + \let\_=\qr@otherunderscore% + \let\~=\qr@othertilde% + \let\$=\qr@otherdollar% + \let\\=\qr@otherbackslash% + \let\{=\qr@otherleftbrace% + \let\}=\qr@otherrightbrace% + \let\?=\qr@otherlf% +}% +% \end{macrocode} +% \subsection{Plotting} +% \begin{macrocode} +\def\qr@creatematrix#1{% + \xa\gdef\csname #1\endcsname##1##2{% + \csname #1@##1@##2\endcsname + }% +}% + + +\def\qr@storetomatrix#1#2#3#4{% + % #1 = matrix name + % #2 = row number + % #3 = column number + % #4 = value of matrix entry + \xa\gdef\csname #1@#2@#3\endcsname{#4}% +}% + +\def\qr@estoretomatrix#1#2#3#4{% + % This version performs exactly one expansion on #4. + % #1 = matrix name + % #2 = row number + % #3 = column number + % #4 = value of matrix + \xa\xa\xa\gdef\xa\xa\csname #1@#2@#3\endcsname\xa{#4}% +}% + +\def\qr@matrixentry#1#2#3{% + % #1 = matrix name + % #2 = row number + % #3 = column number + \csname #1@#2@#3\endcsname% +}% + + + +\def\qr@createsquareblankmatrix#1#2{% + \qr@creatematrix{#1}% + \xa\gdef\csname #1@numrows\endcsname{#2}% + \xa\gdef\csname #1@numcols\endcsname{#2}% + \qr@for \i = 1 to #2 by 1% + {\qr@for \j = 1 to #2 by 1% + {\qr@storetomatrix{#1}{\the\i}{\the\j}{\qr@blank}}}% +}% + +\def\qr@numberofrowsinmatrix#1{% + \csname #1@numrows\endcsname% +}% + +\def\qr@numberofcolsinmatrix#1{% + \csname #1@numcols\endcsname% +}% + +\def\qr@setnumberofrows#1#2{% + \xa\xdef\csname #1@numrows\endcsname{#2}% +}% + +\def\qr@setnumberofcols#1#2{% + \xa\xdef\csname #1@numcols\endcsname{#2}% +}% + +\newlength\qr@desiredheight +\setlength\qr@desiredheight{2cm}% +\newlength\qr@modulesize +\newlength\qr@minipagewidth + +\def\qr@printmatrix#1{% + \def\qr@black{\rule{\qr@modulesize}{\qr@modulesize}}% + \def\qr@white{\rule{\qr@modulesize}{0pt}}% + \def\qr@black@fixed{\rule{\qr@modulesize}{\qr@modulesize}}% + \def\qr@white@fixed{\rule{\qr@modulesize}{0pt}}% + \def\qr@black@format{\rule{\qr@modulesize}{\qr@modulesize}}% + \def\qr@white@format{\rule{\qr@modulesize}{0pt}}% + %Set module size + \setlength{\qr@modulesize}{\qr@desiredheight}% + \divide\qr@modulesize by \qr@size\relax% + % + \setlength{\qr@minipagewidth}{\qr@modulesize}% + \multiply\qr@minipagewidth by \qr@size\relax% + \ifqr@tight + \else + \advance\qr@minipagewidth by 8\qr@modulesize% + \fi + \begin{minipage}{\qr@minipagewidth}% + \baselineskip=\qr@modulesize% + \ifqr@tight\else\rule{0pt}{4\qr@modulesize}\par\fi% %Blank space at top. + \qr@for \i = 1 to \qr@numberofrowsinmatrix{#1} by 1% + {\ifqr@tight\else\rule{4\qr@modulesize}{0pt}\fi% %Blank space at left. + \qr@for \j = 1 to \qr@numberofcolsinmatrix{#1} by 1% + {\qr@matrixentry{#1}{\the\i}{\the\j}}% + \par}% + \ifqr@tight\else\rule{0pt}{4\qr@modulesize}\par\fi% + \end{minipage}% +}% + +\def\qr@printsavedbinarymatrix#1{% + \edef\qr@binarystring{#1\relax\relax}% + %Set module size + \setlength{\qr@modulesize}{\qr@desiredheight}% + \divide\qr@modulesize by \qr@size\relax% + % + \setlength{\qr@minipagewidth}{\qr@modulesize}% + \multiply\qr@minipagewidth by \qr@size\relax% + \ifqr@tight + \else + \advance\qr@minipagewidth by 8\qr@modulesize% + \fi + \begin{minipage}{\qr@minipagewidth}% + \baselineskip=\qr@modulesize% + \ifqr@tight\else\rule{0pt}{4\qr@modulesize}\par\fi% %Blank space at top. + \qr@for \i = 1 to \qr@size by 1% + {\ifqr@tight\else\rule{4\qr@modulesize}{0pt}\fi% %Blank space at left. + \qr@for \j = 1 to \qr@size by 1% + {\edef\qr@theargument{(\qr@binarystring)}% + \xa\qr@printsavedbinarymatrix@int\qr@theargument + }% + \par}% + \ifqr@tight\else\rule{0pt}{4\qr@modulesize}\par\fi% + \end{minipage}% +}% + +\def\qr@printsavedbinarymatrix@int(#1#2){% + % #1 = first bit, either 1 or 0. + % #2 = remainder of string, terminating with \relax\relax + % There's no need to check for EOF here, because + % we'll only call this n^2 times. + \ifcase #1\relax + \rule{\qr@modulesize}{0pt}% % 0: white square + \or + \rule{\qr@modulesize}{\qr@modulesize}% % 1: black square + \fi + \xdef\qr@binarystring{#2}% +}% + +\def\qr@createliteralmatrix#1#2#3{% + % #1 = matrix name + % #2 = m, the number of rows and columns in the square matrix + % #3 = a string of m^2 tokens to be written into the matrix + \qr@creatematrix{#1}% + \xa\xdef\csname #1@numrows\endcsname{#2}% + \xa\xdef\csname #1@numcols\endcsname{#2}% + \gdef\qr@literalmatrix@tokens{#3}% + \qr@for \i = 1 to #2 by 1% + {\qr@for \j = 1 to #2 by 1% + {\xa\qr@createliteralmatrix@int\xa(\qr@literalmatrix@tokens)% + \qr@estoretomatrix{#1}{\the\i}{\the\j}{\qr@entrytext}% + }% + }% +} +\def\qr@createliteralmatrix@int(#1#2){% + \def\qr@entrytext{#1}% + \gdef\qr@literalmatrix@tokens{#2}% +} + + +\qr@createliteralmatrix{finderpattern}{8}{% + \qr@black@fixed\qr@black@fixed\qr@black@fixed\qr@black@fixed\qr@black@fixed\qr@black@fixed\qr@black@fixed\qr@white@fixed% + \qr@black@fixed\qr@white@fixed\qr@white@fixed\qr@white@fixed\qr@white@fixed\qr@white@fixed\qr@black@fixed\qr@white@fixed% + \qr@black@fixed\qr@white@fixed\qr@black@fixed\qr@black@fixed\qr@black@fixed\qr@white@fixed\qr@black@fixed\qr@white@fixed% + \qr@black@fixed\qr@white@fixed\qr@black@fixed\qr@black@fixed\qr@black@fixed\qr@white@fixed\qr@black@fixed\qr@white@fixed% + \qr@black@fixed\qr@white@fixed\qr@black@fixed\qr@black@fixed\qr@black@fixed\qr@white@fixed\qr@black@fixed\qr@white@fixed% + \qr@black@fixed\qr@white@fixed\qr@white@fixed\qr@white@fixed\qr@white@fixed\qr@white@fixed\qr@black@fixed\qr@white@fixed% + \qr@black@fixed\qr@black@fixed\qr@black@fixed\qr@black@fixed\qr@black@fixed\qr@black@fixed\qr@black@fixed\qr@white@fixed% + \qr@white@fixed\qr@white@fixed\qr@white@fixed\qr@white@fixed\qr@white@fixed\qr@white@fixed\qr@white@fixed\qr@white@fixed% +}% + +\qr@createliteralmatrix{alignmentpattern}{5}{% + \qr@black@fixed\qr@black@fixed\qr@black@fixed\qr@black@fixed\qr@black@fixed% + \qr@black@fixed\qr@white@fixed\qr@white@fixed\qr@white@fixed\qr@black@fixed% + \qr@black@fixed\qr@white@fixed\qr@black@fixed\qr@white@fixed\qr@black@fixed% + \qr@black@fixed\qr@white@fixed\qr@white@fixed\qr@white@fixed\qr@black@fixed% + \qr@black@fixed\qr@black@fixed\qr@black@fixed\qr@black@fixed\qr@black@fixed% +}% + + + + +\def\qr@copymatrixentry#1#2#3#4#5#6{% + % Copy the (#2,#3) entry of matrix #1 + % to the (#5,#6) position of matrix #4. + \xa\xa\xa\global% + \xa\xa\xa\let\xa\xa\csname #4@#5@#6\endcsname% + \csname #1@#2@#3\endcsname% +}% + +\def\qr@createduplicatematrix#1#2{% + % #1 = name of copy + % #2 = original matrix to be copied + \qr@creatematrix{#1}% + \qr@for \i = 1 to \qr@numberofrowsinmatrix{#2} by 1% + {\qr@for \j = 1 to \qr@numberofcolsinmatrix{#2} by 1% + {\qr@copymatrixentry{#2}{\the\i}{\the\j}{#1}{\the\i}{\the\j}% + }% + }% + \qr@setnumberofrows{#1}{\qr@numberofrowsinmatrix{#2}}% + \qr@setnumberofcols{#1}{\qr@numberofcolsinmatrix{#2}}% +}% + +\def\qr@placefinderpattern@int#1#2#3#4#5{% + % Work on matrix #1. + % Start in position (#2, #3) -- should be a corner + % #4 indicates horizontal direction (1=right, -1=left) + % #5 indicates vertical direction (1=down, -1=up) + % + % In this code, \sourcei and \sourcej are TeX counts working through the finderpattern matrix, + % and i and j are LaTeX counters indicating positions in the big matrix. + \setcounter{qr@i}{#2}% + \qr@for \sourcei=1 to 8 by 1% + {\setcounter{qr@j}{#3}% + \qr@for \sourcej=1 to 8 by 1% + {\qr@copymatrixentry{finderpattern}{\the\sourcei}{\the\sourcej}% + {#1}{\theqr@i}{\theqr@j}% + \addtocounter{qr@j}{#5}% + }% + \addtocounter{qr@i}{#4}% + }% +}% + +\def\qr@placefinderpatterns#1{% + % #1=matrix name + \qr@placefinderpattern@int{#1}{1}{1}{1}{1}% + \qr@placefinderpattern@int{#1}{\qr@numberofrowsinmatrix{#1}}{1}{-1}{1}% + \qr@placefinderpattern@int{#1}{1}{\qr@numberofcolsinmatrix{#1}}{1}{-1}% +}% + +\def\qr@placetimingpatterns#1{% + %Set \qr@endingcol to n-8. + \qr@a=\qr@size\relax% + \advance\qr@a by -8\relax% + \edef\qr@endingcol{\the\qr@a}% + \qr@for \j = 9 to \qr@endingcol by 1% + {\ifodd\j\relax% + \qr@storetomatrix{#1}{7}{\the\j}{\qr@black@fixed}% + \qr@storetomatrix{#1}{\the\j}{7}{\qr@black@fixed}% + \else% + \qr@storetomatrix{#1}{7}{\the\j}{\qr@white@fixed}% + \qr@storetomatrix{#1}{\the\j}{7}{\qr@white@fixed}% + \fi% + }% +}% + +\def\qr@placealignmentpattern@int#1#2#3{% + % Work on matrix #1. + % Write an alignment pattern into the matrix, centered on (#2,#3). + \qr@a=#2\relax% + \advance\qr@a by -2\relax% + \qr@b=#3\relax% + \advance\qr@b by -2\relax% + \setcounter{qr@i}{\the\qr@a}% + \qr@for \i=1 to 5 by 1% + {\setcounter{qr@j}{\the\qr@b}% + \qr@for \j=1 to 5 by 1% + {\qr@copymatrixentry{alignmentpattern}{\the\i}{\the\j}% + {#1}{\theqr@i}{\theqr@j}% + \stepcounter{qr@j}% + }% + \stepcounter{qr@i}% + }% +}% + +\newif\ifqr@incorner% +\def\qr@placealignmentpatterns#1{% + %There are k^2-3 alignment patterns, + %arranged in a (k x k) grid within the matrix. + %They begin in row 7, column 7, + %except that the ones in the NW, NE, and SW corners + %are omitted because of the finder patterns. + %Recall that + % * \qr@k stores k, + % * \qr@alignment@firstskip stores how far between the 1st and 2nd row/col, & + % * \qr@alignment@generalskip stores how far between each subsequent row/col. + \xa\ifnum\qr@k>0\relax + %There will be at least one alignment pattern. + %N.B. k cannot equal 1. + \xa\ifnum\qr@k=2\relax + % 2*2-3 = exactly 1 alignment pattern. + \qr@a=7\relax + \advance\qr@a by \qr@alignment@firstskip\relax + \xdef\qr@target@ii{\the\qr@a}% + \qr@placealignmentpattern@int{#1}{\qr@target@ii}{\qr@target@ii}% + \else + % k is at least 3, so the following loops should be safe. + \xdef\qr@target@ii{7}% + \qr@for \ii = 1 to \qr@k by 1% + {\ifcase\ii\relax% + \relax% \ii should never equal 0. + \or + \xdef\qr@target@ii{7}% If \ii = 1, we start in row 7. + \or + %If \ii = 2, we add the firstskip. + \qr@a=\qr@target@ii\relax% + \advance\qr@a by \qr@alignment@firstskip\relax% + \xdef\qr@target@ii{\the\qr@a}% + \else + %If \ii>2, we add the generalskip. + \qr@a=\qr@target@ii\relax% + \advance\qr@a by \qr@alignment@generalskip\relax% + \xdef\qr@target@ii{\the\qr@a}% + \fi + \qr@for \jj = 1 to \qr@k by 1% + {\ifcase\jj\relax% + \relax% \jj should never equal 0. + \or + \xdef\qr@target@jj{7}% If \jj=1, we start in row 7. + \or + %If \jj=2, we add the firstskip. + \qr@a=\qr@target@jj\relax% + \advance\qr@a by \qr@alignment@firstskip% + \xdef\qr@target@jj{\the\qr@a}% + \else + %If \jj>2, we add the generalskip. + \qr@a=\qr@target@jj\relax% + \advance\qr@a by \qr@alignment@generalskip% + \xdef\qr@target@jj{\the\qr@a}% + \fi + \qr@incornerfalse% + \ifnum\ii=1\relax + \ifnum\jj=1\relax + \qr@incornertrue + \else + \ifnum\qr@k=\jj\relax + \qr@incornertrue + \fi + \fi + \else + \xa\ifnum\qr@k=\ii\relax + \ifnum\jj=1\relax + \qr@incornertrue + \fi + \fi + \fi + \ifqr@incorner + \relax + \else + \qr@placealignmentpattern@int{#1}{\qr@target@ii}{\qr@target@jj}% + \fi + }% ends \qr@for \jj + }% ends \qr@for \ii + \fi + \fi +}% + +\def\qr@placedummyformatpatterns#1{% + \qr@for \j = 1 to 9 by 1% + {\ifnum\j=7\relax% + \else% + \qr@storetomatrix{#1}{9}{\the\j}{\qr@format@square}% + \qr@storetomatrix{#1}{\the\j}{9}{\qr@format@square}% + \fi% + }% + \setcounter{qr@j}{\qr@size}% + \qr@for \j = 1 to 8 by 1% + {\qr@storetomatrix{#1}{9}{\theqr@j}{\qr@format@square}% + \qr@storetomatrix{#1}{\theqr@j}{9}{\qr@format@square}% + \addtocounter{qr@j}{-1}% + }% + %Now go back and change the \qr@format@square in (n-8,9) to \qr@black@fixed. + \addtocounter{qr@j}{1}% + \qr@storetomatrix{#1}{\theqr@j}{9}{\qr@black@fixed}% +}% + +\def\qr@placedummyversionpatterns#1{% + \xa\ifnum\qr@version>6\relax + %Must include version information. + \global\c@qr@i=\qr@size% + \global\advance\c@qr@i by -10\relax% + \qr@for \i = 1 to 3 by 1% + {\qr@for \j = 1 to 6 by 1% + {\qr@storetomatrix{#1}{\theqr@i}{\the\j}{\qr@format@square}% + \qr@storetomatrix{#1}{\the\j}{\theqr@i}{\qr@format@square}% + }% + \stepcounter{qr@i}% + }% + \fi +}% + +\def\qr@writebit(#1#2)#3{% + % #3 = matrix name + % (qr@i,qr@j) = position to write in (LaTeX counters) + % #1 = bit to be written + % #2 = remaining bits plus '\relax' as an end-of-file marker + \edef\qr@datatowrite{#2}% + \ifnum#1=1 + \qr@storetomatrix{#3}{\theqr@i}{\theqr@j}{\qr@black}% + \else + \qr@storetomatrix{#3}{\theqr@i}{\theqr@j}{\qr@white}% + \fi +}% + +\newif\ifqr@rightcol +\newif\ifqr@goingup + +\def\qr@writedata@hex#1#2{% + % #1 = name of a matrix that has been prepared with finder patterns, timing patterns, etc. + % #2 = a string consisting of bytes to write into the matrix, in two-char hex format. + \setcounter{qr@i}{\qr@numberofrowsinmatrix{#1}}% + \setcounter{qr@j}{\qr@numberofcolsinmatrix{#1}}% + \qr@rightcoltrue% + \qr@goinguptrue% + \edef\qr@argument{{#1}(#2\relax\relax\relax)}% + \xa\qr@writedata@hex@recursive\qr@argument% +}% + +\def\qr@writedata@hex@recursive#1(#2#3#4){% + % #1 = name of a matrix that has been prepared with finder patterns, timing patterns, etc. + % (qr@i,qr@j) = position to write in LaTeX counters + % #2#3#4 contains the hex codes of the bytes to be written, plus \relax\relax\relax + % as an end-of-file marker + \edef\qr@testii{#2}% + \ifx\qr@testii\qr@relax% + % #2 is \relax, so there is nothing more to write. + \relax + \let\qr@next=\relax + \else + % #2 is not \relax, so there is another byte to write. + \qr@hextobinary[8]{\bytetowrite}{#2#3}% + \xdef\qr@datatowrite{\bytetowrite\relax}% %Add terminating "\relax" + \qr@writedata@recursive{#1}% %This function actually writes the 8 bits. + \edef\qr@argument{{#1}(#4)}% + \xa\def\xa\qr@next\xa{\xa\qr@writedata@hex@recursive\qr@argument}% %Call self to write the next bit. + \fi + \qr@next +}% + +\def\qr@writedata#1#2{% + % #1 = name of a matrix that has been prepared with finder patterns, timing patterns, etc. + % #2 = a string consisting of 0's and 1's to write into the matrix. + \setcounter{qr@i}{\qr@numberofrowsinmatrix{#1}}% + \setcounter{qr@j}{\qr@numberofcolsinmatrix{#1}}% + \qr@rightcoltrue + \qr@goinguptrue + \edef\qr@datatowrite{#2\relax}% + \qr@writedata@recursive{#1}% +}% + +\def\qr@@blank{\qr@blank}% + +\def\qr@writedata@recursive#1{% + % #1 = matrix name + % (qr@i,qr@j) = position to write in (LaTeX counters) + % \qr@datatowrite contains the bits to be written, plus '\relax' as an end-of-file marker + \xa\let\xa\squarevalue\csname #1@\theqr@i @\theqr@j\endcsname% + \ifx\squarevalue\qr@@blank + %Square is blank, so write data in it. + \xa\qr@writebit\xa(\qr@datatowrite){#1}% + %The \qr@writebit macro not only writes the first bit of \qr@datatowrite into the matrix, + %but also removes the bit from the 'bitstream' of \qr@datatowrite. + \fi + %Now adjust our position in the matrix. + \ifqr@rightcol + %From the right-hand half of the two-bit column, we always move left. Easy peasy. + \addtocounter{qr@j}{-1}% + \qr@rightcolfalse + \else + %If we're in the left-hand column, things are harder. + \ifqr@goingup + %First, suppose we're going upwards. + \ifnum\c@qr@i>1\relax% + %If we're not in the first row, things are easy. + %We move one to the right and one up. + \addtocounter{qr@j}{1}% + \addtocounter{qr@i}{-1}% + \qr@rightcoltrue + \else + %If we are in the first row, then we move to the left, + %and we are now in the right-hand column on a downward pass. + \addtocounter{qr@j}{-1}% + \qr@goingupfalse + \qr@rightcoltrue + \fi + \else + %Now, suppose we're going downwards. + \xa\ifnum\qr@size>\c@qr@i\relax% + %If we're not yet in the bottom row, things are easy. + %We move one to the right and one down. + \addtocounter{qr@j}{1}% + \addtocounter{qr@i}{1}% + \qr@rightcoltrue + \else + %If we are in the bottom row, then we move to the left, + %and we are now in the right-hand column on an upward pass. + \addtocounter{qr@j}{-1}% + \qr@rightcoltrue + \qr@goinguptrue + \fi + \fi + %One problem: what if we just moved into the 7th column? + %Das ist verboten. + %If we just moved (left) into the 7th column, we should move on into the 6th column. + \ifnum\c@qr@j=7\relax% + \setcounter{qr@j}{6}% + \fi + \fi + %Now check whether there are any more bits to write. + \ifx\qr@datatowrite\qr@relax + % \qr@datatowrite is just `\relax', so we're done. + \let\qr@next=\relax + \relax + \else + % Write some more! + \def\qr@next{\qr@writedata@recursive{#1}}% + \fi + \qr@next +}% + +\def\qr@writeremainderbits#1{% + % #1 = name of a matrix that has been prepared and partly filled. + % (qr@i,qr@j) = position to write in LaTeX counters + \xa\ifnum\qr@numremainderbits>0\relax + \def\qr@datatowrite{}% + \qr@for \i = 1 to \qr@numremainderbits by 1% + {\g@addto@macro{\qr@datatowrite}{0}}% + \g@addto@macro{\qr@datatowrite}{\relax}% terminator + \qr@writedata@recursive{#1}% + \fi +}% + +\newif\ifqr@cellinmask + +\def\qr@setmaskingfunction#1{% + % #1 = 1 decimal digit for the mask. (I see no reason to use the 3-bit binary code.) + % The current position is (\themaski,\themaskj), with indexing starting at 0. + \edef\qr@maskselection{#1}% + \xa\ifcase\qr@maskselection\relax + %Case 0: checkerboard + \def\qr@parsemaskingfunction{% + % Compute mod(\themaski+\themaskj,2)% + \qr@a=\c@maski% + \advance\qr@a by \c@maskj% + \qr@b=\qr@a% + \divide\qr@b by 2% + \multiply\qr@b by 2% + \advance\qr@a by -\qr@b% + \edef\qr@maskfunctionresult{\the\qr@a}% + }% + \or + %Case 1: horizontal stripes + \def\qr@parsemaskingfunction{% + % Compute mod(\themaski,2)% + \ifodd\c@maski\relax% + \def\qr@maskfunctionresult{1}% + \else% + \def\qr@maskfunctionresult{0}% + \fi% + }% + \or + %Case 2: vertical stripes + \def\qr@parsemaskingfunction{% + % Compute mod(\themaskj,3)% + \qr@a=\c@maskj% + \divide\qr@a by 3% + \multiply\qr@a by 3% + \advance\qr@a by -\c@maskj% + \edef\qr@maskfunctionresult{\the\qr@a}% + }% + \or + %Case 3: diagonal stripes + \def\qr@parsemaskingfunction{% + % Compute mod(\themaski+\themaskj,3)% + \qr@a=\c@maski% + \advance\qr@a by \c@maskj% + \qr@b=\qr@a% + \divide\qr@b by 3% + \multiply\qr@b by 3% + \advance\qr@b by -\qr@a% + \edef\qr@maskfunctionresult{\the\qr@b}% + }% + \or + %Case 4: wide checkerboard + \def\qr@parsemaskingfunction{% + % Compute mod(floor(\themaski/2) + floor(\themaskj/3),2) % + \qr@a=\c@maski% + \divide\qr@a by 2% + \qr@b=\c@maskj% + \divide\qr@b by 3% + \advance\qr@a by \qr@b% + \qr@b=\qr@a% + \divide\qr@a by 2% + \multiply\qr@a by 2% + \advance\qr@a by -\qr@b% + \edef\qr@maskfunctionresult{\the\qr@a}% + }% + \or + %Case 5: quilt + \def\qr@parsemaskingfunction{% + % Compute mod(\themaski*\themaskj,2) + mod(\themaski*\themaskj,3) % + \qr@a=\c@maski% + \multiply\qr@a by \c@maskj% + \qr@b=\qr@a% + \qr@c=\qr@a% + \divide\qr@a by 2% + \multiply\qr@a by 2% + \advance\qr@a by -\qr@c% (result will be -mod(i*j,2), which is negative.) + \divide\qr@b by 3% + \multiply\qr@b by 3% + \advance\qr@b by -\qr@c% (result will be -mod(i*j,3), which is negative.) + \advance\qr@a by \qr@b% (result is negative of what's in the spec.) + \edef\qr@maskfunctionresult{\the\qr@a}% + }% + \or + %Case 6: arrows + \def\qr@parsemaskingfunction{% + % Compute mod( mod(\themaski*\themaskj,2) + mod(\themaski*\themaskj,3) , 2 ) % + \qr@a=\c@maski% + \multiply\qr@a by \c@maskj% + \qr@b=\qr@a% + \qr@c=\qr@a% + \multiply\qr@c by 2% % \qr@c equals 2*i*j. + \divide\qr@a by 2% + \multiply\qr@a by 2% + \advance\qr@c by -\qr@a% Now \qr@c equals i*j + mod(i*j,2). + \divide\qr@b by 3% + \multiply\qr@b by 3% + \advance\qr@c by -\qr@b% (Now \qr@c equals mod(i*j,2) + mod(i*j,3). + \qr@a=\qr@c% + \divide\qr@a by 2% + \multiply\qr@a by 2% + \advance\qr@c by-\qr@a% + \edef\qr@maskfunctionresult{\the\qr@c}% + }% + \or + %Case 7: shotgun + \def\qr@parsemaskingfunction{% + % Compute mod( mod(\themaski+\themaskj,2) + mod(\themaski*\themaskj,3) , 2 ) % + \qr@a=\c@maski% + \advance\qr@a by \c@maskj% %So \qr@a = i+j + \qr@b=\c@maski% + \multiply\qr@b by \c@maskj% %So \qr@b = i*j + \qr@c=\qr@a% + \advance\qr@c by \qr@b% So \qr@c = i+j+i*j + \divide\qr@a by 2% + \multiply\qr@a by 2% + \advance\qr@c by -\qr@a% So \qr@c = mod(i+j,2) + i*j + \divide\qr@b by 3% + \multiply\qr@b by 3% + \advance\qr@c by -\qr@b% So \qr@c = mod(i+j,2) + mod(i*j,3) + \qr@a=\qr@c% + \divide\qr@c by 2% + \multiply\qr@c by 2% + \advance\qr@a by -\qr@c% + \edef\qr@maskfunctionresult{\the\qr@a}% + }% + \fi +}% + + +\def\qr@checkifcellisinmask{% + % The current position is (\i,\j), in TeX counts, + % but the LaTeX counters (maski,maskj) should contain + % the current position with indexing starting at 0. + % That is, maski = \i-1 and maskj = \j-1. + % + % \qr@parsemaskingfunction must have been set by a call to \qr@setmaskingfunction + \qr@parsemaskingfunction + \xa\ifnum\qr@maskfunctionresult=0\relax + \qr@cellinmasktrue + \else + \qr@cellinmaskfalse + \fi +}% + +\newcounter{maski}% +\newcounter{maskj}% + +\def\qr@applymask#1#2#3{% + % #1 = name of a matrix that should be filled out completely + % except for the format and/or version information. + % #2 = name of a new matrix to contain the masked version + % #3 = 1 decimal digit naming the mask + \qr@createduplicatematrix{#2}{#1}% + \qr@setmaskingfunction{#3}% + \setcounter{maski}{-1}% + \qr@for \i = 1 to \qr@size by 1% + {\stepcounter{maski}% + \setcounter{maskj}{-1}% + \qr@for \j = 1 to \qr@size by 1% + {\stepcounter{maskj}% + \qr@checkifcellisinmask + \ifqr@cellinmask + \qr@checkifcurrentcellcontainsdata{#2}% + \ifqr@currentcellcontainsdata + \qr@flipcurrentcell{#2}% + \fi + \fi + }% + }% +}% + +\newif\ifqr@currentcellcontainsdata +\qr@currentcellcontainsdatafalse + +\def\qr@@white{\qr@white}% +\def\qr@@black{\qr@black}% + +\def\qr@checkifcurrentcellcontainsdata#1{% + % #1 = name of matrix + \qr@currentcellcontainsdatafalse + \xa\ifx\csname #1@\the\i @\the\j\endcsname\qr@@white + \qr@currentcellcontainsdatatrue + \fi + \xa\ifx\csname #1@\the\i @\the\j\endcsname\qr@@black + \qr@currentcellcontainsdatatrue + \fi +}% + +\def\qr@flipped@black{\qr@black}% +\def\qr@flipped@white{\qr@white}% + +\def\qr@flipcurrentcell#1{% + % #1 = name of matrix + % (\i, \j) = current position, in TeX counts. + % This assumes the cell contains data, either black or white! + \xa\ifx\csname #1@\the\i @\the\j\endcsname\qr@@white + \qr@storetomatrix{#1}{\the\i}{\the\j}{\qr@flipped@black}% + \else + \qr@storetomatrix{#1}{\the\i}{\the\j}{\qr@flipped@white}% + \fi +}% + +\def\qr@chooseandapplybestmask#1{% + % #1 = name of a matrix that should be filled out completely + % except for the format and/or version information. + % This function applies all eight masks in succession, + % calculates their penalties, and remembers the best. + % The number indicating which mask was used is saved in \qr@mask@selected. + \qr@createduplicatematrix{originalmatrix}{#1}% + \message{^^J}% + \gdef\qr@currentbestmask{0}% + \qr@for \i = 1 to 7 by 1% + {\message{^^J}% + \xa\xa\xa\ifnum\xa\qr@penalty\xa<\qr@currentbestpenalty\relax + %We found a better mask. + \xdef\qr@currentbestmask{\the\i}% + \qr@createduplicatematrix{#1}{currentmasked}% + \xdef\qr@currentbestpenalty{\qr@penalty}% + \fi + }% + \xdef\qr@mask@selected{\qr@currentbestmask}% + \message{^^J}% +}% + + +\def\qr@Ni{3}% +\def\qr@Nii{3}% +\def\qr@Niii{40}% +\def\qr@Niv{10}% +\def\qr@fiveones{11111}% +\def\qr@fivezeros{11111}% +\def\qr@twoones{11}% +\def\qr@twozeros{00}% +\def\qr@finderA{00001011101}% +\def\qr@finderB{10111010000}% +\def\qr@finderB@three{1011101000}% +\def\qr@finderB@two{101110100}% +\def\qr@finderB@one{10111010}% +\def\qr@finderB@zero{1011101}% +\newif\ifqr@stringoffive +\def\qr@addpenaltyiii{% + \addtocounter{penaltyiii}{\qr@Niii}% +}% +\newcounter{totalones}% +\newcounter{penaltyi}% +\newcounter{penaltyii}% +\newcounter{penaltyiii}% +\newcounter{penaltyiv}% +\def\qr@evaluatemaskpenalty#1{% + % #1 = name of a matrix that we will test for the penalty + % according to the specs. + \setcounter{penaltyi}{0}% + \setcounter{penaltyii}{0}% + \setcounter{penaltyiii}{0}% + \setcounter{penaltyiv}{0}% + \bgroup%localize the meanings we give to the symbols + \def\qr@black{1}\def\qr@white{0}% + \def\qr@black@fixed{1}\def\qr@white@fixed{0}% + \def\qr@format@square{0}% This is not stated in the specs, but seems + % to be the standard implementation. + \def\qr@blank{0}% These would be any bits at the end. + % + \setcounter{totalones}{0}% + \qr@for \i=1 to \qr@size by 1% + {\def\qr@lastfive{z}% %The z is a dummy, that will be removed before any testing. + \qr@stringoffivefalse + \def\qr@lasttwo@thisrow{z}% %The z is a dummy. + \def\qr@lasttwo@nextrow{z}% %The z is a dummy. + \def\qr@lastnine{z0000}% %The 0000 stands for the white space to the left. The z is a dummy. + \def\qr@ignore@finderB@at{0}% + \qr@for \j=1 to \qr@size by 1% + {\edef\qr@newbit{\qr@matrixentry{#1}{\the\i}{\the\j}}% + % + % LASTFIVE CODE FOR PENALTY 1 + % First, add the new bit to the end. + \xa\g@addto@macro\xa\qr@lastfive\xa{\qr@newbit}% + \ifnum\j<5\relax% + %Not yet on the 5th entry. + %Don't do any testing. + \else + % 5th entry or later. + % Remove the old one, and then test. + \qr@removefirsttoken\qr@lastfive% + \ifx\qr@lastfive\qr@fiveones% + \ifqr@stringoffive% + %This is a continuation of a previous block of five or more 1's. + \stepcounter{penaltyi}% + \else + %This is a new string of five 1's. + \addtocounter{penaltyi}{\qr@Ni}% + \global\qr@stringoffivetrue + \fi + \else + \ifx\qr@lastfive\qr@fivezeros% + \ifqr@stringoffive + %This is a continuation of a previous block of five or more 0's. + \stepcounter{penaltyi}% + \else + %This is a new string of five 0's. + \addtocounter{penaltyi}{\qr@Ni}% + \global\qr@stringoffivetrue + \fi + \else + %This is not a string of five 1's or five 0's. + \global\qr@stringoffivefalse + \fi + \fi + \fi + % + % 2x2 BLOCKS FOR PENALTY 2 + % Every 2x2 block of all 1's counts for \qr@Nii penalty points. + % We do not need to run this test in the last row. + \xa\ifnum\xa\i\xa<\qr@size\relax + \xa\g@addto@macro\xa\qr@lasttwo@thisrow\xa{\qr@newbit}% + %Compute \qr@iplusone + \qr@a=\i\relax% + \advance\qr@a by 1% + \edef\qr@iplusone{\the\qr@a}% + % + \edef\qr@nextrowbit{\qr@matrixentry{#1}{\qr@iplusone}{\the\j}}% + \xa\g@addto@macro\xa\qr@lasttwo@nextrow\xa{\qr@nextrowbit}% + \ifnum\j<2\relax% + %Still in the first column; no check. + \else + %Second column or later. Remove the old bits, and then test. + \qr@removefirsttoken\qr@lasttwo@thisrow + \qr@removefirsttoken\qr@lasttwo@nextrow + \ifx\qr@lasttwo@thisrow\qr@twoones + \ifx\qr@lasttwo@nextrow\qr@twoones + \addtocounter{penaltyii}{\qr@Nii}% + \fi + \else + \ifx\qr@lasttwo@thisrow\qr@twozeros + \ifx\qr@lasttwo@nextrow\qr@twozeros + \addtocounter{penaltyii}{\qr@Nii}% + \fi + \fi + \fi + \fi + \fi + % + % LASTNINE CODE FOR PENALTY 3 + % First, add the new bit to the end. + \xa\g@addto@macro\xa\qr@lastnine\xa{\qr@newbit}% + \ifnum\j<7\relax% + %Not yet on the 7th entry. + %Don't do any testing. + \else + % 7th entry or later. + % Remove the old one, and then test. + \qr@removefirsttoken\qr@lastnine + \xa\ifnum\qr@size=\j\relax% + % Last column. Any of the following should count: + % 1011101 (\qr@finderB@zero) + % 10111010 (\qr@finderB@one) + % 101110100 (\qr@finderB@two) + % 1011101000 (\qr@finderB@three) + % 10111010000 (\qr@finderB) + \ifx\qr@lastnine\qr@finderB + \qr@addpenaltyiii + \else + \qr@removefirsttoken\qr@lastnine + \ifx\qr@lastnine\qr@finderB@three + \qr@addpenaltyiii + \else + \qr@removefirsttoken\qr@lastnine + \ifx\qr@lastnine\qr@finderB@two + \qr@addpenaltyiii + \else + \qr@removefirsttoken\qr@lastnine + \ifx\qr@lastnine\qr@finderB@one + \qr@addpenaltyiii + \else + \qr@removefirsttoken\qr@lastnine + \ifx\qr@lastnine\qr@finderB@zero + \qr@addpenaltyiii + \fi + \fi + \fi + \fi + \fi + \else + \ifx\qr@lastnine\qr@finderA% %Matches 0000 1011101 + \qr@addpenaltyiii + %Also, we record our discovery, so that we can't count this pattern again + %if it shows up four columns later as 1011101 0000. + % + %Set \qr@ignore@finderB@at to \j+4. + \qr@a=\j\relax% + \advance\qr@a by 4% + \xdef\qr@ignore@finderB@at{\the\qr@a}% + \else + \ifx\qr@lastfive\qr@finderB% %Matches 1011101 0000. + \xa\ifnum\qr@ignore@finderB@at=\j\relax + %This pattern was *not* counted already earlier. + \qr@addpenaltyiii + \fi + \fi + \fi + \fi + \fi + % + %COUNT 1's FOR PENALTY 4 + \xa\ifnum\qr@newbit=1\relax% + \stepcounter{totalones}% + \fi + }% end of j-loop + }% end of i-loop + % + %NOW WE ALSO NEED TO RUN DOWN THE COLUMNS TO FINISH CALCULATING PENALTIES 1 AND 3. + \qr@for \j=1 to \qr@size by 1% + {\def\qr@lastfive{z}% %The z is a dummy, that will be removed before any testing. + \qr@stringoffivefalse + \def\qr@lastnine{z0000}% %The 0000 stands for the white space to the left. The z is a dummy. + \def\qr@ignore@finderB@at{0}% + \qr@for \i=1 to \qr@size by 1% + {\edef\qr@newbit{\qr@matrixentry{#1}{\the\i}{\the\j}}% + % + % LASTFIVE CODE FOR PENALTY 1 + % First, add the new bit to the end. + \xa\g@addto@macro\xa\qr@lastfive\xa{\qr@newbit}% + \ifnum\i<5\relax% + %Not yet on the 5th entry. + %Don't do any testing. + \else + % 5th entry or later. + % Remove the old one, and then test. + \qr@removefirsttoken\qr@lastfive% + \ifx\qr@lastfive\qr@fiveones% + \ifqr@stringoffive% + %This is a continuation of a previous block of five or more 1's. + \stepcounter{penaltyi}% + \else + %This is a new string of five 1's. + \addtocounter{penaltyi}{\qr@Ni}% + \global\qr@stringoffivetrue + \fi + \else + \ifx\qr@lastfive\qr@fivezeros% + \ifqr@stringoffive + %This is a continuation of a previous block of five or more 0's. + \stepcounter{penaltyi}% + \else + %This is a new string of five 0's. + \addtocounter{penaltyi}{\qr@Ni}% + \global\qr@stringoffivetrue + \fi + \else + %This is not a string of five 1's or five 0's. + \global\qr@stringoffivefalse + \fi + \fi + \fi + % + % HAPPILY, WE DON'T NEED TO CALCULATE PENALTY 2 AGAIN. + % + % LASTNINE CODE FOR PENALTY 3 + % First, add the new bit to the end. + \xa\g@addto@macro\xa\qr@lastnine\xa{\qr@newbit}% + \ifnum\i<7\relax% + %Not yet on the 7th entry. + %Don't do any testing. + \else + % 7th entry or later. + % Remove the old one, and then test. + \qr@removefirsttoken\qr@lastnine + \xa\ifnum\qr@size=\i\relax% + % Last column. Any of the following should count: + % 1011101 (\qr@finderB@zero) + % 10111010 (\qr@finderB@one) + % 101110100 (\qr@finderB@two) + % 1011101000 (\qr@finderB@three) + % 10111010000 (\qr@finderB) + \ifx\qr@lastnine\qr@finderB + \qr@addpenaltyiii + \else + \qr@removefirsttoken\qr@lastnine + \ifx\qr@lastnine\qr@finderB@three + \qr@addpenaltyiii + \else + \qr@removefirsttoken\qr@lastnine + \ifx\qr@lastnine\qr@finderB@two + \qr@addpenaltyiii + \else + \qr@removefirsttoken\qr@lastnine + \ifx\qr@lastnine\qr@finderB@one + \qr@addpenaltyiii + \else + \qr@removefirsttoken\qr@lastnine + \ifx\qr@lastnine\qr@finderB@zero + \qr@addpenaltyiii + \fi + \fi + \fi + \fi + \fi + \else + \ifx\qr@lastnine\qr@finderA% %Matches 0000 1011101 + \qr@addpenaltyiii + %Also, we record our discovery, so that we can't count this pattern again + %if it shows up four columns later as 1011101 0000. + % + %Set \qr@ignore@finderB@at to \i+4. + \qr@a=\i\relax% + \advance\qr@a by 4% + \xdef\qr@ignore@finderB@at{\the\qr@a}% + \else + \ifx\qr@lastfive\qr@finderB% %Matches 1011101 0000. + \xa\ifnum\qr@ignore@finderB@at=\i\relax + %This pattern was *not* counted already earlier. + \qr@addpenaltyiii + \fi + \fi + \fi + \fi + \fi + % + }% end of i-loop + }% end of j-loop + \egroup% + % + %CALCULATE PENALTY 4 + %According to the spec, penalty #4 is computed as + % floor( |(i/n^2)-0.5|/0.05 ) + % where i is the total number of 1's in the matrix. + % This is equal to abs(20*i-10n^2) div n^2. + % + \qr@a=\c@totalones\relax + \multiply\qr@a by 20\relax + \qr@b=\qr@size\relax + \multiply\qr@b by \qr@size\relax + \qr@c=10\relax + \multiply\qr@c by \qr@b\relax + \advance\qr@a by -\qr@c\relax + \ifnum\qr@a<0\relax + \multiply\qr@a by -1\relax + \fi + \divide\qr@a by \qr@b\relax + \setcounter{penaltyiv}{\the\qr@a}% + % + %CALCULATE TOTAL PENALTY + \qr@a=\thepenaltyi\relax% + \advance\qr@a by \thepenaltyii\relax% + \advance\qr@a by \thepenaltyiii\relax% + \advance\qr@a by \thepenaltyiv\relax% + \edef\qr@penalty{\the\qr@a}% +}% + +\def\qr@removefirsttoken#1{% + %Removes the first token from the macro named in #1. + \edef\qr@argument{(#1)}% + \xa\qr@removefirsttoken@int\qr@argument% + \xdef#1{\qr@removefirsttoken@result}% +}% +\def\qr@removefirsttoken@int(#1#2){% + \def\qr@removefirsttoken@result{#2}% +}% + +\def\qr@writeformatstring#1#2{% + % #1 = matrix name + % #2 = binary string representing the encoded and masked format information + \setcounter{qr@i}{9}% + \setcounter{qr@j}{1}% + \edef\qr@argument{{#1}(#2\relax)}% + \xa\qr@writeformatA@recursive\qr@argument + % + \setcounter{qr@i}{\qr@numberofrowsinmatrix{#1}}% + \setcounter{qr@j}{9}% + \xa\qr@writeformatB@recursive\qr@argument +}% + +\def\qr@writeformatA@recursive#1(#2#3){% + % #1 = matrix name + % #2 = first bit of string + % #3 = rest of bitstream + % (qr@i,qr@j) = current (valid) position to write (in LaTeX counters) + \ifnum#2=1\relax + \qr@storetomatrix{#1}{\theqr@i}{\theqr@j}{\qr@black@format}% + \else + \qr@storetomatrix{#1}{\theqr@i}{\theqr@j}{\qr@white@format}% + \fi + % Now the tricky part--moving \i and \j to their next positions. + \ifnum\c@qr@j<9\relax + %If we're not yet in column 9, move right. + \stepcounter{qr@j}% + \ifnum\c@qr@j=7\relax + %But we skip column 7! + \stepcounter{qr@j}% + \fi + \else + %If we're in column 9, we move up. + \addtocounter{qr@i}{-1}% + \ifnum\c@qr@i=7\relax + %But we skip row 7! + \addtocounter{qr@i}{-1}% + \fi + \fi + %N.B. that at the end of time, this will leave us at invalid position (0,9). + %That makes for an easy test to know when we are done. + \ifnum\c@qr@i<1 + \let\qr@next=\relax + \else + \def\qr@next{\qr@writeformatA@recursive{#1}(#3)}% + \fi + \qr@next +}% + +\def\qr@writeformatB@recursive#1(#2#3){% + % #1 = matrix name + % #2 = first bit of string + % #3 = rest of bitstream + % (qr@i,qr@j) = current (valid) position to write (in LaTeX counters) + \ifnum#2=1\relax + \qr@storetomatrix{#1}{\theqr@i}{\theqr@j}{\qr@black@format}% + \else + \qr@storetomatrix{#1}{\theqr@i}{\theqr@j}{\qr@white@format}% + \fi + % Now the tricky part--moving counters i and j to their next positions. + \qr@a=\qr@size% + \advance\qr@a by -6\relax% + \ifnum\qr@a<\c@qr@i\relax + %If we're not yet in row n-6, move up. + \addtocounter{qr@i}{-1}% + \else + \ifnum\qr@a=\c@qr@i\relax + %If we're actually in row n-6, we jump to position (9,n-7). + \setcounter{qr@i}{9}% + %Set counter j equal to \qr@size-7. + \global\c@qr@j=\qr@size\relax% + \global\advance\c@qr@j by -7\relax% + \else + %Otherwise, we must be in row 9. + %In this case, we move right. + \stepcounter{qr@j}% + \fi + \fi + %N.B. that at the end of time, this will leave us at invalid position (9,n+1). + %That makes for an easy test to know when we are done. + \xa\ifnum\qr@size<\c@qr@j\relax + \let\qr@next=\relax + \else + \def\qr@next{\qr@writeformatB@recursive{#1}(#3)}% + \fi + \qr@next +}% + +\def\qr@writeversionstring#1#2{% + % #1 = matrix name + % #2 = binary string representing the encoded version information + % + % Plot the encoded version string into the matrix. + % This is only done for versions 7 and higher. + \xa\ifnum\qr@version>6\relax + %Move to position (n-8,6). + \setcounter{qr@i}{\qr@size}\relax% + \addtocounter{qr@i}{-8}\relax% + \setcounter{qr@j}{6}% + \edef\qr@argument{{#1}(#2\relax)}% + \xa\qr@writeversion@recursive\qr@argument + \fi +}% + +\def\qr@writeversion@recursive#1(#2#3){% + % #1 = matrix name + % #2 = first bit of string + % #3 = rest of bitstream + % (qr@i,qr@j) = current (valid) position to write (in LaTeX counters) + % + % The version information is stored symmetrically in the matrix + % In two transposed regions, so we can write both at the same time. + % In the comments, we describe what happens in the lower-left region, + % not the upper-right. + % + %Set \qr@topline equal to n-10. + \qr@a=\qr@size\relax% + \advance\qr@a by -10\relax% + \edef\qr@topline{\the\qr@a}% + % + \ifnum#2=1\relax + \qr@storetomatrix{#1}{\theqr@i}{\theqr@j}{\qr@black@format}% + \qr@storetomatrix{#1}{\theqr@j}{\theqr@i}{\qr@black@format}% + \else + \qr@storetomatrix{#1}{\theqr@i}{\theqr@j}{\qr@white@format}% + \qr@storetomatrix{#1}{\theqr@j}{\theqr@i}{\qr@white@format}% + \fi + % Now the tricky part--moving counters i and j to their next positions. + \addtocounter{qr@i}{-1}% + \xa\ifnum\qr@topline>\c@qr@i\relax + %We've overshot the top of the region. + %We need to move left one column and down three. + \addtocounter{qr@j}{-1}% + \addtocounter{qr@i}{3}% + \fi + %N.B. that at the end of time, this will leave us at invalid position (n-8,0). + %That makes for an easy test to know when we are done. + \ifnum\c@qr@j<1\relax + \let\qr@next=\relax + \else + \def\qr@next{\qr@writeversion@recursive{#1}(#3)}% + \fi + \qr@next +}% +% \end{macrocode} +% +% \subsection{Encoding and error correction} +% \begin{macrocode} +\newcounter{qr@hexchars}% + +\def\qr@string@binarytohex#1{% + \qr@binarytohex{\qr@hex@result}{#1}% +}% + +\def\qr@encode@binary#1{% + % #1 = string of ascii characters, to be converted into bitstream + % + % We do this one entirely in hex, rather than binary, because we can. + \edef\qr@plaintext{#1}% + % + %First, the mode indicator. + \def\qr@codetext{4}% %This means `binary' + % + %Next, the character count. + \qr@getstringlength{\qr@plaintext}% + %Set \qr@charactercountlengthinhex to \qr@charactercountbits@byte/4% + \qr@a=\qr@charactercountbits@byte\relax% + \divide \qr@a by 4\relax% + \edef\qr@charactercountlengthinhex{\the\qr@a}% + \qr@decimaltohex[\qr@charactercountlengthinhex]{\qr@charactercount}{\qr@stringlength}% + \xa\g@addto@macro\xa\qr@codetext\xa{\qr@charactercount}% + % + %Now comes the actual data. + \edef\qr@argument{(,\qr@plaintext\relax\relax\relax)}% + \xa\qr@encode@ascii@recursive\qr@argument% + % + %Now the terminator. + \g@addto@macro\qr@codetext{0}% %This is '0000' in binary. + % + %There is no need to pad bits to make a multiple of 8, + %because the data length is already 4 + 8 + 8n + 4. + % + %Now add padding codewords if needed. + \setcounter{qr@hexchars}{0}% + \qr@getstringlength{\qr@codetext}% + \setcounter{qr@hexchars}{\qr@stringlength}% + %Set \qr@numpaddingcodewords equal to \qr@totaldatacodewords - qr@hexchars/2. + \qr@a=-\c@qr@hexchars\relax + \divide\qr@a by 2\relax + \advance\qr@a by \qr@totaldatacodewords\relax + \edef\qr@numpaddingcodewords{\the\qr@a}% + % + \xa\ifnum\qr@numpaddingcodewords<0% + \edef\ds{ERROR: Too much data! Over by \qr@numpaddingcodewords bytes.}\show\ds% + \fi% + \xa\ifnum\qr@numpaddingcodewords>0% + \qr@for \i = 2 to \qr@numpaddingcodewords by 2% + {\g@addto@macro{\qr@codetext}{ec11}}% + \xa\ifodd\qr@numpaddingcodewords\relax% + \g@addto@macro{\qr@codetext}{ec}% + \fi% + \fi% +}% + +\def\qr@encode@ascii@recursive(#1,#2#3){% + % #1 = hex codes translated so far + % #2 = next plaintext character to translate + % #3 = remainder of plaintext + \edef\qr@testii{#2}% + \ifx\qr@testii\qr@relax% + % All done! + \g@addto@macro\qr@codetext{#1}% + \else% + % Another character to translate. + \edef\qr@asciicode{\number`#2}% + \qr@decimaltohex[2]{\qr@newhexcodes}{\qr@asciicode}% + \edef\qr@argument{(#1\qr@newhexcodes,#3)}% + %\show\qr@argument + \xa\qr@encode@ascii@recursive\qr@argument% + \fi% +}% + +\def\qr@splitcodetextintoblocks{% + \setcounter{qr@i}{0}% + \qr@for \j = 1 to \qr@numshortblocks by 1% + {\stepcounter{qr@i}% + \qr@splitoffblock{\qr@codetext}{\theqr@i}{\qr@shortblock@size}% + }% + \xa\ifnum\qr@numlongblocks>0\relax% + \qr@for \j = 1 to \qr@numlongblocks by 1% + {\stepcounter{qr@i}% + \qr@splitoffblock{\qr@codetext}{\theqr@i}{\qr@longblock@size}% + }% + \fi% +}% + +\def\qr@splitoffblock#1#2#3{% + % #1 = current codetext in hexadecimal + % #2 = number to use in csname "\datablock@#2". + % #3 = number of bytes to split off + \message{}% + \xa\gdef\csname datablock@#2\endcsname{}% %This line is important! + \qr@for \i = 1 to #3 by 1% + {\edef\qr@argument{{#2}(#1)}% + \xa\qr@splitoffblock@int\qr@argument% + }% +}% + +\def\qr@splitoffblock@int#1(#2#3#4){% + % #1 = number to use in csname "\datablock@#1". + % #2#3 = next byte to split off + % #4 = remaining text + % + % We add the next byte to "\datablock@#1", + % and we remove it from the codetext. + \xa\xdef\csname datablock@#1\endcsname{\csname datablock@#1\endcsname#2#3}% + \xdef\qr@codetext{#4}% +}% + +\def\qr@createerrorblocks{% + \qr@for \ii = 1 to \qr@numblocks by 1% + {\message{}% + \FX@generate@errorbytes{\csname datablock@\the\ii\endcsname}{\qr@num@eccodewords}% + \xa\xdef\csname errorblock@\the\ii\endcsname{\FX@errorbytes}% + }% +}% + +\def\qr@interleave{% + \setcounter{qr@i}{0}% + \def\qr@interleaved@text{}% + \message{0\relax% + \message{\qr@longblock@size.>}% + \else + \message{.>}% + \fi + \message{}% +}% + +\def\qr@writefromblock#1#2{% + % #1 = either 'datablock' or 'errorblock' + % #2 = block number, in {1,...,\qr@numblocks}% + \edef\qr@argument{(\csname #1@#2\endcsname\relax\relax\relax)}% + \xa\qr@writefromblock@int\qr@argument + \xa\xdef\csname #1@#2\endcsname{\qr@writefromblock@remainder}% +}% + +\def\qr@writefromblock@int(#1#2#3){% + % #1#2 = first byte (in hex) of text, which will be written to \qr@interleaved@text + % #3 = remainder, including \relax\relax\relax terminator. + \g@addto@macro{\qr@interleaved@text}{#1#2}% + \qr@writefromblock@intint(#3)% +}% + +\def\qr@writefromblock@intint(#1\relax\relax\relax){% + \xdef\qr@writefromblock@remainder{#1}% +}% +% \end{macrocode} +% +% \subsection{Encoding format and version information} +% \begin{macrocode} +\let\xa=\expandafter +\makeatletter + +\def\qr@preface@macro#1#2{% + % #1 = macro name + % #2 = text to add to front of macro + \def\qr@tempb{#2}% + \xa\xa\xa\gdef\xa\xa\xa#1\xa\xa\xa{\xa\qr@tempb #1}% +}% + +\newif\ifqr@leadingcoeff +\def\qr@testleadingcoeff(#1#2){% + % Tests whether the leading digit of #1#2 is 1. + \ifnum#1=1\relax + \qr@leadingcoefftrue + \else + \qr@leadingcoefffalse + \fi +}% + +\def\qr@polynomialdivide#1#2{% + \edef\qr@numerator{#1}% + \edef\qr@denominator{#2}% + \qr@divisiondonefalse% + \xa\xa\xa\qr@oneroundofdivision\xa\xa\xa{\xa\qr@numerator\xa}\xa{\qr@denominator}% +}% + +\def\@qr@empty{}% +\def\qr@oneroundofdivision#1#2{% + % #1 = f(x), of degree n + % #2 = g(x), of degree m + % Obtains a new polynomial h(x), congruent to f(x) modulo g(x), + % but of degree at most n-1. + % + % If leading coefficient of f(x) is 1, subtracts off g(x) * x^(n-m). + % If leading coefficient of f(x) is 0, strips off that leading zero. + % + \qr@testleadingcoeff(#1)% + \ifqr@leadingcoeff + \qr@xorbitstrings{#1}{#2}% + \ifqr@xorfailed + %If xor failed, that means our #1 was already the remainder! + \qr@divisiondonetrue + \edef\qr@theremainder{#1}% + \else + %xor succeeded. We need to recurse. + \xa\xa\xa\edef\xa\xa\xa\qr@numerator\xa\xa\xa{\xa\qr@stripleadingzero\xa(\qr@xorresult)}% + \fi + \else + \xa\def\xa\qr@numerator\xa{\qr@stripleadingzero(#1)}% + \ifx\qr@numerator\@qr@empty + \qr@divisiondonetrue + \def\qr@theremainder{0}% + \fi + \fi + \ifqr@divisiondone + \relax + \else + \xa\qr@oneroundofdivision\xa{\qr@numerator}{#2}% + \fi +}% + +\def\qr@stripleadingzero(0#1){#1}%Strips off a leading zero. + +\newif\ifqr@xorfailed% This flag will trigger when #2 is longer than #1. + +\def\qr@xorbitstrings#1#2{% + % #1 = bitstring + % #2 = bitstring no longer than #1 + \qr@xorfailedfalse + \edef\qr@argument{(,#1\relax\relax)(#2\relax\relax)}% + \xa\qr@xorbitstrings@recursive\qr@argument + %\qr@xorbitstrings@recursive(,#1\relax\relax)(#2\relax\relax)% +}% + +\def\qr@xorbitstrings@recursive(#1,#2#3)(#4#5){% + % #1#2#3 is the first bitstring, xor'ed up through #1. + % #4#5 is the remaining portion of the second bitstring. + \def\qr@testii{#2}% + \def\qr@testiv{#4}% + \ifx\qr@testii\qr@relax + % #1 contains the whole string. + % Now if #4 is also \relax, that means the two strings started off with equal lengths. + % If, however, #4 is not \relax, that means the second string was longer than the first, a problem. + \ifx\qr@testiv\qr@relax + %No problem. We are done. + \qr@xorbit@saveresult(#1#2#3)% + \else + %Problem! The second string was longer than the first. + \qr@xorfailedtrue + \def\qr@xorresult{}% + \fi + \else + % There is still a bit to manipulate in #2. + % Check whether #4 contains anything. + \ifx\qr@testiv\qr@relax + % No, #4 is empty. We are done. "#2#3" contains the remainder of the first string, + % which we append untouched and then strip off the two \relax-es. + \qr@xorbit@saveresult(#1#2#3)% + \else + % Yes, #4 still has something to XOR. Do the task. + \ifnum#2=#4\relax + \qr@xorbitstrings@recursive(#1% + 0,#3)(#5)% + \else + \qr@xorbitstrings@recursive(#1% + 1,#3)(#5)% + \fi + \fi + \fi +}% + +\def\qr@xorbit@saveresult(#1\relax\relax){% + %Strips off the extra '\relax'es at the end. + \def\qr@xorresult{#1}% +}% + +\newif\ifqr@divisiondone + +\def\qr@BCHcode#1{% + \edef\qr@formatinfo{#1}% + \def\qr@formatinfopadded{\qr@formatinfo 0000000000}% + \def\qr@divisor{10100110111}% + \qr@divisiondonefalse + \qr@polynomialdivide{\qr@formatinfopadded}{\qr@divisor}% + % + \qr@getstringlength{\qr@theremainder}% + %Run loop from stringlength+1 to 10. + \qr@a=\qr@stringlength\relax% + \advance\qr@a by 1\relax% + \qr@for \i = \qr@a to 10 by 1% + {\qr@preface@macro{\qr@theremainder}{0}% + \xdef\qr@theremainder{\qr@theremainder}% + }% + \edef\qr@BCHresult{\qr@formatinfo\qr@theremainder}% +}% + +\def\qr@formatmask{101010000010010}% + +\def\qr@encodeandmaskformat#1{% + \qr@BCHcode{#1}% + \qr@xorbitstrings{\qr@BCHresult}{\qr@formatmask}% + \edef\qr@format@bitstring{\qr@xorresult}% +}% + +\def\qr@Golaycode#1{% + % #1 = 6-bit version number + \edef\qr@versioninfo{#1}% + \def\qr@versioninfopadded{\qr@versioninfo 000000000000}% %Append 12 zeros. + \def\qr@divisor{1111100100101}% + \qr@divisiondonefalse + \qr@polynomialdivide{\qr@versioninfopadded}{\qr@divisor}% + % + \qr@getstringlength{\qr@theremainder}% + %Run loop from stringlength+1 to 12. + \qr@a=\qr@stringlength\relax% + \advance\qr@a by 1\relax% + \qr@for \i = \qr@a to 12 by 1% + {\qr@preface@macro{\qr@theremainder}{0}% + \xdef\qr@theremainder{\qr@theremainder}% + }% + \edef\qr@Golayresult{\qr@versioninfo\qr@theremainder}% +}% +% \end{macrocode} +% +% \subsection{Error correction} +% The error-correction code is defined over $\F_{256}=GF(256)$, +% the finite field of order $256$. +% The QR specification encodes this field as $\F_2[X]/(X^8+X^4+X^3+X^2+1)$; +% in other words, each field element is an 8-bit binary string representing +% an integer between 0 and 255. +% +% We represent these 8-bit strings as two hexadecimal characters; +% for example, {\tt 5a} represents {\tt 01011010}. +% Because addition is done by xor-ing the bitstrings, +% we can define addition on hexadecimal characters. +% Since there are only $16^2$ possibilities, +% we create a lookup table. +% \begin{macrocode} +\def\F@result{}% + +\def\qr@xorbitstring#1#2#3{% + % #1 = new macro to receive result + % #2, #3 = bitstrings to xor. The second can be shorter than the first. + \def\qr@xor@result{}% + \edef\qr@argument{(#2\relax\relax)(#3\relax\relax)}% + \xa\qr@xorbitstring@recursive\qr@argument% + \edef#1{\qr@xor@result}% +}% +\def\qr@xorbitstring@recursive(#1#2)(#3#4){% + \edef\qr@testi{#1}% + \ifx\qr@testi\qr@relax% + %Done. + \let\qr@next=\relax% + \else + \if#1#3\relax + \g@addto@macro{\qr@xor@result}{0}% + \else + \g@addto@macro{\qr@xor@result}{1}% + \fi + \edef\qr@next{\noexpand\qr@xorbitstring@recursive(#2)(#4)}% + \fi + \qr@next +} + +\def\F@addchar@raw#1#2{% + %Add two hexadecimal digits using bitwise xor + \qr@hextobinary[4]{\qr@summandA}{#1}% + \qr@hextobinary[4]{\qr@summandB}{#2}% + \qr@xorbitstring{\F@result}{\qr@summandA}{\qr@summandB}% + \qr@binarytohex[1]{\F@result}{\F@result}% +}% + +\def\qr@canceltwos#1{% + \edef\qr@argument{(#1\relax\relax)}% + \xa\qr@canceltwos@int\qr@argument% +}% + +\def\qr@canceltwos@int(#1#2){% + \xa\qr@canceltwos@recursion(,#1#2)% +}% + +\def\qr@canceltwos@recursion(#1,#2#3){% + \def\qr@testii{#2}% + \ifx\qr@testii\qr@relax + %Cancelling complete. + \qr@striptworelaxes(#1#2#3)% + %Now \F@result contains the answer. + \else + \relax + \ifnum#2=2\relax + \qr@canceltwos@recursion(#10,#3)% + \else + \qr@canceltwos@recursion(#1#2,#3)% + \fi + \fi +}% + +\def\qr@striptworelaxes(#1\relax\relax){% + \gdef\F@result{#1}% +}% + +\qr@for \i = 0 to 15 by 1% + {\qr@decimaltohex[1]{\qr@tempa}{\the\i}% + \qr@for \j = 0 to 15 by 1% + {\qr@decimaltohex[1]{\qr@tempb}{\the\j}% + \F@addchar@raw\qr@tempa\qr@tempb + \xa\xdef\csname F@addchar@\qr@tempa\qr@tempb\endcsname{\F@result}% + }% + }% + +\def\F@addchar#1#2{% + \xa\def\xa\F@result\xa{\csname F@addchar@#1#2\endcsname}% +}% + +\def\F@addstrings#1#2{% + \edef\qr@argument{(,#1\relax\relax)(#2\relax\relax)}% + \xa\F@addstrings@recursion\qr@argument% +}% + +\def\F@addstrings@recursion(#1,#2#3)(#4#5){% + %Adds two hexadecimal strings, bitwise, from left to right. + %The second string is allowed to be shorter than the first. + \def\qr@testii{#2}% + \def\qr@testiv{#4}% + \ifx\qr@testii\qr@relax + %The entire string has been processed. + \gdef\F@result{#1}% + \else + \ifx\qr@testiv\qr@relax + %The second string is over. + \qr@striptworelaxes(#1#2#3)% + %Now \F@result contains the answer. + \else + %We continue to add. + \F@addchar{#2}{#4}% + \edef\qr@argument{(#1\F@result,#3)(#5)}% + \xa\F@addstrings@recursion\qr@argument% + \fi + \fi +}% +% \end{macrocode} +% Now we handle multiplication. +% Our approach to multiplying $a,b\in\F_{256}$ +% is to take discrete logarithms (with 2 as our base), +% add the logarithms, and then take the antilog. +% We first create a log table. +% \begin{macrocode} +\gdef\F@stripleadingzero(0#1){\edef\F@result{#1}}% + +\setcounter{qr@i}{0}% +\def\qr@poweroftwo{1}% +\qr@for \i = 1 to 254 by 1% + {\stepcounter{qr@i}% + \qr@a=\qr@poweroftwo\relax + \multiply\qr@a by 2\relax + \edef\qr@poweroftwo{\the\qr@a}% + %\show\qr@poweroftwo + \qr@decimaltohex[2]{\qr@poweroftwo@hex}{\qr@poweroftwo}% + \xa\ifnum\qr@poweroftwo>255\relax + %We need to bitwise add the polynomial represented by 100011101, i.e. 0x11d. + \F@addstrings{\qr@poweroftwo@hex}{11d}% %Now it should start with 0. + \xa\F@stripleadingzero\xa(\F@result)% %Now it should be two hex digits. + \edef\qr@poweroftwo@hex{\F@result}% %Save the hex version. + \qr@hextodecimal{\qr@poweroftwo}{\F@result}% + \fi + \xdef\qr@poweroftwo{\qr@poweroftwo}% + \xa\xdef\csname F@twotothe@\theqr@i\endcsname{\qr@poweroftwo@hex}% + \xa\xdef\csname F@logtwo@\qr@poweroftwo@hex\endcsname{\theqr@i}% + }% +\xa\xdef\csname F@twotothe@0\endcsname{01}% +\xa\xdef\csname F@logtwo@01\endcsname{0}% + +\def\F@twotothe#1{% + \xa\xdef\xa\F@result\xa{\csname F@twotothe@#1\endcsname}% +}% +\def\F@logtwo#1{% + \xa\xdef\xa\F@result\xa{\csname F@logtwo@#1\endcsname}% +}% + +\def\qr@zerozero{00}% + +\def\F@multiply#1#2{% + % #1 and #2 are two elements of F_256, + % given as two-character hexadecimal strings. + % Multiply them within F_256, and place the answer in \F@result + \edef\qr@argA{#1}% + \edef\qr@argB{#2}% + \ifx\qr@argA\qr@zerozero + \def\F@result{00}% + \else + \ifx\qr@argB\qr@zerozero + \def\F@result{00}% + \else + \xa\F@logtwo\xa{\qr@argA}% + \edef\qr@logA{\F@result}% + \xa\F@logtwo\xa{\qr@argB}% + \edef\qr@logB{\F@result}% + \xa\qr@a\xa=\qr@logA\relax% \qr@a = \qr@logA + \xa\advance\xa\qr@a\qr@logB\relax% \advance \qr@a by \qr@logB + \ifnum\qr@a>254\relax% + \advance\qr@a by -255\relax% + \fi% + \xa\F@twotothe\xa{\the\qr@a}% + % Now \F@result contains the product, as desired. + \fi + \fi +}% + + +\def\F@multiply#1#2{% + % #1 and #2 are two elements of F_256, + % given as two-character hexadecimal strings. + % Multiply them within F_256, and place the answer in \F@result + \edef\qr@argA{#1}% + \edef\qr@argB{#2}% + \ifx\qr@argA\qr@zerozero + \def\F@result{00}% + \else + \ifx\qr@argB\qr@zerozero + \def\F@result{00}% + \else + \xa\F@logtwo\xa{\qr@argA}% + \edef\qr@logA{\F@result}% + \xa\F@logtwo\xa{\qr@argB}% + \edef\qr@logB{\F@result}% + \xa\qr@a\xa=\qr@logA\relax% \qr@a = \qr@logA + \xa\advance\xa\qr@a\qr@logB\relax% \advance \qr@a by \qr@logB + \ifnum\qr@a>254\relax% + \advance\qr@a by -255\relax% + \fi% + \xa\F@twotothe\xa{\the\qr@a}% + % Now \F@result contains the product, as desired. + \fi + \fi +}% +% \end{macrocode} +% Having developed $\F_{256}$, we now turn to the real task. +% Each byte of data is read as an element of $\F_{256}$, +% and a sequence of bytes corresponds a polynomial in +% $\F_{256}[X]$. +% The Reed-Solomon code takes that codeword $f(X)\in \F_{256}[X]$ +% of degree $k$, divides $f(X)\cdot X^\ell$ by a fixed +% polynomial, +% and keeps the remainder $r(X)$ as the error-correction word. +% We therefore must implement polynomial division over $\F_{256}$. +% \begin{macrocode} +%These polynomials are represented as sequences of coefficients, +%from highest power to lowest, +%with each coefficient represented by two hexadecimal characters. + +\def\FX@getstringlength#1{% + %Count number of two-character coefficients + \setcounter{qr@i}{0}% + \xdef\qr@argument{(#1\relax\relax\relax)}% + \xa\FX@stringlength@recursive\qr@argument% + \xdef\stringresult{\arabic{qr@i}}% +}% + +\def\FX@stringlength@recursive(#1#2#3){% + \def\qr@testi{#1}% + \ifx\qr@testi\qr@relax + %we are done. + \else + \stepcounter{qr@i}% + %\showthe\c@qr@i + \qr@stringlength@recursive(#3)% + \fi +}% + +\newif\ifFX@leadingcoeff@zero +\def\FX@testleadingcoeff(#1#2#3){% + % Tests whether the leading coefficient of the hex-string #1#2#3 is '00'. + \edef\FX@leadingcoefficient{#1#2}% + \FX@leadingcoeff@zerofalse + \ifx\FX@leadingcoefficient\qr@zerozero + \FX@leadingcoeff@zerotrue + \fi +}% + +\newif\ifFX@divisiondone + +\newcounter{qr@divisionsremaining} %Keep track of how many divisions to go! +\def\FX@polynomialdivide#1#2{% + \edef\FX@numerator{#1}% + \edef\FX@denominator{#2}% + \qr@getstringlength\FX@numerator% + \setcounter{qr@divisionsremaining}{\qr@stringlength}% + \qr@getstringlength\FX@denominator% + \addtocounter{qr@divisionsremaining}{-\qr@stringlength}% + \addtocounter{qr@divisionsremaining}{2}% + \divide\c@qr@divisionsremaining by 2\relax% %2 hex chars per number + \FX@divisiondonefalse% + \xa\xa\xa\FX@polynomialdivide@recursive\xa\xa\xa{\xa\FX@numerator\xa}\xa{\FX@denominator}% +}% + +\def\FX@polynomialdivide@recursive#1#2{% + % #1 = f(x), of degree n + % #2 = g(x), of degree m + % Obtains a new polynomial h(x), congruent to f(x) modulo g(x), + % but of degree at most n-1. + % + % If leading coefficient of f(x) is 0, strips off that leading zero. + % If leading coefficient of f(x) is a, subtracts off a * g(x) * x^(n-m). + % N.B. we assume g is monic. + % + \FX@testleadingcoeff(#1)% + \ifFX@leadingcoeff@zero% + %Leading coefficient is zero, so remove it. + \xa\def\xa\FX@numerator\xa{\FX@stripleadingzero(#1)}% + \else% + %Leading coefficient is nonzero, and contained in \FX@leadingcoefficient + \FX@subtractphase{#1}{#2}{\FX@leadingcoefficient}% + \ifFX@subtract@failed% + %If subtraction failed, that means our #1 was already the remainder! + \FX@divisiondonetrue% + \edef\qr@theremainder{#1}% + \else% + %xor succeeded. We need to recurse. + \xa\xa\xa\edef\xa\xa\xa\FX@numerator\xa\xa\xa{\xa\FX@stripleadingzero\xa(\FX@subtraction@result)}% + \fi% + \fi% + \addtocounter{qr@divisionsremaining}{-1}% + \ifnum\c@qr@divisionsremaining=0\relax + %Division is done! + \FX@divisiondonetrue% + \edef\qr@theremainder{\FX@numerator}% + \relax% + \else% + \xa\FX@polynomialdivide@recursive\xa{\FX@numerator}{#2}% + \fi% +}% + +\def\FX@stripleadingzero(00#1){#1}%Strips off a single leading zero of F_256. + +\newif\ifFX@subtract@failed% This flag will trigger when #2 is longer than #1. + +\def\FX@subtractphase#1#2#3{% + % #1 = bitstring + % #2 = bitstring no longer than #1 + % #3 = leading coefficient + \FX@subtract@failedfalse% + \edef\qr@argument{(,#1\relax\relax\relax)(#2\relax\relax\relax)(#3)}% + \xa\FX@subtract@recursive\qr@argument% +}% + +\def\FX@subtract@recursive(#1,#2#3#4)(#5#6#7)(#8){% + % This is a recursive way to compute f(x) - a*g(x)*x^k. + % #1#2#3#4 is the first bitstring, subtracted up through #1. + % Thus #2#3 constitutes the next two-character coefficient. + % #5#6#7 is the remaining portion of the second bitstring. + % Thus #5#6 constitutes the next two-character coefficient + % #8 is the element a of F_256. It should contain two characters. + \def\qr@testii{#2}% + \def\qr@testv{#5}% + \ifx\qr@testii\qr@relax + % #1 contains the whole string. + % Now if #5 is also \relax, that means the two strings started off with equal lengths. + % If, however, #5 is not \relax, that means the second string was longer than the first, a problem. + \ifx\qr@testv\qr@relax + %No problem. We are done. + \FX@subtract@saveresult(#1#2#3#4)% %We keep the #2#3#4 to be sure we have all three relax-es to strip off. + \else + %Problem! The second string was longer than the first. + %This usually indicates the end of the long division process. + \FX@subtract@failedtrue + \def\FX@subtraction@result{}% + \fi + \else + % There is still a coefficient to manipulate in #2#3. + % Check whether #5 contains anything. + \ifx\qr@testv\qr@relax + % No, #5 is empty. We are done. "#2#3#4" contains the remainder of the first string, + % which we append untouched and then strip off the three \relax-es. + \FX@subtract@saveresult(#1#2#3#4)% + \else + % Yes, #5#6 still has something to XOR. Do the task. + \F@multiply{#5#6}{#8}% Multiply by the factor 'a'. + \F@addstrings{#2#3}{\F@result}% Subtract. (We're in characteristic two, so adding works.) + \edef\qr@argument{(#1\F@result,#4)(#7)(#8)}% + \xa\FX@subtract@recursive\qr@argument% + \fi + \fi +}% + +\def\FX@subtract@saveresult(#1\relax\relax\relax){% + %Strips off the three extra '\relax'es at the end. + \def\FX@subtraction@result{#1}% +}% + +\def\FX@creategeneratorpolynomial#1{% + % #1 = n, the number of error codewords desired. + % We need to create \prod_{j=0}^{n-1} (x-2^j). + \edef\FX@generator@degree{#1}% + \def\FX@generatorpolynomial{01}% Initially, set it equal to 1. + \setcounter{qr@i}{0}% + \FX@creategenerator@recursive% + %The result is now stored in \FX@generatorpolynomial +}% + +\def\FX@creategenerator@recursive{% + % \c@qr@i contains the current value of i. + % \FX@generatorpolynomial contains the current polynomial f(x), + % which should be a degree-i polynomial + % equal to \prod_{j=0}^{i-1} (x-2^j). + % (If i=0, then \FX@generatorpolynomial should be 01.) + % This recursion step should multiply the existing polynomial by (x-2^i), + % increment i by 1, and check whether we're done or not. + \edef\qr@summandA{\FX@generatorpolynomial 00}% This is f(x) * x + \edef\qr@summandB{00\FX@generatorpolynomial}% This is f(x), with a 0x^{i+1} in front. + \F@twotothe{\theqr@i}% + \edef\qr@theconstant{\F@result}% + \FX@subtractphase{\qr@summandA}{\qr@summandB}{\qr@theconstant}% + %This calculates \qr@summandA + \qr@theconstant * \qr@summandB + %and stores the result in \FX@subtraction@result + \edef\FX@generatorpolynomial{\FX@subtraction@result}% + \stepcounter{qr@i}% + \xa\ifnum\FX@generator@degree=\c@qr@i\relax% + %We just multiplied by (x-2^{n-1}), so we're done. + \relax% + \else% + %We need to do this again! + \xa% + \FX@creategenerator@recursive% + \fi% +}% + +\def\FX@generate@errorbytes#1#2{% + % #1 = datastream in hex + % #2 = number of error correction bytes requested + \edef\qr@numerrorbytes{#2}% + \xa\FX@creategeneratorpolynomial\xa{\qr@numerrorbytes}% + \edef\FX@numerator{#1}% + \qr@for \i = 1 to \qr@numerrorbytes by 1% + {\g@addto@macro\FX@numerator{00}}% %One error byte means two hex codes. + \FX@polynomialdivide{\FX@numerator}{\FX@generatorpolynomial}% + \edef\FX@errorbytes{\qr@theremainder}% +}% +% \end{macrocode} +% +% \subsection{Version handling} +% \begin{macrocode} +\newif\ifqr@versionmodules + +\def\qr@level@char#1{% + \xa\ifcase#1 + M\or L\or H\or Q\fi}% + +\newif\ifqr@versiongoodenough +\def\qr@choose@best@version#1{% + % \qr@desiredversion = user-requested version + % \qr@desiredlevel = user-requested error-correction level + \edef\qr@plaintext{#1}% + \qr@getstringlength{\qr@plaintext}% + % + %Run double loop over levels and versions, looking for + %the smallest version that can contain our data, + %and then choosing the best error-correcting level at that version, + %subject to the level being at least as good as the user desires. + \global\qr@versiongoodenoughfalse% + \gdef\qr@bestversion{0}% + \gdef\qr@bestlevel{0}% + \ifnum\qr@desiredversion=0\relax + \qr@a=1\relax + \else + \qr@a=\qr@desiredversion\relax + \fi + \qr@for \i=\qr@a to 40 by 1 + {\edef\qr@version{\the\i}% + \global\qr@versiongoodenoughfalse + \qr@for \j=0 to 3 by 1% + {%First, we map {0,1,2,3} to {1,0,4,3}, so that we loop through {M,L,H,Q} + %in order of increasing error-correction capabilities. + \qr@a = \j\relax + \divide \qr@a by 2\relax + \multiply \qr@a by 4\relax + \advance \qr@a by 1\relax + \advance \qr@a by -\j\relax + \edef\qr@level{\the\qr@a}% + \ifnum\qr@desiredlevel=\qr@a\relax + \global\qr@versiongoodenoughtrue + \fi + \ifqr@versiongoodenough + \qr@calculate@capacity{\qr@version}{\qr@level}% + \xa\xa\xa\ifnum\xa\qr@truecapacity\xa<\qr@stringlength\relax + %Too short + \relax + \else + %Long enough! + \xdef\qr@bestversion{\qr@version}% + \xdef\qr@bestlevel{\qr@level}% + \global\i=40% + \fi + \fi + }% + }% + \edef\qr@version{\qr@bestversion}% + \edef\qr@level{\qr@bestlevel}% + \xa\ifnum\qr@desiredversion>0\relax + \ifx\qr@bestversion\qr@desiredversion\relax + %No change from desired version. + \else + %Version was increased + \message{^^J}% + \fi + \fi + \ifx\qr@bestlevel\qr@desiredlevel\relax + %No change in level. + \else + \message{^^J}% + \fi +}% + +\def\qr@calculate@capacity#1#2{% + \edef\qr@version{#1}% + \edef\qr@level{#2}% + %Calculate \qr@size, the number of modules per side. + % The formula is 4\qr@version+17. + \qr@a=\qr@version\relax% + \multiply\qr@a by 4\relax% + \advance\qr@a by 17\relax% + \edef\qr@size{\the\qr@a}% + % + % Calculate \qr@k, which governs the number of alignment patterns. + % The alignment patterns lie in a kxk square, except for 3 that are replaced by finding patterns. + % The formula is 2 + floor( \qr@version / 7 ), except that k=0 for version 1. + \xa\ifnum\qr@version=1\relax% + \def\qr@k{0}% + \else% + \qr@a=\qr@version\relax + \divide \qr@a by 7\relax + \advance\qr@a by 2\relax + \edef\qr@k{\the\qr@a}% + \fi% + % + %Calculate number of function pattern modules. + %This consists of the three 8x8 finder patterns, the two timing strips, and the (k^2-3) 5x5 alignment patterns. + %The formula is 160+2n+25(k^2-3)-10(k-2), unless k=0 in which case we just have 160+2n. + \qr@a=\qr@size\relax + \multiply\qr@a by 2\relax + \advance\qr@a by 160\relax + \xa\ifnum\qr@k=0\relax\else + %\qr@k is nonzero, hence at least 2, so we continue to add 25(k^2-3)-10(k-2). + \qr@b=\qr@k\relax + \multiply\qr@b by \qr@k\relax + \advance\qr@b by -3\relax + \multiply\qr@b by 25\relax + \advance\qr@a by \qr@b\relax + \qr@b=\qr@k\relax + \advance\qr@b by -2\relax + \multiply\qr@b by 10\relax + \advance\qr@a by -\qr@b\relax + \fi + \edef\qr@numfunctionpatternmodules{\the\qr@a}% + % + %Calculate the number of version modules, either 36 or 0. + \xa\ifnum\qr@version>6\relax + \qr@versionmodulestrue + \def\qr@numversionmodules{36}% + \else + \qr@versionmodulesfalse + \def\qr@numversionmodules{0}% + \fi + % + %Now calculate the codeword capacity and remainder bits. + %Take n^2 modules, subtract all those dedicated to finder patterns etc., format information, and version information, + %and what's left is the number of bits we can play with. + %The number of complete bytes is \qr@numdatacodewords; + %the leftover bits are \qr@numremainderbits. + \qr@a=\qr@size\relax + \multiply \qr@a by \qr@size\relax + \advance \qr@a by -\qr@numfunctionpatternmodules\relax + \advance \qr@a by -31\relax% % There are 31 format modules. + \advance \qr@a by -\qr@numversionmodules\relax + \qr@b=\qr@a\relax + \divide \qr@a by 8\relax + \edef\qr@numdatacodewords{\the\qr@a}% + \multiply\qr@a by 8\relax + \advance \qr@b by -\qr@a\relax + \edef\qr@numremainderbits{\the\qr@b}% + % + %The size of the character count indicator also varies by version. + %There are only two options, so hardcoding seems easier than expressing these functionally. + \xa\ifnum\qr@version<10\relax + \def\qr@charactercountbytes@byte{1}% + \def\qr@charactercountbits@byte{8}% + \else + \def\qr@charactercountbytes@byte{2}% + \def\qr@charactercountbits@byte{16}% + \fi + % + %Now we call on the table, from the QR specification, + %of how many blocks to divide the message into, and how many error bytes each block gets. + %This affects the true capacity for data, which we store into \qr@totaldatacodewords. + % The following macro sets \qr@numblocks and \qr@num@eccodewords + % based on Table 9 of the QR specification. + \qr@settableix + \qr@a = -\qr@numblocks\relax + \multiply \qr@a by \qr@num@eccodewords\relax + \advance\qr@a by \qr@numdatacodewords\relax + \edef\qr@totaldatacodewords{\the\qr@a}% + \advance\qr@a by -\qr@charactercountbytes@byte\relax%Subtract character count + \advance\qr@a by -1\relax% Subtract 1 byte for the 4-bit mode indicator and the 4-bit terminator at the end. + \edef\qr@truecapacity{\the\qr@a}% +} + + +\def\qr@setversion#1#2{% + % #1 = version number, an integer between 1 and 40 inclusive. + % #2 = error-correction level, as an integer between 0 and 3 inclusive. + % 0 = 00 = M + % 1 = 01 = L + % 2 = 10 = H + % 3 = 11 = Q + % This macro calculates and sets a variety of global macros and/or counters + % storing version information that is used later in construction the QR code. + % Thus \qr@setversion should be called every time! + % + \edef\qr@version{#1}% + \edef\qr@level{#2}% + % + \qr@calculate@capacity{\qr@version}{\qr@level}% + %The capacity-check code sets the following: + % * \qr@size + % * \qr@k + % * \ifqr@versionmodules + % * \qr@numversionmodules + % * \qr@numdatacodewords + % * \qr@numremainderbits + % * \qr@charactercountbits@byte + % * \qr@charactercountbytes@byte + % * \qr@numblocks (via \qr@settableix) + % * \qr@num@eccodewords (via \qr@settableix) + % * \qr@totaldatacodewords + % + % The alignment patterns' square is 7 modules in from each edge. + % They are spaced "as evenly as possible" with an even number of modules between each row/column, + % unevenness in division being accommodated by making the first such gap smaller. + % The formula seems to be + % general distance = 2*round((n-13)/(k-1)/2+0.25) + % = 2*floor((n-13)/(k-1)/2+0.75) + % = 2*floor( (2*(n-13)/(k-1)+3) / 4 ) + % = (((2*(n-13)) div (k-1) + 3 ) div 4 ) * 2 + % first distance = leftovers + % The 0.25 is to accommodate version 32, which is the only time we round down. + % Otherwise a simple 2*ceiling((n-13)/(k-1)/2) would have sufficed. + % + \qr@a = \qr@size\relax + \advance\qr@a by -13\relax + \multiply\qr@a by 2\relax + \qr@b = \qr@k\relax + \advance \qr@b by -1\relax + \divide\qr@a by \qr@b\relax + \advance\qr@a by 3\relax + \divide\qr@a by 4\relax + \multiply\qr@a by 2\relax + \edef\qr@alignment@generalskip{\the\qr@a}% + % + %Now set \qr@alignment@firstskip to (\qr@size-13)-(\qr@k-2)*\qr@alignment@generalskip % + \qr@a = \qr@k\relax + \advance\qr@a by -2\relax + \multiply\qr@a by -\qr@alignment@generalskip\relax + \advance\qr@a by \qr@size\relax + \advance\qr@a by -13\relax + \edef\qr@alignment@firstskip{\the\qr@a}% + % + % + % + % Our \qr@totaldatacodewords bytes of data are broken up as evenly as possible + % into \qr@numblocks datablocks; some may be one byte longer than others. + % We set \qr@shortblock@size to floor(\qr@totaldatacodewords / \qr@numblocks) + % and \qr@numlongblocks to mod(\qr@totaldatacodewords , \qr@numblocks). + \qr@a=\qr@totaldatacodewords\relax + \divide\qr@a by \qr@numblocks\relax + \edef\qr@shortblock@size{\the\qr@a}% + \multiply\qr@a by -\qr@numblocks\relax + \advance\qr@a by \qr@totaldatacodewords\relax + \edef\qr@numlongblocks{\the\qr@a}% + % + %Set \qr@longblock@size to \qr@shortblock@size+1. + \qr@a=\qr@shortblock@size\relax + \advance\qr@a by 1\relax + \edef\qr@longblock@size{\the\qr@a}% + % + %Set \qr@numshortblocks to \qr@numblocks - \qr@numlongblocks + \qr@b=\qr@numblocks\relax + \advance\qr@b by -\qr@numlongblocks\relax + \edef\qr@numshortblocks{\the\qr@b}% +}% + +\def\qr@settableix@int(#1,#2){% + \edef\qr@numblocks{#1}% + \edef\qr@num@eccodewords{#2}% +}% + +\def\qr@settableix{% +\xa\ifcase\qr@level\relax + %00: Level 'M', medium error correction + \edef\qr@tempdata{(% + \ifcase\qr@version\relax + \relax %There is no version 0. + \or1,10% + \or1,16% + \or1,26% + \or2,18% + \or2,24% + \or4,16% + \or4,18% + \or4,22% + \or5,22% + \or5,26% + \or5,30% + \or8,22% + \or9,22% + \or9,24% + \or10,24% + \or10,28% + \or11,28% + \or13,26% + \or14,26% + \or16,26% + \or17,26% + \or17,28% + \or18,28% + \or20,28% + \or21,28% + \or23,28% + \or25,28% + \or26,28% + \or28,28% + \or29,28% + \or31,28% + \or33,28% + \or35,28% + \or37,28% + \or38,28% + \or40,28% + \or43,28% + \or45,28% + \or47,28% + \or49,28% + \fi)}% +\or + %01: Level 'L', low error correction + \edef\qr@tempdata{% + (\ifcase\qr@version\relax + \relax %There is no version 0. + \or 1,7% + \or 1,10% + \or 1,15% + \or 1,20% + \or 1,26% + \or 2,18% + \or 2,20% + \or 2,24% + \or 2,30% + \or 4,18% + \or 4,20% + \or 4,24% + \or 4,26% + \or 4,30% + \or 6,22% + \or 6,24% + \or 6,28% + \or 6,30% + \or 7,28% + \or 8,28% + \or 8,28% + \or 9,28% + \or 9,30% + \or 10,30% + \or 12,26% + \or 12,28% + \or 12,30% + \or 13,30% + \or 14,30% + \or 15,30% + \or 16,30% + \or 17,30% + \or 18,30% + \or 19,30% + \or 19,30% + \or 20,30% + \or 21,30% + \or 22,30% + \or 24,30% + \or 25,30% + \fi)}% +\or + %10: Level 'H', high error correction + \edef\qr@tempdata{(% + \ifcase\qr@version\relax + \relax %There is no version 0. + \or1,17% + \or1,28% + \or2,22% + \or4,16% + \or4,22% + \or4,28% + \or5,26% + \or6,26% + \or8,24% + \or8,28% + \or11,24% + \or11,28% + \or16,22% + \or16,24% + \or18,24% + \or16,30% + \or19,28% + \or21,28% + \or25,26% + \or25,28% + \or25,30% + \or34,24% + \or30,30% + \or32,30% + \or35,30% + \or37,30% + \or40,30% + \or42,30% + \or45,30% + \or48,30% + \or51,30% + \or54,30% + \or57,30% + \or60,30% + \or63,30% + \or66,30% + \or70,30% + \or74,30% + \or77,30% + \or81,30% + \fi)}% +\or + %11: Level 'Q', quality error correction + \edef\qr@tempdata{(% + \ifcase\qr@version\relax + \relax %There is no version 0. + \or1,13% + \or1,22% + \or2,18% + \or2,26% + \or4,18% + \or4,24% + \or6,18% + \or6,22% + \or8,20% + \or8,24% + \or8,28% + \or10,26% + \or12,24% + \or16,20% + \or12,30% + \or17,24% + \or16,28% + \or18,28% + \or21,26% + \or20,30% + \or23,28% + \or23,30% + \or25,30% + \or27,30% + \or29,30% + \or34,28% + \or34,30% + \or35,30% + \or38,30% + \or40,30% + \or43,30% + \or45,30% + \or48,30% + \or51,30% + \or53,30% + \or56,30% + \or59,30% + \or62,30% + \or65,30% + \or68,30% + \fi)}% +\fi +\xa\qr@settableix@int\qr@tempdata +}% +% \end{macrocode} +% \subsection{More key handling} +% \begin{macrocode} +\define@key{qr}{version}{\edef\qr@desiredversion{#1}}% +\define@key{qr}{level}{\qr@setlevel{#1}}% +\define@key{qr}{height}{\qr@setheight{#1}}% +\define@boolkey{qr}[qr@]{tight}[true]{}% %This creates \ifqr@tight and initializes it to true. +\define@boolkey{qr}[qr@]{padding}[true]{\ifqr@padding\qr@tightfalse\else\qr@tighttrue\fi}% %Define 'padding' as antonym to 'tight' + +\def\@qr@M{M}\def\@qr@z{0}% +\def\@qr@L{L}\def\@qr@i{1}% +\def\@qr@H{H}\def\@qr@ii{2}% +\def\@qr@Q{Q}\def\@qr@iii{3}% +\def\qr@setlevel#1{% + \edef\qr@level@selected{#1}% + \ifx\qr@level@selected\@qr@M + \edef\qr@desiredlevel{0}% + \fi + \ifx\qr@level@selected\@qr@L + \edef\qr@desiredlevel{1}% + \fi + \ifx\qr@level@selected\@qr@H + \edef\qr@desiredlevel{2}% + \fi + \ifx\qr@level@selected\@qr@Q + \edef\qr@desiredlevel{3}% + \fi + \ifx\qr@level@selected\@qr@z + \edef\qr@desiredlevel{0}% + \fi + \ifx\qr@level@selected\@qr@i + \edef\qr@desiredlevel{1}% + \fi + \ifx\qr@level@selected\@qr@ii + \edef\qr@desiredlevel{2}% + \fi + \ifx\qr@level@selected\@qr@iii + \edef\qr@desiredlevel{3}% + \fi +}% + +\def\qr@setheight#1{% + \setlength{\qr@desiredheight}{#1}% +}% + +\newcommand\qrset[1]{% + \setkeys{qr}{#1}% +} + +%SET DEFAULTS +\qrset{version=0, level=0, tight} +% \end{macrocode} +% \subsection{Main user functions} +% At last we are ready to define the main user functions. +% Some care is needed to ensure +% that the \meta{text to be encoded} is read with the appropriate catcodes, +% and that any escaped special characters are converted to the intended +% characters with category code 12 (other). +% \begin{macrocode} +\newif\ifqr@starinvoked% +\def\qrcode{\@ifstar\qrcode@star\qrcode@nostar}% +\def\qrcode@star{\qr@starinvokedtrue\qrcode@i}% +\def\qrcode@nostar{\qr@starinvokedfalse\qrcode@i}% + +\newcommand\qrcode@i[1][]{% + \begingroup% + \ifqr@starinvoked% + \qr@hyperlinkfalse% + \fi% + \setkeys{qr}{#1}% + \bgroup\qr@verbatimcatcodes\qr@setescapedspecials\qrcode@in}% + +\def\qrcode@in#1{\xdef\qr@texttoencode{#1}\egroup\qrcode@int\endgroup}% + +\def\qrcode@hyperwrapper@hyperref{\href{\qr@texttoencode}}% +\def\qrcode@hyperwrapper@nohyperref{\relax}% + +\AtBeginDocument{% + \@ifpackageloaded{hyperref}% + {\global\let\qrcode@hyperwrapper=\qrcode@hyperwrapper@hyperref}% + {\global\let\qrcode@hyperwrapper=\qrcode@hyperwrapper@nohyperref}% +}% + +\def\qrcode@int{% + \message{^^J^^J^^J}% + %First, choose the version and level. + %Recall that \qr@choose@best@version sets \qr@version and \qr@level. + \xa\qr@choose@best@version\xa{\qr@texttoencode}% + \qr@setversion{\qr@version}{\qr@level}% + % + \ifqr@hyperlink% + \let\qrcode@wrapper=\qrcode@hyperwrapper% + \else% + \let\qrcode@wrapper=\relax% + \fi% + % + %Next, check whether we have already encoded this text at this version + %and level. + \qrcode@wrapper{% + \xa\ifx\csname qr@savedbinarymatrix@\qr@texttoencode @\qr@version @\qr@level\endcsname + \relax% + %This text has not yet been encoded. + \qrcode@int@new% + \else + %This text has already been encoded! + \ifqr@forget@mode + %In 'forget' mode, we deliberately recalculate anyway. + \qrcode@int@new% + \else + \qrcode@int@remember% + \fi + \fi% + }% +}% + +\def\qrcode@int@new{% + \qr@createsquareblankmatrix{newqr}{\qr@size}% + \qr@placefinderpatterns{newqr}% + \qr@placetimingpatterns{newqr}% + \qr@placealignmentpatterns{newqr}% + \qr@placedummyformatpatterns{newqr}% + \qr@placedummyversionpatterns{newqr}% + \ifqr@draft@mode + \message{^^J}% + \relax% Draft mode---don't load any data or do any work. Also don't save! + \def\qr@format@square{\qr@black}% + \def\qr@blank{\qr@white}% + \fboxsep=-\fboxrule% + \fbox{\qr@printmatrix{newqr}}% + \else + \message{^^J}% + \xa\qr@encode@binary\xa{\qr@texttoencode}% + \qr@splitcodetextintoblocks + \qr@createerrorblocks + \qr@interleave + \message{^^J}% + \qr@writeremainderbits{newqr}% + \qr@chooseandapplybestmask{newqr}% + \qr@decimaltobinary[2]{\qr@level@binary}{\qr@level}% + \qr@decimaltobinary[3]{\qr@mask@binary}{\qr@mask@selected}% + \edef\qr@formatstring{\qr@level@binary\qr@mask@binary}% + \message{^^J}% + \message{^^J}% + \message{^^J}% + % + %Also save the binary version into the aux file, for use in later runs. + \message{^^J}% + \message{^^J}% + \fi + \message{^^J}% +}% +\def\qrcode@int@remember{% + %This text has already been encoded, + %so we just copy it from the saved binary string. + \message{^^J}% + \xa\qr@printsavedbinarymatrix\xa{\csname qr@savedbinarymatrix@\qr@texttoencode @\qr@version @\qr@level\endcsname}% + % + % Now this still might need to be written to the aux file. + % + \xa\ifx\csname qr@savedflag@\qr@texttoencode @\qr@version @\qr@level\endcsname\@qr@TRUE + %Okay, this has already been written to aux file. + %Do nothing. + \relax% + \else% + %This has NOT been written to the aux file yet. + %We need to do so now. + \xa\qr@writebinarymatrixtoauxfile\xa{\csname qr@savedbinarymatrix@\qr@texttoencode @\qr@version @\qr@level\endcsname}% + \fi% +}% + +\def\qr@matrixtobinary#1{% + \def\qr@binarymatrix@result{}% + \bgroup + \def\qr@black{1}% + \def\qr@white{0}% + \def\qr@blank{0}% + \def\qr@black@fixed{1}% + \def\qr@white@fixed{0}% + \def\qr@black@format{1}% + \def\qr@white@format{0}% + % + \qr@for \i = 1 to \qr@size by 1% + {\qr@for \j = 1 to \qr@size by 1% + {\edef\qr@theentry{\qr@matrixentry{#1}{\the\i}{\the\j}}% + \xa\g@addto@macro\xa\qr@binarymatrix@result\xa{\qr@theentry}% + }% + }% + \egroup% +}% + +\def\qr@sanitize@output#1{% + %Read through ASCII text '#1' and escape backslashes and braces + \def\qr@sanitized@result{}% + \edef\qr@argument{(#1\relax\relax\relax)}% + \xa\qr@sanitize@output@int\qr@argument% +} + +\def\qr@sanitize@output@int(#1#2){% + % #1 = first character + % #2 = rest of output, including terminator + \edef\qr@testi{#1}% + \ifx\qr@testi\qr@relax + % Done. + \let\qr@next=\relax + \else + \ifx\qr@testi\qr@otherrightbrace + \edef\qr@sanitized@result{\qr@sanitized@result\qr@otherbackslash}% + \else\ifx\qr@testi\qr@otherleftbrace + \edef\qr@sanitized@result{\qr@sanitized@result\qr@otherbackslash}% + \else\ifx\qr@testi\qr@otherbackslash + \edef\qr@sanitized@result{\qr@sanitized@result\qr@otherbackslash}% + \fi + \fi + \fi + \edef\qr@sanitized@result{\qr@sanitized@result#1}% + \def\qr@next{\qr@sanitize@output@int(#2)}% + \fi + \qr@next +} + +\def\@qr@TRUE{TRUE}% +\def\qr@writebinarymatrixtoauxfile#1{% + \qr@sanitize@output{\qr@texttoencode}% + \edef\qr@theargument{{\qr@sanitized@result}{\qr@version}{\qr@level}{#1}}% + \xa\write\xa\@auxout\xa{\xa\string\xa\qr@savematrix\qr@theargument}% + % + % Now set a flag, so we don't write this again. + \xa\gdef\csname qr@savedflag@\qr@texttoencode @\qr@version @\qr@level\endcsname{TRUE}% +}% + +\gdef\qr@dummyqrsavedefinition{}% +\begingroup + \catcode`\#=12\relax + \catcode`\<=1\relax + \catcode`\{=12\relax + \catcode`\>=2\relax + \catcode`\}=12\relax + \catcode`\|=0\relax + \catcode`\\=12|relax + |gdef|qr@dummyqrsavedefinition<% + \ifx\qr@savematrix\@undefined% + \def\qr@savematrix{\begingroup\let\do\@makeother\dospecials\catcode`\{=1\catcode`\}=2\relax + \qr@savematrix@int}% + \def\qr@savematrix@int#1#2#3#4{\endgroup}% + \fi% + > +|endgroup + +\edef\qr@argument{(\qr@dummyqrsavedefinition)}% +\xa\write\xa\@auxout\xa{\qr@dummyqrsavedefinition}% + +\def\qr@savematrix{\bgroup\qr@verbatimcatcodes\qr@setescapedspecials\qr@savematrix@int}% + +\def\qr@savematrix@int#1{\xdef\qr@savedmatrix@name{#1}\egroup\qr@savematrix@int@int}% + +\def\qr@savematrix@int@int#1#2#3{% + % \qr@savedmatrix@name = encoded text + % #1 = version + % #2 = level + % #3 = binary text + \def\ds{^^J}\xa\message\xa{\ds}% + {\let\%=\qr@otherpercent + \xa\gdef\csname qr@savedbinarymatrix@\qr@savedmatrix@name @#1@#2\endcsname{#3}% + }% +}% +% \end{macrocode} +% +% \Finale +\endinput diff --git a/tools/style/qrcode.ins b/tools/style/qrcode.ins new file mode 100644 index 0000000..6e5eade --- /dev/null +++ b/tools/style/qrcode.ins @@ -0,0 +1,57 @@ +%% qrcode.ins +%% Copyright 2015 by Anders O.F. Hendrickson +%% +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3 +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% and version 1.3 or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This work has the LPPL maintenance status `maintained'. +%% +%% The Current Maintainer of this work is Anders O.F. Hendrickson. +%% +%% This work consists of the files qrcode.dtx and qrcode.ins +%% and the derived file qrcode.sty. + +\input docstrip.tex +\keepsilent + +\usedir{tex/latex/qrcode} + +\preamble + +This is a generated file. + +Copyright (C) 2015 by Anders Hendrickson + +This work may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3 +of this license or (at your option) any later version. +The latest version of this license is in + http://www.latex-project.org/lppl.txt +and version 1.3 or later is part of all distributions of LaTeX +version 2005/12/01 or later. + +\endpreamble + +\generate{\file{qrcode.sty}{\from{qrcode.dtx}{package}}} + +\obeyspaces +\Msg{*************************************************************} +\Msg{* *} +\Msg{* To finish the installation you have to move the following *} +\Msg{* file into a directory searched by TeX: *} +\Msg{* *} +\Msg{* qrcode.sty *} +\Msg{* *} +\Msg{* To produce the documentation run the file qrcode.dtx *} +\Msg{* through LaTeX. *} +\Msg{* *} +\Msg{* Happy TeXing! *} +\Msg{* *} +\Msg{*************************************************************} + +\endbatchfile diff --git a/tools/style/qrcode.sty b/tools/style/qrcode.sty new file mode 100644 index 0000000..6330464 --- /dev/null +++ b/tools/style/qrcode.sty @@ -0,0 +1,3051 @@ +%% +%% This is file `qrcode.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% qrcode.dtx (with options: `package') +%% +%% This is a generated file. +%% +%% Copyright (C) 2015 by Anders Hendrickson +%% +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3 +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% and version 1.3 or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +\NeedsTeXFormat{LaTeX2e}[1999/12/01] +\ProvidesPackage{qrcode} + [2015/01/08 v1.51 QR code generation] +%%PACKAGE LOADING +\RequirePackage{xcolor}% +\RequirePackage{xkeyval}% + +%%INITIAL CODE +\newif\ifqr@draft@mode +\newif\ifqr@forget@mode + +%%DECLARATION OF OPTIONS +\define@boolkey{qr}[qr@]{draft}[true]{\ifqr@draft\qr@draft@modetrue\else\qr@draft@modefalse\fi}% +\define@boolkey{qr}[qr@]{final}[true]{\ifqr@final\qr@draft@modefalse\else\qr@draft@modetrue\fi}% +\define@boolkey{qr}[qr@]{forget}[true]{\ifqr@forget\qr@forget@modetrue\else\qr@forget@modefalse\fi}% +\define@boolkey{qr}[qr@]{hyperlink}[true]{}% %This creates \ifqr@hyperlink. +\define@boolkey{qr}[qr@]{hyperlinks}[true]{\ifqr@hyperlinks\qr@hyperlinktrue\else\qr@hyperlinkfalse\fi}% +\define@boolkey{qr}[qr@]{link}[true]{\ifqr@link\qr@hyperlinktrue\else\qr@hyperlinkfalse\fi}% +\define@boolkey{qr}[qr@]{nolink}[true]{\ifqr@nolink\qr@hyperlinkfalse\else\qr@hyperlinktrue\fi}% %Make nolink an antonym. +\define@boolkey{qr}[qr@]{links}[true]{\ifqr@links\qr@hyperlinktrue\else\qr@hyperlinkfalse\fi}% +\define@boolkey{qr}[qr@]{nolinks}[true]{\ifqr@nolinks\qr@hyperlinkfalse\else\qr@hyperlinktrue\fi}% %Make nolinks an antonym. + +%%EXECUTION OF OPTIONS +\qr@draft@modefalse +\qr@forget@modefalse +\qr@hyperlinktrue + +\ProcessOptionsX + +\newcounter{qr@i}% +\newcounter{qr@j}% +\newcount\qr@a +\newcount\qr@b +\newcount\qr@c + +\let\xa=\expandafter + +\newlinechar=`\^^J + +\def\qr@relax{\relax}% + +\def\qr@preface@macro#1#2{% + % #1 = macro name + % #2 = text to add to front of macro + \def\qr@tempb{#2}% + \xa\xa\xa\def\xa\xa\xa#1\xa\xa\xa{\xa\qr@tempb #1}% +}% + +\def\qr@g@preface@macro#1#2{% + % #1 = macro to be appended to + % #2 = code to add + \edef\qr@tempb{#2}% + \xa\xa\xa\gdef\xa\xa\xa#1\xa\xa\xa{\xa\qr@tempb#1}% +} + +\def\qr@getstringlength#1{% + \bgroup + \qr@a=0% + \xdef\qr@thestring{#1}% + \xa\qr@stringlength@recursive\xa(\qr@thestring\relax\relax)% + \xdef\qr@stringlength{\the\qr@a}% + \egroup +}% + +\def\qr@stringlength@recursive(#1#2){% + \def\qr@testi{#1}% + \ifx\qr@testi\qr@relax + %we are done. + \let\qr@next=\relax% + \else + \advance\qr@a by 1% + \def\qr@next{\qr@stringlength@recursive(#2)}% + \fi + \qr@next +}% +\newcount\qr@for@depth% +\newcount\qr@for@maxdepth% +\qr@for@depth=0% +\qr@for@maxdepth=0% +\newcount\qr@for@start% +\newcount\qr@for@end% +\newcount\qr@for@step% +\def\qr@allocate@new@for@counter{% + \global\advance\qr@for@maxdepth by 1% + \newcount\qr@newforcount% + \xa\global\xa\let\csname qr@for@var@\the\qr@for@maxdepth\endcsname=\qr@newforcount% +}% + +\newif\ifqr@loopshouldrun +\def\qr@for #1=#2to#3by#4#{% + \qr@for@int{#1}{#2}{#3}{#4}% +}% +\long\def\qr@for@int#1#2#3#4#5{% + \bgroup + %Because we're working within a TeX group, + %any values of \qr@for@start, \qr@for@end, and \qr@for@step from an outer loop + %will be restored after the \egroup. + % + %For the \qr@for@var itself, however, we need a different counter, + %because the user's text within the loop might need to access the variable from the outer loop. + \advance\qr@for@depth by 1\relax% This is a local change. + \ifnum\qr@for@depth>\qr@for@maxdepth% + %This is the first time we have gone to this depth of nesting! + %We should only be over by one. + \qr@allocate@new@for@counter% + \fi + \xa\let\xa\qr@for@var\xa=\csname qr@for@var@\the\qr@for@depth\endcsname% + %Now \qr@for@var points to the same register as \qr@for@var@3 or something. + %The next line lets the user-level variable (e.g., \i or \j) point to the same count register. + \let#1=\qr@for@var% + %Now establish the looping parameters. + \edef\qr@for@start@text{#2}% + \edef\qr@for@end@text{#3}% + \edef\qr@for@step@text{#4}% + \def\qr@for@body{\bgroup #5\egroup}% + \xa\qr@for@start\qr@for@start@text\relax% + \xa\qr@for@end \qr@for@end@text\relax% + \xa\qr@for@step \qr@for@step@text\relax% + % + %Next, test whether the loop should run at all. + % * "\qr@for \i = 1 to 0 by 1" should fail. + % * "\qr@for \i = 3 to 5 by -1" should fail. + % * "\qr@for \i = 6 to 2 by 1" should fail. + % * "\qr@for \i = 4 to 4 by -1" should run. + % * "\qr@for \i = 4 to 4 by 1" should run. + % * "\qr@for \i = 5 to 7 by 0" should fail. + %The loop should fail if (step)=0 or if (step) and (end-start) have opposite signs. + %The loop will fail if (step=0) or (step)*(end-start)<0. + % TODO: "\qr@for \i = 5 to 5 by 0" should run (just one iteration). + \qr@loopshouldruntrue + \ifnum\qr@for@step=0\relax + \qr@loopshouldrunfalse + \fi + \qr@a=\qr@for@end% + \advance\qr@a by -\qr@for@start% + \multiply\qr@a by \qr@for@step% + \ifnum\qr@a<0\relax + \qr@loopshouldrunfalse + \fi + \ifqr@loopshouldrun + \qr@for@var=\qr@for@start% + \ifnum\qr@for@step>0\relax + \def\qr@for@recursive{% + \qr@for@body% + \advance\qr@for@var by \qr@for@step% + \ifnum\qr@for@var>\qr@for@end% + \let\qr@for@next=\relax% + \else% + \let\qr@for@next=\qr@for@recursive% + \fi% + \qr@for@next% + }% + \else + \def\qr@for@recursive{% + \qr@for@body% + \advance\qr@for@var by \qr@for@step% + \ifnum\qr@for@var<\qr@for@end% + \let\qr@for@next=\relax% + \else% + \let\qr@for@next=\qr@for@recursive% + \fi% + \qr@for@next% + }% + \fi + \qr@for@recursive% + \fi + \egroup +}% +\def\qr@padatfront#1#2{% + % #1 = macro containing text to pad + % #2 = desired number of characters + % Pads a number with initial zeros. + \qr@getstringlength{#1}% + \qr@a=\qr@stringlength\relax% + \advance\qr@a by 1\relax% + \qr@for \i = \qr@a to #2 by 1\relax% + {\qr@g@preface@macro{#1}{0}}% +} + +\qr@a=-1\relax% +\def\qr@savehexsymbols(#1#2){% + \advance\qr@a by 1\relax% + \xa\def\csname qr@hexchar@\the\qr@a\endcsname{#1}% + \xa\edef\csname qr@hextodecimal@#1\endcsname{\the\qr@a}% + \ifnum\qr@a=15\relax + %Done. + \let\qr@next=\relax% + \else + \def\qr@next{\qr@savehexsymbols(#2)}% + \fi% + \qr@next% +}% +\qr@savehexsymbols(0123456789abcdef\relax\relax)% + +\def\qr@decimaltobase#1#2#3{% + % #1 = macro to store result + % #2 = decimal representation of a positive integer + % #3 = new base + \bgroup + \edef\qr@newbase{#3}% + \gdef\qr@base@result{}% + \qr@a=#2\relax% + \qr@decimaltobase@recursive% + \xdef#1{\qr@base@result}% + \egroup +} +\def\qr@decimaltobase@recursive{% + \qr@b=\qr@a% + \divide\qr@b by \qr@newbase\relax + \multiply\qr@b by -\qr@newbase\relax + \advance\qr@b by \qr@a\relax% + \divide\qr@a by \qr@newbase\relax% + \ifnum\qr@b<10\relax + \edef\qr@newdigit{\the\qr@b}% + \else + \edef\qr@newdigit{\csname qr@hexchar@\the\qr@b\endcsname}% + \fi + \edef\qr@argument{{\noexpand\qr@base@result}{\qr@newdigit}}% + \xa\qr@g@preface@macro\qr@argument% + \ifnum\qr@a=0\relax + \relax + \else + \xa\qr@decimaltobase@recursive + \fi +} + +\newcommand\qr@decimaltohex[3][0]{% + % #1 (opt.) = number of hex digits to create + % #2 = macro to store result + % #3 = decimal digits to convert + \qr@decimaltobase{#2}{#3}{16}% + \qr@padatfront{#2}{#1}% +} + +\newcommand\qr@decimaltobinary[3][0]{% + % #1 (opt.) = number of bits to create + % #2 = macro to store result + % #3 = decimal digits to convert + \qr@decimaltobase{#2}{#3}{2}% + \qr@padatfront{#2}{#1}% +} + +\qr@for \i = 0 to 15 by 1% + {% + \qr@decimaltohex[1]{\qr@hexchar}{\the\i}% + \qr@decimaltobinary[4]{\qr@bits}{\the\i}% + \xa\xdef\csname qr@b2h@\qr@bits\endcsname{\qr@hexchar}% + \xa\xdef\csname qr@h2b@\qr@hexchar\endcsname{\qr@bits}% + }% + +\newcommand\qr@binarytohex[3][\relax]{% + % #1 (optional) = # digits desired + % #2 = macro to save to + % #3 = binary string (must be multiple of 4 bits) + \def\qr@test@i{#1}% + \ifx\qr@test@i\qr@relax% + %No argument specified + \def\qr@desireddigits{0}% + \else + \def\qr@desireddigits{#1}% + \fi + \gdef\qr@base@result{}% + \edef\qr@argument{(#3\relax\relax\relax\relax\relax)}% + \xa\qr@binarytohex@int\qr@argument% + \qr@padatfront{\qr@base@result}{\qr@desireddigits}% + \xdef#2{\qr@base@result}% +} +\def\qr@binarytohex@int(#1#2#3#4#5){% + % #1#2#3#4 = 4 bits + % #5 = remainder, including \relax\relax\relax\relax\relax terminator + \def\qr@test@i{#1}% + \ifx\qr@test@i\qr@relax% + %Done. + \def\qr@next{\relax}% + \else% + \xdef\qr@base@result{\qr@base@result\csname qr@b2h@#1#2#3#4\endcsname}% + \def\qr@next{\qr@binarytohex@int(#5)}% + \fi% + \qr@next% +} + +\newcommand\qr@hextobinary[3][\relax]{% + % #1 (optional) = # bits desired + % #2 = macro to save to + % #3 = hexadecimal string + \bgroup + \def\qr@test@i{#1}% + \ifx\qr@test@i\qr@relax% + %No argument specified + \def\qr@desireddigits{0}% + \else + \def\qr@desireddigits{#1}% + \fi + \gdef\qr@base@result{}% + \edef\qr@argument{(#3\relax\relax)}% + \xa\qr@hextobinary@int\qr@argument% + \qr@padatfront{\qr@base@result}{\qr@desireddigits}% + \xdef#2{\qr@base@result}% + \egroup +} +\def\qr@hextobinary@int(#1#2){% + % #1 = hexadecimal character + % #2 = remainder, including \relax\relax terminator + \def\qr@test@@i{#1}% + \ifx\qr@test@@i\qr@relax% + %Done. + \def\qr@next{\relax}% + \else% + \xdef\qr@base@result{\qr@base@result\csname qr@h2b@#1\endcsname}% + \def\qr@next{\qr@hextobinary@int(#2)}% + \fi% + \qr@next% +} + +\def\qr@hextodecimal#1#2{% + \edef\qr@argument{#2}% + \xa\qr@a\xa=\xa\number\xa"\qr@argument\relax% + \edef#1{\the\qr@a}% +} + +\def\qr@hextodecimal#1#2{% + % #1 = macro to store result + % #2 = hexadecimal representation of a positive integer + \bgroup + \qr@a=0\relax% + \edef\qr@argument{(#2\relax)}% + \xa\qr@hextodecimal@recursive\qr@argument% + \xdef#1{\the\qr@a}% + \egroup +} +\def\qr@hextodecimal@recursive(#1#2){% + % #1 = first hex char + % #2 = remainder + \advance \qr@a by \csname qr@hextodecimal@#1\endcsname\relax% + \edef\qr@testii{#2}% + \ifx\qr@testii\qr@relax% + %Done. + \let\qr@next=\relax% + \else + %There's at least one more digit. + \multiply\qr@a by 16\relax + \edef\qr@next{\noexpand\qr@hextodecimal@recursive(#2)}% + \fi% + \qr@next% +} +{\catcode`\ =12\relax\gdef\qr@otherspace{ }}% +{\catcode`\%=12\relax\gdef\qr@otherpercent{%}}% +{\catcode`\#=12\relax\gdef\qr@otherpound{#}}% +{\catcode`\|=0\relax|catcode`|\=12|relax|gdef|qr@otherbackslash{\}}% +{\catcode`\^^J=12\relax\gdef\qr@otherlf{^^J}}% +\bgroup + \catcode`\<=1\relax + \catcode`\>=2\relax + \catcode`\{=12\relax\gdef\qr@otherleftbrace<{>% + \catcode`\}=12\relax\gdef\qr@otherrightbrace<}>% +\egroup% +{\catcode`\&=12\relax\gdef\qr@otherampersand{&}}% +{\catcode`\~=12\relax\gdef\qr@othertilde{~}}% +{\catcode`\^=12\relax\gdef\qr@othercaret{^}}% +{\catcode`\_=12\relax\gdef\qr@otherunderscore{_}}% +{\catcode`\$=12\relax\gdef\qr@otherdollar{$}}% + +{\catcode`\^^M=13\relax\gdef\qr@verbatimlinefeeds{\let^^M=\qr@otherlf}} +\def\qr@verbatimcatcodes{% + \catcode`\#=12\relax + \catcode`\$=12\relax + \catcode`\&=12\relax + \catcode`\^=12\relax + \catcode`\_=12\relax + \catcode`\~=12\relax + \catcode`\%=12\relax + \catcode`\ =12\relax + \catcode`\^^M=13\relax\qr@verbatimlinefeeds}% + +\def\qr@setescapedspecials{% + \let\ =\qr@otherspace% + \let\%=\qr@otherpercent% + \let\#=\qr@otherpound% + \let\&=\qr@otherampersand% + \let\^=\qr@othercaret% + \let\_=\qr@otherunderscore% + \let\~=\qr@othertilde% + \let\$=\qr@otherdollar% + \let\\=\qr@otherbackslash% + \let\{=\qr@otherleftbrace% + \let\}=\qr@otherrightbrace% + \let\?=\qr@otherlf% +}% +\def\qr@creatematrix#1{% + \xa\gdef\csname #1\endcsname##1##2{% + \csname #1@##1@##2\endcsname + }% +}% + +\def\qr@storetomatrix#1#2#3#4{% + % #1 = matrix name + % #2 = row number + % #3 = column number + % #4 = value of matrix entry + \xa\gdef\csname #1@#2@#3\endcsname{#4}% +}% + +\def\qr@estoretomatrix#1#2#3#4{% + % This version performs exactly one expansion on #4. + % #1 = matrix name + % #2 = row number + % #3 = column number + % #4 = value of matrix + \xa\xa\xa\gdef\xa\xa\csname #1@#2@#3\endcsname\xa{#4}% +}% + +\def\qr@matrixentry#1#2#3{% + % #1 = matrix name + % #2 = row number + % #3 = column number + \csname #1@#2@#3\endcsname% +}% + +\def\qr@createsquareblankmatrix#1#2{% + \qr@creatematrix{#1}% + \xa\gdef\csname #1@numrows\endcsname{#2}% + \xa\gdef\csname #1@numcols\endcsname{#2}% + \qr@for \i = 1 to #2 by 1% + {\qr@for \j = 1 to #2 by 1% + {\qr@storetomatrix{#1}{\the\i}{\the\j}{\qr@blank}}}% +}% + +\def\qr@numberofrowsinmatrix#1{% + \csname #1@numrows\endcsname% +}% + +\def\qr@numberofcolsinmatrix#1{% + \csname #1@numcols\endcsname% +}% + +\def\qr@setnumberofrows#1#2{% + \xa\xdef\csname #1@numrows\endcsname{#2}% +}% + +\def\qr@setnumberofcols#1#2{% + \xa\xdef\csname #1@numcols\endcsname{#2}% +}% + +\newlength\qr@desiredheight +\setlength\qr@desiredheight{2cm}% +\newlength\qr@modulesize +\newlength\qr@minipagewidth + +\def\qr@printmatrix#1{% + \def\qr@black{\rule{\qr@modulesize}{\qr@modulesize}}% + \def\qr@white{\rule{\qr@modulesize}{0pt}}% + \def\qr@black@fixed{\rule{\qr@modulesize}{\qr@modulesize}}% + \def\qr@white@fixed{\rule{\qr@modulesize}{0pt}}% + \def\qr@black@format{\rule{\qr@modulesize}{\qr@modulesize}}% + \def\qr@white@format{\rule{\qr@modulesize}{0pt}}% + %Set module size + \setlength{\qr@modulesize}{\qr@desiredheight}% + \divide\qr@modulesize by \qr@size\relax% + % + \setlength{\qr@minipagewidth}{\qr@modulesize}% + \multiply\qr@minipagewidth by \qr@size\relax% + \ifqr@tight + \else + \advance\qr@minipagewidth by 8\qr@modulesize% + \fi + \begin{minipage}{\qr@minipagewidth}% + \baselineskip=\qr@modulesize% + \ifqr@tight\else\rule{0pt}{4\qr@modulesize}\par\fi% %Blank space at top. + \qr@for \i = 1 to \qr@numberofrowsinmatrix{#1} by 1% + {\ifqr@tight\else\rule{4\qr@modulesize}{0pt}\fi% %Blank space at left. + \qr@for \j = 1 to \qr@numberofcolsinmatrix{#1} by 1% + {\qr@matrixentry{#1}{\the\i}{\the\j}}% + \par}% + \ifqr@tight\else\rule{0pt}{4\qr@modulesize}\par\fi% + \end{minipage}% +}% + +\def\qr@printsavedbinarymatrix#1{% + \edef\qr@binarystring{#1\relax\relax}% + %Set module size + \setlength{\qr@modulesize}{\qr@desiredheight}% + \divide\qr@modulesize by \qr@size\relax% + % + \setlength{\qr@minipagewidth}{\qr@modulesize}% + \multiply\qr@minipagewidth by \qr@size\relax% + \ifqr@tight + \else + \advance\qr@minipagewidth by 8\qr@modulesize% + \fi + \begin{minipage}{\qr@minipagewidth}% + \baselineskip=\qr@modulesize% + \ifqr@tight\else\rule{0pt}{4\qr@modulesize}\par\fi% %Blank space at top. + \qr@for \i = 1 to \qr@size by 1% + {\ifqr@tight\else\rule{4\qr@modulesize}{0pt}\fi% %Blank space at left. + \qr@for \j = 1 to \qr@size by 1% + {\edef\qr@theargument{(\qr@binarystring)}% + \xa\qr@printsavedbinarymatrix@int\qr@theargument + }% + \par}% + \ifqr@tight\else\rule{0pt}{4\qr@modulesize}\par\fi% + \end{minipage}% +}% + +\def\qr@printsavedbinarymatrix@int(#1#2){% + % #1 = first bit, either 1 or 0. + % #2 = remainder of string, terminating with \relax\relax + % There's no need to check for EOF here, because + % we'll only call this n^2 times. + \ifcase #1\relax + \rule{\qr@modulesize}{0pt}% % 0: white square + \or + \rule{\qr@modulesize}{\qr@modulesize}% % 1: black square + \fi + \xdef\qr@binarystring{#2}% +}% + +\def\qr@createliteralmatrix#1#2#3{% + % #1 = matrix name + % #2 = m, the number of rows and columns in the square matrix + % #3 = a string of m^2 tokens to be written into the matrix + \qr@creatematrix{#1}% + \xa\xdef\csname #1@numrows\endcsname{#2}% + \xa\xdef\csname #1@numcols\endcsname{#2}% + \gdef\qr@literalmatrix@tokens{#3}% + \qr@for \i = 1 to #2 by 1% + {\qr@for \j = 1 to #2 by 1% + {\xa\qr@createliteralmatrix@int\xa(\qr@literalmatrix@tokens)% + \qr@estoretomatrix{#1}{\the\i}{\the\j}{\qr@entrytext}% + }% + }% +} +\def\qr@createliteralmatrix@int(#1#2){% + \def\qr@entrytext{#1}% + \gdef\qr@literalmatrix@tokens{#2}% +} + +\qr@createliteralmatrix{finderpattern}{8}{% + \qr@black@fixed\qr@black@fixed\qr@black@fixed\qr@black@fixed\qr@black@fixed\qr@black@fixed\qr@black@fixed\qr@white@fixed% + \qr@black@fixed\qr@white@fixed\qr@white@fixed\qr@white@fixed\qr@white@fixed\qr@white@fixed\qr@black@fixed\qr@white@fixed% + \qr@black@fixed\qr@white@fixed\qr@black@fixed\qr@black@fixed\qr@black@fixed\qr@white@fixed\qr@black@fixed\qr@white@fixed% + \qr@black@fixed\qr@white@fixed\qr@black@fixed\qr@black@fixed\qr@black@fixed\qr@white@fixed\qr@black@fixed\qr@white@fixed% + \qr@black@fixed\qr@white@fixed\qr@black@fixed\qr@black@fixed\qr@black@fixed\qr@white@fixed\qr@black@fixed\qr@white@fixed% + \qr@black@fixed\qr@white@fixed\qr@white@fixed\qr@white@fixed\qr@white@fixed\qr@white@fixed\qr@black@fixed\qr@white@fixed% + \qr@black@fixed\qr@black@fixed\qr@black@fixed\qr@black@fixed\qr@black@fixed\qr@black@fixed\qr@black@fixed\qr@white@fixed% + \qr@white@fixed\qr@white@fixed\qr@white@fixed\qr@white@fixed\qr@white@fixed\qr@white@fixed\qr@white@fixed\qr@white@fixed% +}% + +\qr@createliteralmatrix{alignmentpattern}{5}{% + \qr@black@fixed\qr@black@fixed\qr@black@fixed\qr@black@fixed\qr@black@fixed% + \qr@black@fixed\qr@white@fixed\qr@white@fixed\qr@white@fixed\qr@black@fixed% + \qr@black@fixed\qr@white@fixed\qr@black@fixed\qr@white@fixed\qr@black@fixed% + \qr@black@fixed\qr@white@fixed\qr@white@fixed\qr@white@fixed\qr@black@fixed% + \qr@black@fixed\qr@black@fixed\qr@black@fixed\qr@black@fixed\qr@black@fixed% +}% + +\def\qr@copymatrixentry#1#2#3#4#5#6{% + % Copy the (#2,#3) entry of matrix #1 + % to the (#5,#6) position of matrix #4. + \xa\xa\xa\global% + \xa\xa\xa\let\xa\xa\csname #4@#5@#6\endcsname% + \csname #1@#2@#3\endcsname% +}% + +\def\qr@createduplicatematrix#1#2{% + % #1 = name of copy + % #2 = original matrix to be copied + \qr@creatematrix{#1}% + \qr@for \i = 1 to \qr@numberofrowsinmatrix{#2} by 1% + {\qr@for \j = 1 to \qr@numberofcolsinmatrix{#2} by 1% + {\qr@copymatrixentry{#2}{\the\i}{\the\j}{#1}{\the\i}{\the\j}% + }% + }% + \qr@setnumberofrows{#1}{\qr@numberofrowsinmatrix{#2}}% + \qr@setnumberofcols{#1}{\qr@numberofcolsinmatrix{#2}}% +}% + +\def\qr@placefinderpattern@int#1#2#3#4#5{% + % Work on matrix #1. + % Start in position (#2, #3) -- should be a corner + % #4 indicates horizontal direction (1=right, -1=left) + % #5 indicates vertical direction (1=down, -1=up) + % + % In this code, \sourcei and \sourcej are TeX counts working through the finderpattern matrix, + % and i and j are LaTeX counters indicating positions in the big matrix. + \setcounter{qr@i}{#2}% + \qr@for \sourcei=1 to 8 by 1% + {\setcounter{qr@j}{#3}% + \qr@for \sourcej=1 to 8 by 1% + {\qr@copymatrixentry{finderpattern}{\the\sourcei}{\the\sourcej}% + {#1}{\theqr@i}{\theqr@j}% + \addtocounter{qr@j}{#5}% + }% + \addtocounter{qr@i}{#4}% + }% +}% + +\def\qr@placefinderpatterns#1{% + % #1=matrix name + \qr@placefinderpattern@int{#1}{1}{1}{1}{1}% + \qr@placefinderpattern@int{#1}{\qr@numberofrowsinmatrix{#1}}{1}{-1}{1}% + \qr@placefinderpattern@int{#1}{1}{\qr@numberofcolsinmatrix{#1}}{1}{-1}% +}% + +\def\qr@placetimingpatterns#1{% + %Set \qr@endingcol to n-8. + \qr@a=\qr@size\relax% + \advance\qr@a by -8\relax% + \edef\qr@endingcol{\the\qr@a}% + \qr@for \j = 9 to \qr@endingcol by 1% + {\ifodd\j\relax% + \qr@storetomatrix{#1}{7}{\the\j}{\qr@black@fixed}% + \qr@storetomatrix{#1}{\the\j}{7}{\qr@black@fixed}% + \else% + \qr@storetomatrix{#1}{7}{\the\j}{\qr@white@fixed}% + \qr@storetomatrix{#1}{\the\j}{7}{\qr@white@fixed}% + \fi% + }% +}% + +\def\qr@placealignmentpattern@int#1#2#3{% + % Work on matrix #1. + % Write an alignment pattern into the matrix, centered on (#2,#3). + \qr@a=#2\relax% + \advance\qr@a by -2\relax% + \qr@b=#3\relax% + \advance\qr@b by -2\relax% + \setcounter{qr@i}{\the\qr@a}% + \qr@for \i=1 to 5 by 1% + {\setcounter{qr@j}{\the\qr@b}% + \qr@for \j=1 to 5 by 1% + {\qr@copymatrixentry{alignmentpattern}{\the\i}{\the\j}% + {#1}{\theqr@i}{\theqr@j}% + \stepcounter{qr@j}% + }% + \stepcounter{qr@i}% + }% +}% + +\newif\ifqr@incorner% +\def\qr@placealignmentpatterns#1{% + %There are k^2-3 alignment patterns, + %arranged in a (k x k) grid within the matrix. + %They begin in row 7, column 7, + %except that the ones in the NW, NE, and SW corners + %are omitted because of the finder patterns. + %Recall that + % * \qr@k stores k, + % * \qr@alignment@firstskip stores how far between the 1st and 2nd row/col, & + % * \qr@alignment@generalskip stores how far between each subsequent row/col. + \xa\ifnum\qr@k>0\relax + %There will be at least one alignment pattern. + %N.B. k cannot equal 1. + \xa\ifnum\qr@k=2\relax + % 2*2-3 = exactly 1 alignment pattern. + \qr@a=7\relax + \advance\qr@a by \qr@alignment@firstskip\relax + \xdef\qr@target@ii{\the\qr@a}% + \qr@placealignmentpattern@int{#1}{\qr@target@ii}{\qr@target@ii}% + \else + % k is at least 3, so the following loops should be safe. + \xdef\qr@target@ii{7}% + \qr@for \ii = 1 to \qr@k by 1% + {\ifcase\ii\relax% + \relax% \ii should never equal 0. + \or + \xdef\qr@target@ii{7}% If \ii = 1, we start in row 7. + \or + %If \ii = 2, we add the firstskip. + \qr@a=\qr@target@ii\relax% + \advance\qr@a by \qr@alignment@firstskip\relax% + \xdef\qr@target@ii{\the\qr@a}% + \else + %If \ii>2, we add the generalskip. + \qr@a=\qr@target@ii\relax% + \advance\qr@a by \qr@alignment@generalskip\relax% + \xdef\qr@target@ii{\the\qr@a}% + \fi + \qr@for \jj = 1 to \qr@k by 1% + {\ifcase\jj\relax% + \relax% \jj should never equal 0. + \or + \xdef\qr@target@jj{7}% If \jj=1, we start in row 7. + \or + %If \jj=2, we add the firstskip. + \qr@a=\qr@target@jj\relax% + \advance\qr@a by \qr@alignment@firstskip% + \xdef\qr@target@jj{\the\qr@a}% + \else + %If \jj>2, we add the generalskip. + \qr@a=\qr@target@jj\relax% + \advance\qr@a by \qr@alignment@generalskip% + \xdef\qr@target@jj{\the\qr@a}% + \fi + \qr@incornerfalse% + \ifnum\ii=1\relax + \ifnum\jj=1\relax + \qr@incornertrue + \else + \ifnum\qr@k=\jj\relax + \qr@incornertrue + \fi + \fi + \else + \xa\ifnum\qr@k=\ii\relax + \ifnum\jj=1\relax + \qr@incornertrue + \fi + \fi + \fi + \ifqr@incorner + \relax + \else + \qr@placealignmentpattern@int{#1}{\qr@target@ii}{\qr@target@jj}% + \fi + }% ends \qr@for \jj + }% ends \qr@for \ii + \fi + \fi +}% + +\def\qr@placedummyformatpatterns#1{% + \qr@for \j = 1 to 9 by 1% + {\ifnum\j=7\relax% + \else% + \qr@storetomatrix{#1}{9}{\the\j}{\qr@format@square}% + \qr@storetomatrix{#1}{\the\j}{9}{\qr@format@square}% + \fi% + }% + \setcounter{qr@j}{\qr@size}% + \qr@for \j = 1 to 8 by 1% + {\qr@storetomatrix{#1}{9}{\theqr@j}{\qr@format@square}% + \qr@storetomatrix{#1}{\theqr@j}{9}{\qr@format@square}% + \addtocounter{qr@j}{-1}% + }% + %Now go back and change the \qr@format@square in (n-8,9) to \qr@black@fixed. + \addtocounter{qr@j}{1}% + \qr@storetomatrix{#1}{\theqr@j}{9}{\qr@black@fixed}% +}% + +\def\qr@placedummyversionpatterns#1{% + \xa\ifnum\qr@version>6\relax + %Must include version information. + \global\c@qr@i=\qr@size% + \global\advance\c@qr@i by -10\relax% + \qr@for \i = 1 to 3 by 1% + {\qr@for \j = 1 to 6 by 1% + {\qr@storetomatrix{#1}{\theqr@i}{\the\j}{\qr@format@square}% + \qr@storetomatrix{#1}{\the\j}{\theqr@i}{\qr@format@square}% + }% + \stepcounter{qr@i}% + }% + \fi +}% + +\def\qr@writebit(#1#2)#3{% + % #3 = matrix name + % (qr@i,qr@j) = position to write in (LaTeX counters) + % #1 = bit to be written + % #2 = remaining bits plus '\relax' as an end-of-file marker + \edef\qr@datatowrite{#2}% + \ifnum#1=1 + \qr@storetomatrix{#3}{\theqr@i}{\theqr@j}{\qr@black}% + \else + \qr@storetomatrix{#3}{\theqr@i}{\theqr@j}{\qr@white}% + \fi +}% + +\newif\ifqr@rightcol +\newif\ifqr@goingup + +\def\qr@writedata@hex#1#2{% + % #1 = name of a matrix that has been prepared with finder patterns, timing patterns, etc. + % #2 = a string consisting of bytes to write into the matrix, in two-char hex format. + \setcounter{qr@i}{\qr@numberofrowsinmatrix{#1}}% + \setcounter{qr@j}{\qr@numberofcolsinmatrix{#1}}% + \qr@rightcoltrue% + \qr@goinguptrue% + \edef\qr@argument{{#1}(#2\relax\relax\relax)}% + \xa\qr@writedata@hex@recursive\qr@argument% +}% + +\def\qr@writedata@hex@recursive#1(#2#3#4){% + % #1 = name of a matrix that has been prepared with finder patterns, timing patterns, etc. + % (qr@i,qr@j) = position to write in LaTeX counters + % #2#3#4 contains the hex codes of the bytes to be written, plus \relax\relax\relax + % as an end-of-file marker + \edef\qr@testii{#2}% + \ifx\qr@testii\qr@relax% + % #2 is \relax, so there is nothing more to write. + \relax + \let\qr@next=\relax + \else + % #2 is not \relax, so there is another byte to write. + \qr@hextobinary[8]{\bytetowrite}{#2#3}% + \xdef\qr@datatowrite{\bytetowrite\relax}% %Add terminating "\relax" + \qr@writedata@recursive{#1}% %This function actually writes the 8 bits. + \edef\qr@argument{{#1}(#4)}% + \xa\def\xa\qr@next\xa{\xa\qr@writedata@hex@recursive\qr@argument}% %Call self to write the next bit. + \fi + \qr@next +}% + +\def\qr@writedata#1#2{% + % #1 = name of a matrix that has been prepared with finder patterns, timing patterns, etc. + % #2 = a string consisting of 0's and 1's to write into the matrix. + \setcounter{qr@i}{\qr@numberofrowsinmatrix{#1}}% + \setcounter{qr@j}{\qr@numberofcolsinmatrix{#1}}% + \qr@rightcoltrue + \qr@goinguptrue + \edef\qr@datatowrite{#2\relax}% + \qr@writedata@recursive{#1}% +}% + +\def\qr@@blank{\qr@blank}% + +\def\qr@writedata@recursive#1{% + % #1 = matrix name + % (qr@i,qr@j) = position to write in (LaTeX counters) + % \qr@datatowrite contains the bits to be written, plus '\relax' as an end-of-file marker + \xa\let\xa\squarevalue\csname #1@\theqr@i @\theqr@j\endcsname% + \ifx\squarevalue\qr@@blank + %Square is blank, so write data in it. + \xa\qr@writebit\xa(\qr@datatowrite){#1}% + %The \qr@writebit macro not only writes the first bit of \qr@datatowrite into the matrix, + %but also removes the bit from the 'bitstream' of \qr@datatowrite. + \fi + %Now adjust our position in the matrix. + \ifqr@rightcol + %From the right-hand half of the two-bit column, we always move left. Easy peasy. + \addtocounter{qr@j}{-1}% + \qr@rightcolfalse + \else + %If we're in the left-hand column, things are harder. + \ifqr@goingup + %First, suppose we're going upwards. + \ifnum\c@qr@i>1\relax% + %If we're not in the first row, things are easy. + %We move one to the right and one up. + \addtocounter{qr@j}{1}% + \addtocounter{qr@i}{-1}% + \qr@rightcoltrue + \else + %If we are in the first row, then we move to the left, + %and we are now in the right-hand column on a downward pass. + \addtocounter{qr@j}{-1}% + \qr@goingupfalse + \qr@rightcoltrue + \fi + \else + %Now, suppose we're going downwards. + \xa\ifnum\qr@size>\c@qr@i\relax% + %If we're not yet in the bottom row, things are easy. + %We move one to the right and one down. + \addtocounter{qr@j}{1}% + \addtocounter{qr@i}{1}% + \qr@rightcoltrue + \else + %If we are in the bottom row, then we move to the left, + %and we are now in the right-hand column on an upward pass. + \addtocounter{qr@j}{-1}% + \qr@rightcoltrue + \qr@goinguptrue + \fi + \fi + %One problem: what if we just moved into the 7th column? + %Das ist verboten. + %If we just moved (left) into the 7th column, we should move on into the 6th column. + \ifnum\c@qr@j=7\relax% + \setcounter{qr@j}{6}% + \fi + \fi + %Now check whether there are any more bits to write. + \ifx\qr@datatowrite\qr@relax + % \qr@datatowrite is just `\relax', so we're done. + \let\qr@next=\relax + \relax + \else + % Write some more! + \def\qr@next{\qr@writedata@recursive{#1}}% + \fi + \qr@next +}% + +\def\qr@writeremainderbits#1{% + % #1 = name of a matrix that has been prepared and partly filled. + % (qr@i,qr@j) = position to write in LaTeX counters + \xa\ifnum\qr@numremainderbits>0\relax + \def\qr@datatowrite{}% + \qr@for \i = 1 to \qr@numremainderbits by 1% + {\g@addto@macro{\qr@datatowrite}{0}}% + \g@addto@macro{\qr@datatowrite}{\relax}% terminator + \qr@writedata@recursive{#1}% + \fi +}% + +\newif\ifqr@cellinmask + +\def\qr@setmaskingfunction#1{% + % #1 = 1 decimal digit for the mask. (I see no reason to use the 3-bit binary code.) + % The current position is (\themaski,\themaskj), with indexing starting at 0. + \edef\qr@maskselection{#1}% + \xa\ifcase\qr@maskselection\relax + %Case 0: checkerboard + \def\qr@parsemaskingfunction{% + % Compute mod(\themaski+\themaskj,2)% + \qr@a=\c@maski% + \advance\qr@a by \c@maskj% + \qr@b=\qr@a% + \divide\qr@b by 2% + \multiply\qr@b by 2% + \advance\qr@a by -\qr@b% + \edef\qr@maskfunctionresult{\the\qr@a}% + }% + \or + %Case 1: horizontal stripes + \def\qr@parsemaskingfunction{% + % Compute mod(\themaski,2)% + \ifodd\c@maski\relax% + \def\qr@maskfunctionresult{1}% + \else% + \def\qr@maskfunctionresult{0}% + \fi% + }% + \or + %Case 2: vertical stripes + \def\qr@parsemaskingfunction{% + % Compute mod(\themaskj,3)% + \qr@a=\c@maskj% + \divide\qr@a by 3% + \multiply\qr@a by 3% + \advance\qr@a by -\c@maskj% + \edef\qr@maskfunctionresult{\the\qr@a}% + }% + \or + %Case 3: diagonal stripes + \def\qr@parsemaskingfunction{% + % Compute mod(\themaski+\themaskj,3)% + \qr@a=\c@maski% + \advance\qr@a by \c@maskj% + \qr@b=\qr@a% + \divide\qr@b by 3% + \multiply\qr@b by 3% + \advance\qr@b by -\qr@a% + \edef\qr@maskfunctionresult{\the\qr@b}% + }% + \or + %Case 4: wide checkerboard + \def\qr@parsemaskingfunction{% + % Compute mod(floor(\themaski/2) + floor(\themaskj/3),2) % + \qr@a=\c@maski% + \divide\qr@a by 2% + \qr@b=\c@maskj% + \divide\qr@b by 3% + \advance\qr@a by \qr@b% + \qr@b=\qr@a% + \divide\qr@a by 2% + \multiply\qr@a by 2% + \advance\qr@a by -\qr@b% + \edef\qr@maskfunctionresult{\the\qr@a}% + }% + \or + %Case 5: quilt + \def\qr@parsemaskingfunction{% + % Compute mod(\themaski*\themaskj,2) + mod(\themaski*\themaskj,3) % + \qr@a=\c@maski% + \multiply\qr@a by \c@maskj% + \qr@b=\qr@a% + \qr@c=\qr@a% + \divide\qr@a by 2% + \multiply\qr@a by 2% + \advance\qr@a by -\qr@c% (result will be -mod(i*j,2), which is negative.) + \divide\qr@b by 3% + \multiply\qr@b by 3% + \advance\qr@b by -\qr@c% (result will be -mod(i*j,3), which is negative.) + \advance\qr@a by \qr@b% (result is negative of what's in the spec.) + \edef\qr@maskfunctionresult{\the\qr@a}% + }% + \or + %Case 6: arrows + \def\qr@parsemaskingfunction{% + % Compute mod( mod(\themaski*\themaskj,2) + mod(\themaski*\themaskj,3) , 2 ) % + \qr@a=\c@maski% + \multiply\qr@a by \c@maskj% + \qr@b=\qr@a% + \qr@c=\qr@a% + \multiply\qr@c by 2% % \qr@c equals 2*i*j. + \divide\qr@a by 2% + \multiply\qr@a by 2% + \advance\qr@c by -\qr@a% Now \qr@c equals i*j + mod(i*j,2). + \divide\qr@b by 3% + \multiply\qr@b by 3% + \advance\qr@c by -\qr@b% (Now \qr@c equals mod(i*j,2) + mod(i*j,3). + \qr@a=\qr@c% + \divide\qr@a by 2% + \multiply\qr@a by 2% + \advance\qr@c by-\qr@a% + \edef\qr@maskfunctionresult{\the\qr@c}% + }% + \or + %Case 7: shotgun + \def\qr@parsemaskingfunction{% + % Compute mod( mod(\themaski+\themaskj,2) + mod(\themaski*\themaskj,3) , 2 ) % + \qr@a=\c@maski% + \advance\qr@a by \c@maskj% %So \qr@a = i+j + \qr@b=\c@maski% + \multiply\qr@b by \c@maskj% %So \qr@b = i*j + \qr@c=\qr@a% + \advance\qr@c by \qr@b% So \qr@c = i+j+i*j + \divide\qr@a by 2% + \multiply\qr@a by 2% + \advance\qr@c by -\qr@a% So \qr@c = mod(i+j,2) + i*j + \divide\qr@b by 3% + \multiply\qr@b by 3% + \advance\qr@c by -\qr@b% So \qr@c = mod(i+j,2) + mod(i*j,3) + \qr@a=\qr@c% + \divide\qr@c by 2% + \multiply\qr@c by 2% + \advance\qr@a by -\qr@c% + \edef\qr@maskfunctionresult{\the\qr@a}% + }% + \fi +}% + +\def\qr@checkifcellisinmask{% + % The current position is (\i,\j), in TeX counts, + % but the LaTeX counters (maski,maskj) should contain + % the current position with indexing starting at 0. + % That is, maski = \i-1 and maskj = \j-1. + % + % \qr@parsemaskingfunction must have been set by a call to \qr@setmaskingfunction + \qr@parsemaskingfunction + \xa\ifnum\qr@maskfunctionresult=0\relax + \qr@cellinmasktrue + \else + \qr@cellinmaskfalse + \fi +}% + +\newcounter{maski}% +\newcounter{maskj}% + +\def\qr@applymask#1#2#3{% + % #1 = name of a matrix that should be filled out completely + % except for the format and/or version information. + % #2 = name of a new matrix to contain the masked version + % #3 = 1 decimal digit naming the mask + \qr@createduplicatematrix{#2}{#1}% + \qr@setmaskingfunction{#3}% + \setcounter{maski}{-1}% + \qr@for \i = 1 to \qr@size by 1% + {\stepcounter{maski}% + \setcounter{maskj}{-1}% + \qr@for \j = 1 to \qr@size by 1% + {\stepcounter{maskj}% + \qr@checkifcellisinmask + \ifqr@cellinmask + \qr@checkifcurrentcellcontainsdata{#2}% + \ifqr@currentcellcontainsdata + \qr@flipcurrentcell{#2}% + \fi + \fi + }% + }% +}% + +\newif\ifqr@currentcellcontainsdata +\qr@currentcellcontainsdatafalse + +\def\qr@@white{\qr@white}% +\def\qr@@black{\qr@black}% + +\def\qr@checkifcurrentcellcontainsdata#1{% + % #1 = name of matrix + \qr@currentcellcontainsdatafalse + \xa\ifx\csname #1@\the\i @\the\j\endcsname\qr@@white + \qr@currentcellcontainsdatatrue + \fi + \xa\ifx\csname #1@\the\i @\the\j\endcsname\qr@@black + \qr@currentcellcontainsdatatrue + \fi +}% + +\def\qr@flipped@black{\qr@black}% +\def\qr@flipped@white{\qr@white}% + +\def\qr@flipcurrentcell#1{% + % #1 = name of matrix + % (\i, \j) = current position, in TeX counts. + % This assumes the cell contains data, either black or white! + \xa\ifx\csname #1@\the\i @\the\j\endcsname\qr@@white + \qr@storetomatrix{#1}{\the\i}{\the\j}{\qr@flipped@black}% + \else + \qr@storetomatrix{#1}{\the\i}{\the\j}{\qr@flipped@white}% + \fi +}% + +\def\qr@chooseandapplybestmask#1{% + % #1 = name of a matrix that should be filled out completely + % except for the format and/or version information. + % This function applies all eight masks in succession, + % calculates their penalties, and remembers the best. + % The number indicating which mask was used is saved in \qr@mask@selected. + \qr@createduplicatematrix{originalmatrix}{#1}% + \message{^^J}% + \gdef\qr@currentbestmask{0}% + \qr@for \i = 1 to 7 by 1% + {\message{^^J}% + \xa\xa\xa\ifnum\xa\qr@penalty\xa<\qr@currentbestpenalty\relax + %We found a better mask. + \xdef\qr@currentbestmask{\the\i}% + \qr@createduplicatematrix{#1}{currentmasked}% + \xdef\qr@currentbestpenalty{\qr@penalty}% + \fi + }% + \xdef\qr@mask@selected{\qr@currentbestmask}% + \message{^^J}% +}% + +\def\qr@Ni{3}% +\def\qr@Nii{3}% +\def\qr@Niii{40}% +\def\qr@Niv{10}% +\def\qr@fiveones{11111}% +\def\qr@fivezeros{11111}% +\def\qr@twoones{11}% +\def\qr@twozeros{00}% +\def\qr@finderA{00001011101}% +\def\qr@finderB{10111010000}% +\def\qr@finderB@three{1011101000}% +\def\qr@finderB@two{101110100}% +\def\qr@finderB@one{10111010}% +\def\qr@finderB@zero{1011101}% +\newif\ifqr@stringoffive +\def\qr@addpenaltyiii{% + \addtocounter{penaltyiii}{\qr@Niii}% +}% +\newcounter{totalones}% +\newcounter{penaltyi}% +\newcounter{penaltyii}% +\newcounter{penaltyiii}% +\newcounter{penaltyiv}% +\def\qr@evaluatemaskpenalty#1{% + % #1 = name of a matrix that we will test for the penalty + % according to the specs. + \setcounter{penaltyi}{0}% + \setcounter{penaltyii}{0}% + \setcounter{penaltyiii}{0}% + \setcounter{penaltyiv}{0}% + \bgroup%localize the meanings we give to the symbols + \def\qr@black{1}\def\qr@white{0}% + \def\qr@black@fixed{1}\def\qr@white@fixed{0}% + \def\qr@format@square{0}% This is not stated in the specs, but seems + % to be the standard implementation. + \def\qr@blank{0}% These would be any bits at the end. + % + \setcounter{totalones}{0}% + \qr@for \i=1 to \qr@size by 1% + {\def\qr@lastfive{z}% %The z is a dummy, that will be removed before any testing. + \qr@stringoffivefalse + \def\qr@lasttwo@thisrow{z}% %The z is a dummy. + \def\qr@lasttwo@nextrow{z}% %The z is a dummy. + \def\qr@lastnine{z0000}% %The 0000 stands for the white space to the left. The z is a dummy. + \def\qr@ignore@finderB@at{0}% + \qr@for \j=1 to \qr@size by 1% + {\edef\qr@newbit{\qr@matrixentry{#1}{\the\i}{\the\j}}% + % + % LASTFIVE CODE FOR PENALTY 1 + % First, add the new bit to the end. + \xa\g@addto@macro\xa\qr@lastfive\xa{\qr@newbit}% + \ifnum\j<5\relax% + %Not yet on the 5th entry. + %Don't do any testing. + \else + % 5th entry or later. + % Remove the old one, and then test. + \qr@removefirsttoken\qr@lastfive% + \ifx\qr@lastfive\qr@fiveones% + \ifqr@stringoffive% + %This is a continuation of a previous block of five or more 1's. + \stepcounter{penaltyi}% + \else + %This is a new string of five 1's. + \addtocounter{penaltyi}{\qr@Ni}% + \global\qr@stringoffivetrue + \fi + \else + \ifx\qr@lastfive\qr@fivezeros% + \ifqr@stringoffive + %This is a continuation of a previous block of five or more 0's. + \stepcounter{penaltyi}% + \else + %This is a new string of five 0's. + \addtocounter{penaltyi}{\qr@Ni}% + \global\qr@stringoffivetrue + \fi + \else + %This is not a string of five 1's or five 0's. + \global\qr@stringoffivefalse + \fi + \fi + \fi + % + % 2x2 BLOCKS FOR PENALTY 2 + % Every 2x2 block of all 1's counts for \qr@Nii penalty points. + % We do not need to run this test in the last row. + \xa\ifnum\xa\i\xa<\qr@size\relax + \xa\g@addto@macro\xa\qr@lasttwo@thisrow\xa{\qr@newbit}% + %Compute \qr@iplusone + \qr@a=\i\relax% + \advance\qr@a by 1% + \edef\qr@iplusone{\the\qr@a}% + % + \edef\qr@nextrowbit{\qr@matrixentry{#1}{\qr@iplusone}{\the\j}}% + \xa\g@addto@macro\xa\qr@lasttwo@nextrow\xa{\qr@nextrowbit}% + \ifnum\j<2\relax% + %Still in the first column; no check. + \else + %Second column or later. Remove the old bits, and then test. + \qr@removefirsttoken\qr@lasttwo@thisrow + \qr@removefirsttoken\qr@lasttwo@nextrow + \ifx\qr@lasttwo@thisrow\qr@twoones + \ifx\qr@lasttwo@nextrow\qr@twoones + \addtocounter{penaltyii}{\qr@Nii}% + \fi + \else + \ifx\qr@lasttwo@thisrow\qr@twozeros + \ifx\qr@lasttwo@nextrow\qr@twozeros + \addtocounter{penaltyii}{\qr@Nii}% + \fi + \fi + \fi + \fi + \fi + % + % LASTNINE CODE FOR PENALTY 3 + % First, add the new bit to the end. + \xa\g@addto@macro\xa\qr@lastnine\xa{\qr@newbit}% + \ifnum\j<7\relax% + %Not yet on the 7th entry. + %Don't do any testing. + \else + % 7th entry or later. + % Remove the old one, and then test. + \qr@removefirsttoken\qr@lastnine + \xa\ifnum\qr@size=\j\relax% + % Last column. Any of the following should count: + % 1011101 (\qr@finderB@zero) + % 10111010 (\qr@finderB@one) + % 101110100 (\qr@finderB@two) + % 1011101000 (\qr@finderB@three) + % 10111010000 (\qr@finderB) + \ifx\qr@lastnine\qr@finderB + \qr@addpenaltyiii + \else + \qr@removefirsttoken\qr@lastnine + \ifx\qr@lastnine\qr@finderB@three + \qr@addpenaltyiii + \else + \qr@removefirsttoken\qr@lastnine + \ifx\qr@lastnine\qr@finderB@two + \qr@addpenaltyiii + \else + \qr@removefirsttoken\qr@lastnine + \ifx\qr@lastnine\qr@finderB@one + \qr@addpenaltyiii + \else + \qr@removefirsttoken\qr@lastnine + \ifx\qr@lastnine\qr@finderB@zero + \qr@addpenaltyiii + \fi + \fi + \fi + \fi + \fi + \else + \ifx\qr@lastnine\qr@finderA% %Matches 0000 1011101 + \qr@addpenaltyiii + %Also, we record our discovery, so that we can't count this pattern again + %if it shows up four columns later as 1011101 0000. + % + %Set \qr@ignore@finderB@at to \j+4. + \qr@a=\j\relax% + \advance\qr@a by 4% + \xdef\qr@ignore@finderB@at{\the\qr@a}% + \else + \ifx\qr@lastfive\qr@finderB% %Matches 1011101 0000. + \xa\ifnum\qr@ignore@finderB@at=\j\relax + %This pattern was *not* counted already earlier. + \qr@addpenaltyiii + \fi + \fi + \fi + \fi + \fi + % + %COUNT 1's FOR PENALTY 4 + \xa\ifnum\qr@newbit=1\relax% + \stepcounter{totalones}% + \fi + }% end of j-loop + }% end of i-loop + % + %NOW WE ALSO NEED TO RUN DOWN THE COLUMNS TO FINISH CALCULATING PENALTIES 1 AND 3. + \qr@for \j=1 to \qr@size by 1% + {\def\qr@lastfive{z}% %The z is a dummy, that will be removed before any testing. + \qr@stringoffivefalse + \def\qr@lastnine{z0000}% %The 0000 stands for the white space to the left. The z is a dummy. + \def\qr@ignore@finderB@at{0}% + \qr@for \i=1 to \qr@size by 1% + {\edef\qr@newbit{\qr@matrixentry{#1}{\the\i}{\the\j}}% + % + % LASTFIVE CODE FOR PENALTY 1 + % First, add the new bit to the end. + \xa\g@addto@macro\xa\qr@lastfive\xa{\qr@newbit}% + \ifnum\i<5\relax% + %Not yet on the 5th entry. + %Don't do any testing. + \else + % 5th entry or later. + % Remove the old one, and then test. + \qr@removefirsttoken\qr@lastfive% + \ifx\qr@lastfive\qr@fiveones% + \ifqr@stringoffive% + %This is a continuation of a previous block of five or more 1's. + \stepcounter{penaltyi}% + \else + %This is a new string of five 1's. + \addtocounter{penaltyi}{\qr@Ni}% + \global\qr@stringoffivetrue + \fi + \else + \ifx\qr@lastfive\qr@fivezeros% + \ifqr@stringoffive + %This is a continuation of a previous block of five or more 0's. + \stepcounter{penaltyi}% + \else + %This is a new string of five 0's. + \addtocounter{penaltyi}{\qr@Ni}% + \global\qr@stringoffivetrue + \fi + \else + %This is not a string of five 1's or five 0's. + \global\qr@stringoffivefalse + \fi + \fi + \fi + % + % HAPPILY, WE DON'T NEED TO CALCULATE PENALTY 2 AGAIN. + % + % LASTNINE CODE FOR PENALTY 3 + % First, add the new bit to the end. + \xa\g@addto@macro\xa\qr@lastnine\xa{\qr@newbit}% + \ifnum\i<7\relax% + %Not yet on the 7th entry. + %Don't do any testing. + \else + % 7th entry or later. + % Remove the old one, and then test. + \qr@removefirsttoken\qr@lastnine + \xa\ifnum\qr@size=\i\relax% + % Last column. Any of the following should count: + % 1011101 (\qr@finderB@zero) + % 10111010 (\qr@finderB@one) + % 101110100 (\qr@finderB@two) + % 1011101000 (\qr@finderB@three) + % 10111010000 (\qr@finderB) + \ifx\qr@lastnine\qr@finderB + \qr@addpenaltyiii + \else + \qr@removefirsttoken\qr@lastnine + \ifx\qr@lastnine\qr@finderB@three + \qr@addpenaltyiii + \else + \qr@removefirsttoken\qr@lastnine + \ifx\qr@lastnine\qr@finderB@two + \qr@addpenaltyiii + \else + \qr@removefirsttoken\qr@lastnine + \ifx\qr@lastnine\qr@finderB@one + \qr@addpenaltyiii + \else + \qr@removefirsttoken\qr@lastnine + \ifx\qr@lastnine\qr@finderB@zero + \qr@addpenaltyiii + \fi + \fi + \fi + \fi + \fi + \else + \ifx\qr@lastnine\qr@finderA% %Matches 0000 1011101 + \qr@addpenaltyiii + %Also, we record our discovery, so that we can't count this pattern again + %if it shows up four columns later as 1011101 0000. + % + %Set \qr@ignore@finderB@at to \i+4. + \qr@a=\i\relax% + \advance\qr@a by 4% + \xdef\qr@ignore@finderB@at{\the\qr@a}% + \else + \ifx\qr@lastfive\qr@finderB% %Matches 1011101 0000. + \xa\ifnum\qr@ignore@finderB@at=\i\relax + %This pattern was *not* counted already earlier. + \qr@addpenaltyiii + \fi + \fi + \fi + \fi + \fi + % + }% end of i-loop + }% end of j-loop + \egroup% + % + %CALCULATE PENALTY 4 + %According to the spec, penalty #4 is computed as + % floor( |(i/n^2)-0.5|/0.05 ) + % where i is the total number of 1's in the matrix. + % This is equal to abs(20*i-10n^2) div n^2. + % + \qr@a=\c@totalones\relax + \multiply\qr@a by 20\relax + \qr@b=\qr@size\relax + \multiply\qr@b by \qr@size\relax + \qr@c=10\relax + \multiply\qr@c by \qr@b\relax + \advance\qr@a by -\qr@c\relax + \ifnum\qr@a<0\relax + \multiply\qr@a by -1\relax + \fi + \divide\qr@a by \qr@b\relax + \setcounter{penaltyiv}{\the\qr@a}% + % + %CALCULATE TOTAL PENALTY + \qr@a=\thepenaltyi\relax% + \advance\qr@a by \thepenaltyii\relax% + \advance\qr@a by \thepenaltyiii\relax% + \advance\qr@a by \thepenaltyiv\relax% + \edef\qr@penalty{\the\qr@a}% +}% + +\def\qr@removefirsttoken#1{% + %Removes the first token from the macro named in #1. + \edef\qr@argument{(#1)}% + \xa\qr@removefirsttoken@int\qr@argument% + \xdef#1{\qr@removefirsttoken@result}% +}% +\def\qr@removefirsttoken@int(#1#2){% + \def\qr@removefirsttoken@result{#2}% +}% + +\def\qr@writeformatstring#1#2{% + % #1 = matrix name + % #2 = binary string representing the encoded and masked format information + \setcounter{qr@i}{9}% + \setcounter{qr@j}{1}% + \edef\qr@argument{{#1}(#2\relax)}% + \xa\qr@writeformatA@recursive\qr@argument + % + \setcounter{qr@i}{\qr@numberofrowsinmatrix{#1}}% + \setcounter{qr@j}{9}% + \xa\qr@writeformatB@recursive\qr@argument +}% + +\def\qr@writeformatA@recursive#1(#2#3){% + % #1 = matrix name + % #2 = first bit of string + % #3 = rest of bitstream + % (qr@i,qr@j) = current (valid) position to write (in LaTeX counters) + \ifnum#2=1\relax + \qr@storetomatrix{#1}{\theqr@i}{\theqr@j}{\qr@black@format}% + \else + \qr@storetomatrix{#1}{\theqr@i}{\theqr@j}{\qr@white@format}% + \fi + % Now the tricky part--moving \i and \j to their next positions. + \ifnum\c@qr@j<9\relax + %If we're not yet in column 9, move right. + \stepcounter{qr@j}% + \ifnum\c@qr@j=7\relax + %But we skip column 7! + \stepcounter{qr@j}% + \fi + \else + %If we're in column 9, we move up. + \addtocounter{qr@i}{-1}% + \ifnum\c@qr@i=7\relax + %But we skip row 7! + \addtocounter{qr@i}{-1}% + \fi + \fi + %N.B. that at the end of time, this will leave us at invalid position (0,9). + %That makes for an easy test to know when we are done. + \ifnum\c@qr@i<1 + \let\qr@next=\relax + \else + \def\qr@next{\qr@writeformatA@recursive{#1}(#3)}% + \fi + \qr@next +}% + +\def\qr@writeformatB@recursive#1(#2#3){% + % #1 = matrix name + % #2 = first bit of string + % #3 = rest of bitstream + % (qr@i,qr@j) = current (valid) position to write (in LaTeX counters) + \ifnum#2=1\relax + \qr@storetomatrix{#1}{\theqr@i}{\theqr@j}{\qr@black@format}% + \else + \qr@storetomatrix{#1}{\theqr@i}{\theqr@j}{\qr@white@format}% + \fi + % Now the tricky part--moving counters i and j to their next positions. + \qr@a=\qr@size% + \advance\qr@a by -6\relax% + \ifnum\qr@a<\c@qr@i\relax + %If we're not yet in row n-6, move up. + \addtocounter{qr@i}{-1}% + \else + \ifnum\qr@a=\c@qr@i\relax + %If we're actually in row n-6, we jump to position (9,n-7). + \setcounter{qr@i}{9}% + %Set counter j equal to \qr@size-7. + \global\c@qr@j=\qr@size\relax% + \global\advance\c@qr@j by -7\relax% + \else + %Otherwise, we must be in row 9. + %In this case, we move right. + \stepcounter{qr@j}% + \fi + \fi + %N.B. that at the end of time, this will leave us at invalid position (9,n+1). + %That makes for an easy test to know when we are done. + \xa\ifnum\qr@size<\c@qr@j\relax + \let\qr@next=\relax + \else + \def\qr@next{\qr@writeformatB@recursive{#1}(#3)}% + \fi + \qr@next +}% + +\def\qr@writeversionstring#1#2{% + % #1 = matrix name + % #2 = binary string representing the encoded version information + % + % Plot the encoded version string into the matrix. + % This is only done for versions 7 and higher. + \xa\ifnum\qr@version>6\relax + %Move to position (n-8,6). + \setcounter{qr@i}{\qr@size}\relax% + \addtocounter{qr@i}{-8}\relax% + \setcounter{qr@j}{6}% + \edef\qr@argument{{#1}(#2\relax)}% + \xa\qr@writeversion@recursive\qr@argument + \fi +}% + +\def\qr@writeversion@recursive#1(#2#3){% + % #1 = matrix name + % #2 = first bit of string + % #3 = rest of bitstream + % (qr@i,qr@j) = current (valid) position to write (in LaTeX counters) + % + % The version information is stored symmetrically in the matrix + % In two transposed regions, so we can write both at the same time. + % In the comments, we describe what happens in the lower-left region, + % not the upper-right. + % + %Set \qr@topline equal to n-10. + \qr@a=\qr@size\relax% + \advance\qr@a by -10\relax% + \edef\qr@topline{\the\qr@a}% + % + \ifnum#2=1\relax + \qr@storetomatrix{#1}{\theqr@i}{\theqr@j}{\qr@black@format}% + \qr@storetomatrix{#1}{\theqr@j}{\theqr@i}{\qr@black@format}% + \else + \qr@storetomatrix{#1}{\theqr@i}{\theqr@j}{\qr@white@format}% + \qr@storetomatrix{#1}{\theqr@j}{\theqr@i}{\qr@white@format}% + \fi + % Now the tricky part--moving counters i and j to their next positions. + \addtocounter{qr@i}{-1}% + \xa\ifnum\qr@topline>\c@qr@i\relax + %We've overshot the top of the region. + %We need to move left one column and down three. + \addtocounter{qr@j}{-1}% + \addtocounter{qr@i}{3}% + \fi + %N.B. that at the end of time, this will leave us at invalid position (n-8,0). + %That makes for an easy test to know when we are done. + \ifnum\c@qr@j<1\relax + \let\qr@next=\relax + \else + \def\qr@next{\qr@writeversion@recursive{#1}(#3)}% + \fi + \qr@next +}% +\newcounter{qr@hexchars}% + +\def\qr@string@binarytohex#1{% + \qr@binarytohex{\qr@hex@result}{#1}% +}% + +\def\qr@encode@binary#1{% + % #1 = string of ascii characters, to be converted into bitstream + % + % We do this one entirely in hex, rather than binary, because we can. + \edef\qr@plaintext{#1}% + % + %First, the mode indicator. + \def\qr@codetext{4}% %This means `binary' + % + %Next, the character count. + \qr@getstringlength{\qr@plaintext}% + %Set \qr@charactercountlengthinhex to \qr@charactercountbits@byte/4% + \qr@a=\qr@charactercountbits@byte\relax% + \divide \qr@a by 4\relax% + \edef\qr@charactercountlengthinhex{\the\qr@a}% + \qr@decimaltohex[\qr@charactercountlengthinhex]{\qr@charactercount}{\qr@stringlength}% + \xa\g@addto@macro\xa\qr@codetext\xa{\qr@charactercount}% + % + %Now comes the actual data. + \edef\qr@argument{(,\qr@plaintext\relax\relax\relax)}% + \xa\qr@encode@ascii@recursive\qr@argument% + % + %Now the terminator. + \g@addto@macro\qr@codetext{0}% %This is '0000' in binary. + % + %There is no need to pad bits to make a multiple of 8, + %because the data length is already 4 + 8 + 8n + 4. + % + %Now add padding codewords if needed. + \setcounter{qr@hexchars}{0}% + \qr@getstringlength{\qr@codetext}% + \setcounter{qr@hexchars}{\qr@stringlength}% + %Set \qr@numpaddingcodewords equal to \qr@totaldatacodewords - qr@hexchars/2. + \qr@a=-\c@qr@hexchars\relax + \divide\qr@a by 2\relax + \advance\qr@a by \qr@totaldatacodewords\relax + \edef\qr@numpaddingcodewords{\the\qr@a}% + % + \xa\ifnum\qr@numpaddingcodewords<0% + \edef\ds{ERROR: Too much data! Over by \qr@numpaddingcodewords bytes.}\show\ds% + \fi% + \xa\ifnum\qr@numpaddingcodewords>0% + \qr@for \i = 2 to \qr@numpaddingcodewords by 2% + {\g@addto@macro{\qr@codetext}{ec11}}% + \xa\ifodd\qr@numpaddingcodewords\relax% + \g@addto@macro{\qr@codetext}{ec}% + \fi% + \fi% +}% + +\def\qr@encode@ascii@recursive(#1,#2#3){% + % #1 = hex codes translated so far + % #2 = next plaintext character to translate + % #3 = remainder of plaintext + \edef\qr@testii{#2}% + \ifx\qr@testii\qr@relax% + % All done! + \g@addto@macro\qr@codetext{#1}% + \else% + % Another character to translate. + \edef\qr@asciicode{\number`#2}% + \qr@decimaltohex[2]{\qr@newhexcodes}{\qr@asciicode}% + \edef\qr@argument{(#1\qr@newhexcodes,#3)}% + %\show\qr@argument + \xa\qr@encode@ascii@recursive\qr@argument% + \fi% +}% + +\def\qr@splitcodetextintoblocks{% + \setcounter{qr@i}{0}% + \qr@for \j = 1 to \qr@numshortblocks by 1% + {\stepcounter{qr@i}% + \qr@splitoffblock{\qr@codetext}{\theqr@i}{\qr@shortblock@size}% + }% + \xa\ifnum\qr@numlongblocks>0\relax% + \qr@for \j = 1 to \qr@numlongblocks by 1% + {\stepcounter{qr@i}% + \qr@splitoffblock{\qr@codetext}{\theqr@i}{\qr@longblock@size}% + }% + \fi% +}% + +\def\qr@splitoffblock#1#2#3{% + % #1 = current codetext in hexadecimal + % #2 = number to use in csname "\datablock@#2". + % #3 = number of bytes to split off + \message{}% + \xa\gdef\csname datablock@#2\endcsname{}% %This line is important! + \qr@for \i = 1 to #3 by 1% + {\edef\qr@argument{{#2}(#1)}% + \xa\qr@splitoffblock@int\qr@argument% + }% +}% + +\def\qr@splitoffblock@int#1(#2#3#4){% + % #1 = number to use in csname "\datablock@#1". + % #2#3 = next byte to split off + % #4 = remaining text + % + % We add the next byte to "\datablock@#1", + % and we remove it from the codetext. + \xa\xdef\csname datablock@#1\endcsname{\csname datablock@#1\endcsname#2#3}% + \xdef\qr@codetext{#4}% +}% + +\def\qr@createerrorblocks{% + \qr@for \ii = 1 to \qr@numblocks by 1% + {\message{}% + \FX@generate@errorbytes{\csname datablock@\the\ii\endcsname}{\qr@num@eccodewords}% + \xa\xdef\csname errorblock@\the\ii\endcsname{\FX@errorbytes}% + }% +}% + +\def\qr@interleave{% + \setcounter{qr@i}{0}% + \def\qr@interleaved@text{}% + \message{0\relax% + \message{\qr@longblock@size.>}% + \else + \message{.>}% + \fi + \message{}% +}% + +\def\qr@writefromblock#1#2{% + % #1 = either 'datablock' or 'errorblock' + % #2 = block number, in {1,...,\qr@numblocks}% + \edef\qr@argument{(\csname #1@#2\endcsname\relax\relax\relax)}% + \xa\qr@writefromblock@int\qr@argument + \xa\xdef\csname #1@#2\endcsname{\qr@writefromblock@remainder}% +}% + +\def\qr@writefromblock@int(#1#2#3){% + % #1#2 = first byte (in hex) of text, which will be written to \qr@interleaved@text + % #3 = remainder, including \relax\relax\relax terminator. + \g@addto@macro{\qr@interleaved@text}{#1#2}% + \qr@writefromblock@intint(#3)% +}% + +\def\qr@writefromblock@intint(#1\relax\relax\relax){% + \xdef\qr@writefromblock@remainder{#1}% +}% +\let\xa=\expandafter +\makeatletter + +\def\qr@preface@macro#1#2{% + % #1 = macro name + % #2 = text to add to front of macro + \def\qr@tempb{#2}% + \xa\xa\xa\gdef\xa\xa\xa#1\xa\xa\xa{\xa\qr@tempb #1}% +}% + +\newif\ifqr@leadingcoeff +\def\qr@testleadingcoeff(#1#2){% + % Tests whether the leading digit of #1#2 is 1. + \ifnum#1=1\relax + \qr@leadingcoefftrue + \else + \qr@leadingcoefffalse + \fi +}% + +\def\qr@polynomialdivide#1#2{% + \edef\qr@numerator{#1}% + \edef\qr@denominator{#2}% + \qr@divisiondonefalse% + \xa\xa\xa\qr@oneroundofdivision\xa\xa\xa{\xa\qr@numerator\xa}\xa{\qr@denominator}% +}% + +\def\@qr@empty{}% +\def\qr@oneroundofdivision#1#2{% + % #1 = f(x), of degree n + % #2 = g(x), of degree m + % Obtains a new polynomial h(x), congruent to f(x) modulo g(x), + % but of degree at most n-1. + % + % If leading coefficient of f(x) is 1, subtracts off g(x) * x^(n-m). + % If leading coefficient of f(x) is 0, strips off that leading zero. + % + \qr@testleadingcoeff(#1)% + \ifqr@leadingcoeff + \qr@xorbitstrings{#1}{#2}% + \ifqr@xorfailed + %If xor failed, that means our #1 was already the remainder! + \qr@divisiondonetrue + \edef\qr@theremainder{#1}% + \else + %xor succeeded. We need to recurse. + \xa\xa\xa\edef\xa\xa\xa\qr@numerator\xa\xa\xa{\xa\qr@stripleadingzero\xa(\qr@xorresult)}% + \fi + \else + \xa\def\xa\qr@numerator\xa{\qr@stripleadingzero(#1)}% + \ifx\qr@numerator\@qr@empty + \qr@divisiondonetrue + \def\qr@theremainder{0}% + \fi + \fi + \ifqr@divisiondone + \relax + \else + \xa\qr@oneroundofdivision\xa{\qr@numerator}{#2}% + \fi +}% + +\def\qr@stripleadingzero(0#1){#1}%Strips off a leading zero. + +\newif\ifqr@xorfailed% This flag will trigger when #2 is longer than #1. + +\def\qr@xorbitstrings#1#2{% + % #1 = bitstring + % #2 = bitstring no longer than #1 + \qr@xorfailedfalse + \edef\qr@argument{(,#1\relax\relax)(#2\relax\relax)}% + \xa\qr@xorbitstrings@recursive\qr@argument + %\qr@xorbitstrings@recursive(,#1\relax\relax)(#2\relax\relax)% +}% + +\def\qr@xorbitstrings@recursive(#1,#2#3)(#4#5){% + % #1#2#3 is the first bitstring, xor'ed up through #1. + % #4#5 is the remaining portion of the second bitstring. + \def\qr@testii{#2}% + \def\qr@testiv{#4}% + \ifx\qr@testii\qr@relax + % #1 contains the whole string. + % Now if #4 is also \relax, that means the two strings started off with equal lengths. + % If, however, #4 is not \relax, that means the second string was longer than the first, a problem. + \ifx\qr@testiv\qr@relax + %No problem. We are done. + \qr@xorbit@saveresult(#1#2#3)% + \else + %Problem! The second string was longer than the first. + \qr@xorfailedtrue + \def\qr@xorresult{}% + \fi + \else + % There is still a bit to manipulate in #2. + % Check whether #4 contains anything. + \ifx\qr@testiv\qr@relax + % No, #4 is empty. We are done. "#2#3" contains the remainder of the first string, + % which we append untouched and then strip off the two \relax-es. + \qr@xorbit@saveresult(#1#2#3)% + \else + % Yes, #4 still has something to XOR. Do the task. + \ifnum#2=#4\relax + \qr@xorbitstrings@recursive(#1% + 0,#3)(#5)% + \else + \qr@xorbitstrings@recursive(#1% + 1,#3)(#5)% + \fi + \fi + \fi +}% + +\def\qr@xorbit@saveresult(#1\relax\relax){% + %Strips off the extra '\relax'es at the end. + \def\qr@xorresult{#1}% +}% + +\newif\ifqr@divisiondone + +\def\qr@BCHcode#1{% + \edef\qr@formatinfo{#1}% + \def\qr@formatinfopadded{\qr@formatinfo 0000000000}% + \def\qr@divisor{10100110111}% + \qr@divisiondonefalse + \qr@polynomialdivide{\qr@formatinfopadded}{\qr@divisor}% + % + \qr@getstringlength{\qr@theremainder}% + %Run loop from stringlength+1 to 10. + \qr@a=\qr@stringlength\relax% + \advance\qr@a by 1\relax% + \qr@for \i = \qr@a to 10 by 1% + {\qr@preface@macro{\qr@theremainder}{0}% + \xdef\qr@theremainder{\qr@theremainder}% + }% + \edef\qr@BCHresult{\qr@formatinfo\qr@theremainder}% +}% + +\def\qr@formatmask{101010000010010}% + +\def\qr@encodeandmaskformat#1{% + \qr@BCHcode{#1}% + \qr@xorbitstrings{\qr@BCHresult}{\qr@formatmask}% + \edef\qr@format@bitstring{\qr@xorresult}% +}% + +\def\qr@Golaycode#1{% + % #1 = 6-bit version number + \edef\qr@versioninfo{#1}% + \def\qr@versioninfopadded{\qr@versioninfo 000000000000}% %Append 12 zeros. + \def\qr@divisor{1111100100101}% + \qr@divisiondonefalse + \qr@polynomialdivide{\qr@versioninfopadded}{\qr@divisor}% + % + \qr@getstringlength{\qr@theremainder}% + %Run loop from stringlength+1 to 12. + \qr@a=\qr@stringlength\relax% + \advance\qr@a by 1\relax% + \qr@for \i = \qr@a to 12 by 1% + {\qr@preface@macro{\qr@theremainder}{0}% + \xdef\qr@theremainder{\qr@theremainder}% + }% + \edef\qr@Golayresult{\qr@versioninfo\qr@theremainder}% +}% +\def\F@result{}% + +\def\qr@xorbitstring#1#2#3{% + % #1 = new macro to receive result + % #2, #3 = bitstrings to xor. The second can be shorter than the first. + \def\qr@xor@result{}% + \edef\qr@argument{(#2\relax\relax)(#3\relax\relax)}% + \xa\qr@xorbitstring@recursive\qr@argument% + \edef#1{\qr@xor@result}% +}% +\def\qr@xorbitstring@recursive(#1#2)(#3#4){% + \edef\qr@testi{#1}% + \ifx\qr@testi\qr@relax% + %Done. + \let\qr@next=\relax% + \else + \if#1#3\relax + \g@addto@macro{\qr@xor@result}{0}% + \else + \g@addto@macro{\qr@xor@result}{1}% + \fi + \edef\qr@next{\noexpand\qr@xorbitstring@recursive(#2)(#4)}% + \fi + \qr@next +} + +\def\F@addchar@raw#1#2{% + %Add two hexadecimal digits using bitwise xor + \qr@hextobinary[4]{\qr@summandA}{#1}% + \qr@hextobinary[4]{\qr@summandB}{#2}% + \qr@xorbitstring{\F@result}{\qr@summandA}{\qr@summandB}% + \qr@binarytohex[1]{\F@result}{\F@result}% +}% + +\def\qr@canceltwos#1{% + \edef\qr@argument{(#1\relax\relax)}% + \xa\qr@canceltwos@int\qr@argument% +}% + +\def\qr@canceltwos@int(#1#2){% + \xa\qr@canceltwos@recursion(,#1#2)% +}% + +\def\qr@canceltwos@recursion(#1,#2#3){% + \def\qr@testii{#2}% + \ifx\qr@testii\qr@relax + %Cancelling complete. + \qr@striptworelaxes(#1#2#3)% + %Now \F@result contains the answer. + \else + \relax + \ifnum#2=2\relax + \qr@canceltwos@recursion(#10,#3)% + \else + \qr@canceltwos@recursion(#1#2,#3)% + \fi + \fi +}% + +\def\qr@striptworelaxes(#1\relax\relax){% + \gdef\F@result{#1}% +}% + +\qr@for \i = 0 to 15 by 1% + {\qr@decimaltohex[1]{\qr@tempa}{\the\i}% + \qr@for \j = 0 to 15 by 1% + {\qr@decimaltohex[1]{\qr@tempb}{\the\j}% + \F@addchar@raw\qr@tempa\qr@tempb + \xa\xdef\csname F@addchar@\qr@tempa\qr@tempb\endcsname{\F@result}% + }% + }% + +\def\F@addchar#1#2{% + \xa\def\xa\F@result\xa{\csname F@addchar@#1#2\endcsname}% +}% + +\def\F@addstrings#1#2{% + \edef\qr@argument{(,#1\relax\relax)(#2\relax\relax)}% + \xa\F@addstrings@recursion\qr@argument% +}% + +\def\F@addstrings@recursion(#1,#2#3)(#4#5){% + %Adds two hexadecimal strings, bitwise, from left to right. + %The second string is allowed to be shorter than the first. + \def\qr@testii{#2}% + \def\qr@testiv{#4}% + \ifx\qr@testii\qr@relax + %The entire string has been processed. + \gdef\F@result{#1}% + \else + \ifx\qr@testiv\qr@relax + %The second string is over. + \qr@striptworelaxes(#1#2#3)% + %Now \F@result contains the answer. + \else + %We continue to add. + \F@addchar{#2}{#4}% + \edef\qr@argument{(#1\F@result,#3)(#5)}% + \xa\F@addstrings@recursion\qr@argument% + \fi + \fi +}% +\gdef\F@stripleadingzero(0#1){\edef\F@result{#1}}% + +\setcounter{qr@i}{0}% +\def\qr@poweroftwo{1}% +\qr@for \i = 1 to 254 by 1% + {\stepcounter{qr@i}% + \qr@a=\qr@poweroftwo\relax + \multiply\qr@a by 2\relax + \edef\qr@poweroftwo{\the\qr@a}% + %\show\qr@poweroftwo + \qr@decimaltohex[2]{\qr@poweroftwo@hex}{\qr@poweroftwo}% + \xa\ifnum\qr@poweroftwo>255\relax + %We need to bitwise add the polynomial represented by 100011101, i.e. 0x11d. + \F@addstrings{\qr@poweroftwo@hex}{11d}% %Now it should start with 0. + \xa\F@stripleadingzero\xa(\F@result)% %Now it should be two hex digits. + \edef\qr@poweroftwo@hex{\F@result}% %Save the hex version. + \qr@hextodecimal{\qr@poweroftwo}{\F@result}% + \fi + \xdef\qr@poweroftwo{\qr@poweroftwo}% + \xa\xdef\csname F@twotothe@\theqr@i\endcsname{\qr@poweroftwo@hex}% + \xa\xdef\csname F@logtwo@\qr@poweroftwo@hex\endcsname{\theqr@i}% + }% +\xa\xdef\csname F@twotothe@0\endcsname{01}% +\xa\xdef\csname F@logtwo@01\endcsname{0}% + +\def\F@twotothe#1{% + \xa\xdef\xa\F@result\xa{\csname F@twotothe@#1\endcsname}% +}% +\def\F@logtwo#1{% + \xa\xdef\xa\F@result\xa{\csname F@logtwo@#1\endcsname}% +}% + +\def\qr@zerozero{00}% + +\def\F@multiply#1#2{% + % #1 and #2 are two elements of F_256, + % given as two-character hexadecimal strings. + % Multiply them within F_256, and place the answer in \F@result + \edef\qr@argA{#1}% + \edef\qr@argB{#2}% + \ifx\qr@argA\qr@zerozero + \def\F@result{00}% + \else + \ifx\qr@argB\qr@zerozero + \def\F@result{00}% + \else + \xa\F@logtwo\xa{\qr@argA}% + \edef\qr@logA{\F@result}% + \xa\F@logtwo\xa{\qr@argB}% + \edef\qr@logB{\F@result}% + \xa\qr@a\xa=\qr@logA\relax% \qr@a = \qr@logA + \xa\advance\xa\qr@a\qr@logB\relax% \advance \qr@a by \qr@logB + \ifnum\qr@a>254\relax% + \advance\qr@a by -255\relax% + \fi% + \xa\F@twotothe\xa{\the\qr@a}% + % Now \F@result contains the product, as desired. + \fi + \fi +}% + +\def\F@multiply#1#2{% + % #1 and #2 are two elements of F_256, + % given as two-character hexadecimal strings. + % Multiply them within F_256, and place the answer in \F@result + \edef\qr@argA{#1}% + \edef\qr@argB{#2}% + \ifx\qr@argA\qr@zerozero + \def\F@result{00}% + \else + \ifx\qr@argB\qr@zerozero + \def\F@result{00}% + \else + \xa\F@logtwo\xa{\qr@argA}% + \edef\qr@logA{\F@result}% + \xa\F@logtwo\xa{\qr@argB}% + \edef\qr@logB{\F@result}% + \xa\qr@a\xa=\qr@logA\relax% \qr@a = \qr@logA + \xa\advance\xa\qr@a\qr@logB\relax% \advance \qr@a by \qr@logB + \ifnum\qr@a>254\relax% + \advance\qr@a by -255\relax% + \fi% + \xa\F@twotothe\xa{\the\qr@a}% + % Now \F@result contains the product, as desired. + \fi + \fi +}% + +\def\FX@getstringlength#1{% + %Count number of two-character coefficients + \setcounter{qr@i}{0}% + \xdef\qr@argument{(#1\relax\relax\relax)}% + \xa\FX@stringlength@recursive\qr@argument% + \xdef\stringresult{\arabic{qr@i}}% +}% + +\def\FX@stringlength@recursive(#1#2#3){% + \def\qr@testi{#1}% + \ifx\qr@testi\qr@relax + %we are done. + \else + \stepcounter{qr@i}% + %\showthe\c@qr@i + \qr@stringlength@recursive(#3)% + \fi +}% + +\newif\ifFX@leadingcoeff@zero +\def\FX@testleadingcoeff(#1#2#3){% + % Tests whether the leading coefficient of the hex-string #1#2#3 is '00'. + \edef\FX@leadingcoefficient{#1#2}% + \FX@leadingcoeff@zerofalse + \ifx\FX@leadingcoefficient\qr@zerozero + \FX@leadingcoeff@zerotrue + \fi +}% + +\newif\ifFX@divisiondone + +\newcounter{qr@divisionsremaining} %Keep track of how many divisions to go! +\def\FX@polynomialdivide#1#2{% + \edef\FX@numerator{#1}% + \edef\FX@denominator{#2}% + \qr@getstringlength\FX@numerator% + \setcounter{qr@divisionsremaining}{\qr@stringlength}% + \qr@getstringlength\FX@denominator% + \addtocounter{qr@divisionsremaining}{-\qr@stringlength}% + \addtocounter{qr@divisionsremaining}{2}% + \divide\c@qr@divisionsremaining by 2\relax% %2 hex chars per number + \FX@divisiondonefalse% + \xa\xa\xa\FX@polynomialdivide@recursive\xa\xa\xa{\xa\FX@numerator\xa}\xa{\FX@denominator}% +}% + +\def\FX@polynomialdivide@recursive#1#2{% + % #1 = f(x), of degree n + % #2 = g(x), of degree m + % Obtains a new polynomial h(x), congruent to f(x) modulo g(x), + % but of degree at most n-1. + % + % If leading coefficient of f(x) is 0, strips off that leading zero. + % If leading coefficient of f(x) is a, subtracts off a * g(x) * x^(n-m). + % N.B. we assume g is monic. + % + \FX@testleadingcoeff(#1)% + \ifFX@leadingcoeff@zero% + %Leading coefficient is zero, so remove it. + \xa\def\xa\FX@numerator\xa{\FX@stripleadingzero(#1)}% + \else% + %Leading coefficient is nonzero, and contained in \FX@leadingcoefficient + \FX@subtractphase{#1}{#2}{\FX@leadingcoefficient}% + \ifFX@subtract@failed% + %If subtraction failed, that means our #1 was already the remainder! + \FX@divisiondonetrue% + \edef\qr@theremainder{#1}% + \else% + %xor succeeded. We need to recurse. + \xa\xa\xa\edef\xa\xa\xa\FX@numerator\xa\xa\xa{\xa\FX@stripleadingzero\xa(\FX@subtraction@result)}% + \fi% + \fi% + \addtocounter{qr@divisionsremaining}{-1}% + \ifnum\c@qr@divisionsremaining=0\relax + %Division is done! + \FX@divisiondonetrue% + \edef\qr@theremainder{\FX@numerator}% + \relax% + \else% + \xa\FX@polynomialdivide@recursive\xa{\FX@numerator}{#2}% + \fi% +}% + +\def\FX@stripleadingzero(00#1){#1}%Strips off a single leading zero of F_256. + +\newif\ifFX@subtract@failed% This flag will trigger when #2 is longer than #1. + +\def\FX@subtractphase#1#2#3{% + % #1 = bitstring + % #2 = bitstring no longer than #1 + % #3 = leading coefficient + \FX@subtract@failedfalse% + \edef\qr@argument{(,#1\relax\relax\relax)(#2\relax\relax\relax)(#3)}% + \xa\FX@subtract@recursive\qr@argument% +}% + +\def\FX@subtract@recursive(#1,#2#3#4)(#5#6#7)(#8){% + % This is a recursive way to compute f(x) - a*g(x)*x^k. + % #1#2#3#4 is the first bitstring, subtracted up through #1. + % Thus #2#3 constitutes the next two-character coefficient. + % #5#6#7 is the remaining portion of the second bitstring. + % Thus #5#6 constitutes the next two-character coefficient + % #8 is the element a of F_256. It should contain two characters. + \def\qr@testii{#2}% + \def\qr@testv{#5}% + \ifx\qr@testii\qr@relax + % #1 contains the whole string. + % Now if #5 is also \relax, that means the two strings started off with equal lengths. + % If, however, #5 is not \relax, that means the second string was longer than the first, a problem. + \ifx\qr@testv\qr@relax + %No problem. We are done. + \FX@subtract@saveresult(#1#2#3#4)% %We keep the #2#3#4 to be sure we have all three relax-es to strip off. + \else + %Problem! The second string was longer than the first. + %This usually indicates the end of the long division process. + \FX@subtract@failedtrue + \def\FX@subtraction@result{}% + \fi + \else + % There is still a coefficient to manipulate in #2#3. + % Check whether #5 contains anything. + \ifx\qr@testv\qr@relax + % No, #5 is empty. We are done. "#2#3#4" contains the remainder of the first string, + % which we append untouched and then strip off the three \relax-es. + \FX@subtract@saveresult(#1#2#3#4)% + \else + % Yes, #5#6 still has something to XOR. Do the task. + \F@multiply{#5#6}{#8}% Multiply by the factor 'a'. + \F@addstrings{#2#3}{\F@result}% Subtract. (We're in characteristic two, so adding works.) + \edef\qr@argument{(#1\F@result,#4)(#7)(#8)}% + \xa\FX@subtract@recursive\qr@argument% + \fi + \fi +}% + +\def\FX@subtract@saveresult(#1\relax\relax\relax){% + %Strips off the three extra '\relax'es at the end. + \def\FX@subtraction@result{#1}% +}% + +\def\FX@creategeneratorpolynomial#1{% + % #1 = n, the number of error codewords desired. + % We need to create \prod_{j=0}^{n-1} (x-2^j). + \edef\FX@generator@degree{#1}% + \def\FX@generatorpolynomial{01}% Initially, set it equal to 1. + \setcounter{qr@i}{0}% + \FX@creategenerator@recursive% + %The result is now stored in \FX@generatorpolynomial +}% + +\def\FX@creategenerator@recursive{% + % \c@qr@i contains the current value of i. + % \FX@generatorpolynomial contains the current polynomial f(x), + % which should be a degree-i polynomial + % equal to \prod_{j=0}^{i-1} (x-2^j). + % (If i=0, then \FX@generatorpolynomial should be 01.) + % This recursion step should multiply the existing polynomial by (x-2^i), + % increment i by 1, and check whether we're done or not. + \edef\qr@summandA{\FX@generatorpolynomial 00}% This is f(x) * x + \edef\qr@summandB{00\FX@generatorpolynomial}% This is f(x), with a 0x^{i+1} in front. + \F@twotothe{\theqr@i}% + \edef\qr@theconstant{\F@result}% + \FX@subtractphase{\qr@summandA}{\qr@summandB}{\qr@theconstant}% + %This calculates \qr@summandA + \qr@theconstant * \qr@summandB + %and stores the result in \FX@subtraction@result + \edef\FX@generatorpolynomial{\FX@subtraction@result}% + \stepcounter{qr@i}% + \xa\ifnum\FX@generator@degree=\c@qr@i\relax% + %We just multiplied by (x-2^{n-1}), so we're done. + \relax% + \else% + %We need to do this again! + \xa% + \FX@creategenerator@recursive% + \fi% +}% + +\def\FX@generate@errorbytes#1#2{% + % #1 = datastream in hex + % #2 = number of error correction bytes requested + \edef\qr@numerrorbytes{#2}% + \xa\FX@creategeneratorpolynomial\xa{\qr@numerrorbytes}% + \edef\FX@numerator{#1}% + \qr@for \i = 1 to \qr@numerrorbytes by 1% + {\g@addto@macro\FX@numerator{00}}% %One error byte means two hex codes. + \FX@polynomialdivide{\FX@numerator}{\FX@generatorpolynomial}% + \edef\FX@errorbytes{\qr@theremainder}% +}% +\newif\ifqr@versionmodules + +\def\qr@level@char#1{% + \xa\ifcase#1 + M\or L\or H\or Q\fi}% + +\newif\ifqr@versiongoodenough +\def\qr@choose@best@version#1{% + % \qr@desiredversion = user-requested version + % \qr@desiredlevel = user-requested error-correction level + \edef\qr@plaintext{#1}% + \qr@getstringlength{\qr@plaintext}% + % + %Run double loop over levels and versions, looking for + %the smallest version that can contain our data, + %and then choosing the best error-correcting level at that version, + %subject to the level being at least as good as the user desires. + \global\qr@versiongoodenoughfalse% + \gdef\qr@bestversion{0}% + \gdef\qr@bestlevel{0}% + \ifnum\qr@desiredversion=0\relax + \qr@a=1\relax + \else + \qr@a=\qr@desiredversion\relax + \fi + \qr@for \i=\qr@a to 40 by 1 + {\edef\qr@version{\the\i}% + \global\qr@versiongoodenoughfalse + \qr@for \j=0 to 3 by 1% + {%First, we map {0,1,2,3} to {1,0,4,3}, so that we loop through {M,L,H,Q} + %in order of increasing error-correction capabilities. + \qr@a = \j\relax + \divide \qr@a by 2\relax + \multiply \qr@a by 4\relax + \advance \qr@a by 1\relax + \advance \qr@a by -\j\relax + \edef\qr@level{\the\qr@a}% + \ifnum\qr@desiredlevel=\qr@a\relax + \global\qr@versiongoodenoughtrue + \fi + \ifqr@versiongoodenough + \qr@calculate@capacity{\qr@version}{\qr@level}% + \xa\xa\xa\ifnum\xa\qr@truecapacity\xa<\qr@stringlength\relax + %Too short + \relax + \else + %Long enough! + \xdef\qr@bestversion{\qr@version}% + \xdef\qr@bestlevel{\qr@level}% + \global\i=40% + \fi + \fi + }% + }% + \edef\qr@version{\qr@bestversion}% + \edef\qr@level{\qr@bestlevel}% + \xa\ifnum\qr@desiredversion>0\relax + \ifx\qr@bestversion\qr@desiredversion\relax + %No change from desired version. + \else + %Version was increased + \message{^^J}% + \fi + \fi + \ifx\qr@bestlevel\qr@desiredlevel\relax + %No change in level. + \else + \message{^^J}% + \fi +}% + +\def\qr@calculate@capacity#1#2{% + \edef\qr@version{#1}% + \edef\qr@level{#2}% + %Calculate \qr@size, the number of modules per side. + % The formula is 4\qr@version+17. + \qr@a=\qr@version\relax% + \multiply\qr@a by 4\relax% + \advance\qr@a by 17\relax% + \edef\qr@size{\the\qr@a}% + % + % Calculate \qr@k, which governs the number of alignment patterns. + % The alignment patterns lie in a kxk square, except for 3 that are replaced by finding patterns. + % The formula is 2 + floor( \qr@version / 7 ), except that k=0 for version 1. + \xa\ifnum\qr@version=1\relax% + \def\qr@k{0}% + \else% + \qr@a=\qr@version\relax + \divide \qr@a by 7\relax + \advance\qr@a by 2\relax + \edef\qr@k{\the\qr@a}% + \fi% + % + %Calculate number of function pattern modules. + %This consists of the three 8x8 finder patterns, the two timing strips, and the (k^2-3) 5x5 alignment patterns. + %The formula is 160+2n+25(k^2-3)-10(k-2), unless k=0 in which case we just have 160+2n. + \qr@a=\qr@size\relax + \multiply\qr@a by 2\relax + \advance\qr@a by 160\relax + \xa\ifnum\qr@k=0\relax\else + %\qr@k is nonzero, hence at least 2, so we continue to add 25(k^2-3)-10(k-2). + \qr@b=\qr@k\relax + \multiply\qr@b by \qr@k\relax + \advance\qr@b by -3\relax + \multiply\qr@b by 25\relax + \advance\qr@a by \qr@b\relax + \qr@b=\qr@k\relax + \advance\qr@b by -2\relax + \multiply\qr@b by 10\relax + \advance\qr@a by -\qr@b\relax + \fi + \edef\qr@numfunctionpatternmodules{\the\qr@a}% + % + %Calculate the number of version modules, either 36 or 0. + \xa\ifnum\qr@version>6\relax + \qr@versionmodulestrue + \def\qr@numversionmodules{36}% + \else + \qr@versionmodulesfalse + \def\qr@numversionmodules{0}% + \fi + % + %Now calculate the codeword capacity and remainder bits. + %Take n^2 modules, subtract all those dedicated to finder patterns etc., format information, and version information, + %and what's left is the number of bits we can play with. + %The number of complete bytes is \qr@numdatacodewords; + %the leftover bits are \qr@numremainderbits. + \qr@a=\qr@size\relax + \multiply \qr@a by \qr@size\relax + \advance \qr@a by -\qr@numfunctionpatternmodules\relax + \advance \qr@a by -31\relax% % There are 31 format modules. + \advance \qr@a by -\qr@numversionmodules\relax + \qr@b=\qr@a\relax + \divide \qr@a by 8\relax + \edef\qr@numdatacodewords{\the\qr@a}% + \multiply\qr@a by 8\relax + \advance \qr@b by -\qr@a\relax + \edef\qr@numremainderbits{\the\qr@b}% + % + %The size of the character count indicator also varies by version. + %There are only two options, so hardcoding seems easier than expressing these functionally. + \xa\ifnum\qr@version<10\relax + \def\qr@charactercountbytes@byte{1}% + \def\qr@charactercountbits@byte{8}% + \else + \def\qr@charactercountbytes@byte{2}% + \def\qr@charactercountbits@byte{16}% + \fi + % + %Now we call on the table, from the QR specification, + %of how many blocks to divide the message into, and how many error bytes each block gets. + %This affects the true capacity for data, which we store into \qr@totaldatacodewords. + % The following macro sets \qr@numblocks and \qr@num@eccodewords + % based on Table 9 of the QR specification. + \qr@settableix + \qr@a = -\qr@numblocks\relax + \multiply \qr@a by \qr@num@eccodewords\relax + \advance\qr@a by \qr@numdatacodewords\relax + \edef\qr@totaldatacodewords{\the\qr@a}% + \advance\qr@a by -\qr@charactercountbytes@byte\relax%Subtract character count + \advance\qr@a by -1\relax% Subtract 1 byte for the 4-bit mode indicator and the 4-bit terminator at the end. + \edef\qr@truecapacity{\the\qr@a}% +} + +\def\qr@setversion#1#2{% + % #1 = version number, an integer between 1 and 40 inclusive. + % #2 = error-correction level, as an integer between 0 and 3 inclusive. + % 0 = 00 = M + % 1 = 01 = L + % 2 = 10 = H + % 3 = 11 = Q + % This macro calculates and sets a variety of global macros and/or counters + % storing version information that is used later in construction the QR code. + % Thus \qr@setversion should be called every time! + % + \edef\qr@version{#1}% + \edef\qr@level{#2}% + % + \qr@calculate@capacity{\qr@version}{\qr@level}% + %The capacity-check code sets the following: + % * \qr@size + % * \qr@k + % * \ifqr@versionmodules + % * \qr@numversionmodules + % * \qr@numdatacodewords + % * \qr@numremainderbits + % * \qr@charactercountbits@byte + % * \qr@charactercountbytes@byte + % * \qr@numblocks (via \qr@settableix) + % * \qr@num@eccodewords (via \qr@settableix) + % * \qr@totaldatacodewords + % + % The alignment patterns' square is 7 modules in from each edge. + % They are spaced "as evenly as possible" with an even number of modules between each row/column, + % unevenness in division being accommodated by making the first such gap smaller. + % The formula seems to be + % general distance = 2*round((n-13)/(k-1)/2+0.25) + % = 2*floor((n-13)/(k-1)/2+0.75) + % = 2*floor( (2*(n-13)/(k-1)+3) / 4 ) + % = (((2*(n-13)) div (k-1) + 3 ) div 4 ) * 2 + % first distance = leftovers + % The 0.25 is to accommodate version 32, which is the only time we round down. + % Otherwise a simple 2*ceiling((n-13)/(k-1)/2) would have sufficed. + % + \qr@a = \qr@size\relax + \advance\qr@a by -13\relax + \multiply\qr@a by 2\relax + \qr@b = \qr@k\relax + \advance \qr@b by -1\relax + \divide\qr@a by \qr@b\relax + \advance\qr@a by 3\relax + \divide\qr@a by 4\relax + \multiply\qr@a by 2\relax + \edef\qr@alignment@generalskip{\the\qr@a}% + % + %Now set \qr@alignment@firstskip to (\qr@size-13)-(\qr@k-2)*\qr@alignment@generalskip % + \qr@a = \qr@k\relax + \advance\qr@a by -2\relax + \multiply\qr@a by -\qr@alignment@generalskip\relax + \advance\qr@a by \qr@size\relax + \advance\qr@a by -13\relax + \edef\qr@alignment@firstskip{\the\qr@a}% + % + % + % + % Our \qr@totaldatacodewords bytes of data are broken up as evenly as possible + % into \qr@numblocks datablocks; some may be one byte longer than others. + % We set \qr@shortblock@size to floor(\qr@totaldatacodewords / \qr@numblocks) + % and \qr@numlongblocks to mod(\qr@totaldatacodewords , \qr@numblocks). + \qr@a=\qr@totaldatacodewords\relax + \divide\qr@a by \qr@numblocks\relax + \edef\qr@shortblock@size{\the\qr@a}% + \multiply\qr@a by -\qr@numblocks\relax + \advance\qr@a by \qr@totaldatacodewords\relax + \edef\qr@numlongblocks{\the\qr@a}% + % + %Set \qr@longblock@size to \qr@shortblock@size+1. + \qr@a=\qr@shortblock@size\relax + \advance\qr@a by 1\relax + \edef\qr@longblock@size{\the\qr@a}% + % + %Set \qr@numshortblocks to \qr@numblocks - \qr@numlongblocks + \qr@b=\qr@numblocks\relax + \advance\qr@b by -\qr@numlongblocks\relax + \edef\qr@numshortblocks{\the\qr@b}% +}% + +\def\qr@settableix@int(#1,#2){% + \edef\qr@numblocks{#1}% + \edef\qr@num@eccodewords{#2}% +}% + +\def\qr@settableix{% +\xa\ifcase\qr@level\relax + %00: Level 'M', medium error correction + \edef\qr@tempdata{(% + \ifcase\qr@version\relax + \relax %There is no version 0. + \or1,10% + \or1,16% + \or1,26% + \or2,18% + \or2,24% + \or4,16% + \or4,18% + \or4,22% + \or5,22% + \or5,26% + \or5,30% + \or8,22% + \or9,22% + \or9,24% + \or10,24% + \or10,28% + \or11,28% + \or13,26% + \or14,26% + \or16,26% + \or17,26% + \or17,28% + \or18,28% + \or20,28% + \or21,28% + \or23,28% + \or25,28% + \or26,28% + \or28,28% + \or29,28% + \or31,28% + \or33,28% + \or35,28% + \or37,28% + \or38,28% + \or40,28% + \or43,28% + \or45,28% + \or47,28% + \or49,28% + \fi)}% +\or + %01: Level 'L', low error correction + \edef\qr@tempdata{% + (\ifcase\qr@version\relax + \relax %There is no version 0. + \or 1,7% + \or 1,10% + \or 1,15% + \or 1,20% + \or 1,26% + \or 2,18% + \or 2,20% + \or 2,24% + \or 2,30% + \or 4,18% + \or 4,20% + \or 4,24% + \or 4,26% + \or 4,30% + \or 6,22% + \or 6,24% + \or 6,28% + \or 6,30% + \or 7,28% + \or 8,28% + \or 8,28% + \or 9,28% + \or 9,30% + \or 10,30% + \or 12,26% + \or 12,28% + \or 12,30% + \or 13,30% + \or 14,30% + \or 15,30% + \or 16,30% + \or 17,30% + \or 18,30% + \or 19,30% + \or 19,30% + \or 20,30% + \or 21,30% + \or 22,30% + \or 24,30% + \or 25,30% + \fi)}% +\or + %10: Level 'H', high error correction + \edef\qr@tempdata{(% + \ifcase\qr@version\relax + \relax %There is no version 0. + \or1,17% + \or1,28% + \or2,22% + \or4,16% + \or4,22% + \or4,28% + \or5,26% + \or6,26% + \or8,24% + \or8,28% + \or11,24% + \or11,28% + \or16,22% + \or16,24% + \or18,24% + \or16,30% + \or19,28% + \or21,28% + \or25,26% + \or25,28% + \or25,30% + \or34,24% + \or30,30% + \or32,30% + \or35,30% + \or37,30% + \or40,30% + \or42,30% + \or45,30% + \or48,30% + \or51,30% + \or54,30% + \or57,30% + \or60,30% + \or63,30% + \or66,30% + \or70,30% + \or74,30% + \or77,30% + \or81,30% + \fi)}% +\or + %11: Level 'Q', quality error correction + \edef\qr@tempdata{(% + \ifcase\qr@version\relax + \relax %There is no version 0. + \or1,13% + \or1,22% + \or2,18% + \or2,26% + \or4,18% + \or4,24% + \or6,18% + \or6,22% + \or8,20% + \or8,24% + \or8,28% + \or10,26% + \or12,24% + \or16,20% + \or12,30% + \or17,24% + \or16,28% + \or18,28% + \or21,26% + \or20,30% + \or23,28% + \or23,30% + \or25,30% + \or27,30% + \or29,30% + \or34,28% + \or34,30% + \or35,30% + \or38,30% + \or40,30% + \or43,30% + \or45,30% + \or48,30% + \or51,30% + \or53,30% + \or56,30% + \or59,30% + \or62,30% + \or65,30% + \or68,30% + \fi)}% +\fi +\xa\qr@settableix@int\qr@tempdata +}% +\define@key{qr}{version}{\edef\qr@desiredversion{#1}}% +\define@key{qr}{level}{\qr@setlevel{#1}}% +\define@key{qr}{height}{\qr@setheight{#1}}% +\define@boolkey{qr}[qr@]{tight}[true]{}% %This creates \ifqr@tight and initializes it to true. +\define@boolkey{qr}[qr@]{padding}[true]{\ifqr@padding\qr@tightfalse\else\qr@tighttrue\fi}% %Define 'padding' as antonym to 'tight' + +\def\@qr@M{M}\def\@qr@z{0}% +\def\@qr@L{L}\def\@qr@i{1}% +\def\@qr@H{H}\def\@qr@ii{2}% +\def\@qr@Q{Q}\def\@qr@iii{3}% +\def\qr@setlevel#1{% + \edef\qr@level@selected{#1}% + \ifx\qr@level@selected\@qr@M + \edef\qr@desiredlevel{0}% + \fi + \ifx\qr@level@selected\@qr@L + \edef\qr@desiredlevel{1}% + \fi + \ifx\qr@level@selected\@qr@H + \edef\qr@desiredlevel{2}% + \fi + \ifx\qr@level@selected\@qr@Q + \edef\qr@desiredlevel{3}% + \fi + \ifx\qr@level@selected\@qr@z + \edef\qr@desiredlevel{0}% + \fi + \ifx\qr@level@selected\@qr@i + \edef\qr@desiredlevel{1}% + \fi + \ifx\qr@level@selected\@qr@ii + \edef\qr@desiredlevel{2}% + \fi + \ifx\qr@level@selected\@qr@iii + \edef\qr@desiredlevel{3}% + \fi +}% + +\def\qr@setheight#1{% + \setlength{\qr@desiredheight}{#1}% +}% + +\newcommand\qrset[1]{% + \setkeys{qr}{#1}% +} + +\qrset{version=0, level=0, tight} +\newif\ifqr@starinvoked% +\def\qrcode{\@ifstar\qrcode@star\qrcode@nostar}% +\def\qrcode@star{\qr@starinvokedtrue\qrcode@i}% +\def\qrcode@nostar{\qr@starinvokedfalse\qrcode@i}% + +\newcommand\qrcode@i[1][]{% + \begingroup% + \ifqr@starinvoked% + \qr@hyperlinkfalse% + \fi% + \setkeys{qr}{#1}% + \bgroup\qr@verbatimcatcodes\qr@setescapedspecials\qrcode@in}% + +\def\qrcode@in#1{\xdef\qr@texttoencode{#1}\egroup\qrcode@int\endgroup}% + +\def\qrcode@hyperwrapper@hyperref{\href{\qr@texttoencode}}% +\def\qrcode@hyperwrapper@nohyperref{\relax}% + +\AtBeginDocument{% + \@ifpackageloaded{hyperref}% + {\global\let\qrcode@hyperwrapper=\qrcode@hyperwrapper@hyperref}% + {\global\let\qrcode@hyperwrapper=\qrcode@hyperwrapper@nohyperref}% +}% + +\def\qrcode@int{% + \message{^^J^^J^^J}% + %First, choose the version and level. + %Recall that \qr@choose@best@version sets \qr@version and \qr@level. + \xa\qr@choose@best@version\xa{\qr@texttoencode}% + \qr@setversion{\qr@version}{\qr@level}% + % + \ifqr@hyperlink% + \let\qrcode@wrapper=\qrcode@hyperwrapper% + \else% + \let\qrcode@wrapper=\relax% + \fi% + % + %Next, check whether we have already encoded this text at this version + %and level. + \qrcode@wrapper{% + \xa\ifx\csname qr@savedbinarymatrix@\qr@texttoencode @\qr@version @\qr@level\endcsname + \relax% + %This text has not yet been encoded. + \qrcode@int@new% + \else + %This text has already been encoded! + \ifqr@forget@mode + %In 'forget' mode, we deliberately recalculate anyway. + \qrcode@int@new% + \else + \qrcode@int@remember% + \fi + \fi% + }% +}% + +\def\qrcode@int@new{% + \qr@createsquareblankmatrix{newqr}{\qr@size}% + \qr@placefinderpatterns{newqr}% + \qr@placetimingpatterns{newqr}% + \qr@placealignmentpatterns{newqr}% + \qr@placedummyformatpatterns{newqr}% + \qr@placedummyversionpatterns{newqr}% + \ifqr@draft@mode + \message{^^J}% + \relax% Draft mode---don't load any data or do any work. Also don't save! + \def\qr@format@square{\qr@black}% + \def\qr@blank{\qr@white}% + \fboxsep=-\fboxrule% + \fbox{\qr@printmatrix{newqr}}% + \else + \message{^^J}% + \xa\qr@encode@binary\xa{\qr@texttoencode}% + \qr@splitcodetextintoblocks + \qr@createerrorblocks + \qr@interleave + \message{^^J}% + \qr@writeremainderbits{newqr}% + \qr@chooseandapplybestmask{newqr}% + \qr@decimaltobinary[2]{\qr@level@binary}{\qr@level}% + \qr@decimaltobinary[3]{\qr@mask@binary}{\qr@mask@selected}% + \edef\qr@formatstring{\qr@level@binary\qr@mask@binary}% + \message{^^J}% + \message{^^J}% + \message{^^J}% + % + %Also save the binary version into the aux file, for use in later runs. + \message{^^J}% + \message{^^J}% + \fi + \message{^^J}% +}% +\def\qrcode@int@remember{% + %This text has already been encoded, + %so we just copy it from the saved binary string. + \message{^^J}% + \xa\qr@printsavedbinarymatrix\xa{\csname qr@savedbinarymatrix@\qr@texttoencode @\qr@version @\qr@level\endcsname}% + % + % Now this still might need to be written to the aux file. + % + \xa\ifx\csname qr@savedflag@\qr@texttoencode @\qr@version @\qr@level\endcsname\@qr@TRUE + %Okay, this has already been written to aux file. + %Do nothing. + \relax% + \else% + %This has NOT been written to the aux file yet. + %We need to do so now. + \xa\qr@writebinarymatrixtoauxfile\xa{\csname qr@savedbinarymatrix@\qr@texttoencode @\qr@version @\qr@level\endcsname}% + \fi% +}% + +\def\qr@matrixtobinary#1{% + \def\qr@binarymatrix@result{}% + \bgroup + \def\qr@black{1}% + \def\qr@white{0}% + \def\qr@blank{0}% + \def\qr@black@fixed{1}% + \def\qr@white@fixed{0}% + \def\qr@black@format{1}% + \def\qr@white@format{0}% + % + \qr@for \i = 1 to \qr@size by 1% + {\qr@for \j = 1 to \qr@size by 1% + {\edef\qr@theentry{\qr@matrixentry{#1}{\the\i}{\the\j}}% + \xa\g@addto@macro\xa\qr@binarymatrix@result\xa{\qr@theentry}% + }% + }% + \egroup% +}% + +\def\qr@sanitize@output#1{% + %Read through ASCII text '#1' and escape backslashes and braces + \def\qr@sanitized@result{}% + \edef\qr@argument{(#1\relax\relax\relax)}% + \xa\qr@sanitize@output@int\qr@argument% +} + +\def\qr@sanitize@output@int(#1#2){% + % #1 = first character + % #2 = rest of output, including terminator + \edef\qr@testi{#1}% + \ifx\qr@testi\qr@relax + % Done. + \let\qr@next=\relax + \else + \ifx\qr@testi\qr@otherrightbrace + \edef\qr@sanitized@result{\qr@sanitized@result\qr@otherbackslash}% + \else\ifx\qr@testi\qr@otherleftbrace + \edef\qr@sanitized@result{\qr@sanitized@result\qr@otherbackslash}% + \else\ifx\qr@testi\qr@otherbackslash + \edef\qr@sanitized@result{\qr@sanitized@result\qr@otherbackslash}% + \fi + \fi + \fi + \edef\qr@sanitized@result{\qr@sanitized@result#1}% + \def\qr@next{\qr@sanitize@output@int(#2)}% + \fi + \qr@next +} + +\def\@qr@TRUE{TRUE}% +\def\qr@writebinarymatrixtoauxfile#1{% + \qr@sanitize@output{\qr@texttoencode}% + \edef\qr@theargument{{\qr@sanitized@result}{\qr@version}{\qr@level}{#1}}% + \xa\write\xa\@auxout\xa{\xa\string\xa\qr@savematrix\qr@theargument}% + % + % Now set a flag, so we don't write this again. + \xa\gdef\csname qr@savedflag@\qr@texttoencode @\qr@version @\qr@level\endcsname{TRUE}% +}% + +\gdef\qr@dummyqrsavedefinition{}% +\begingroup + \catcode`\#=12\relax + \catcode`\<=1\relax + \catcode`\{=12\relax + \catcode`\>=2\relax + \catcode`\}=12\relax + \catcode`\|=0\relax + \catcode`\\=12|relax + |gdef|qr@dummyqrsavedefinition<% + \ifx\qr@savematrix\@undefined% + \def\qr@savematrix{\begingroup\let\do\@makeother\dospecials\catcode`\{=1\catcode`\}=2\relax + \qr@savematrix@int}% + \def\qr@savematrix@int#1#2#3#4{\endgroup}% + \fi% + > +|endgroup + +\edef\qr@argument{(\qr@dummyqrsavedefinition)}% +\xa\write\xa\@auxout\xa{\qr@dummyqrsavedefinition}% + +\def\qr@savematrix{\bgroup\qr@verbatimcatcodes\qr@setescapedspecials\qr@savematrix@int}% + +\def\qr@savematrix@int#1{\xdef\qr@savedmatrix@name{#1}\egroup\qr@savematrix@int@int}% + +\def\qr@savematrix@int@int#1#2#3{% + % \qr@savedmatrix@name = encoded text + % #1 = version + % #2 = level + % #3 = binary text + \def\ds{^^J}\xa\message\xa{\ds}% + {\let\%=\qr@otherpercent + \xa\gdef\csname qr@savedbinarymatrix@\qr@savedmatrix@name @#1@#2\endcsname{#3}% + }% +}% +\endinput +%% +%% End of file `qrcode.sty'. diff --git a/tools/style/shortcuts.sty b/tools/style/shortcuts.sty new file mode 100755 index 0000000..cf883fd --- /dev/null +++ b/tools/style/shortcuts.sty @@ -0,0 +1,318 @@ +\NeedsTeXFormat{LaTeX2e} + +%%%%%%%%%%%%%%%%% +% Raccourcis % +%%%%%%%%%%%%%%%%% + +% Displaystyle +\newcommand{\ds}{\displaystyle} + +% Ensembles +\newcommand{\N}{\mathbb{N}} +\newcommand{\Z}{\mathbb{Z}} +%\newcommand{\D}{\mathbb{D}} +\newcommand{\Q}{\mathbb{Q}} +\newcommand{\R}{\mathbb{R}} +\newcommand{\C}{\mathbb{C}} + + + +% intervalles ouvert ouvert +\newcommand{\intOO}[2]{\left]{#1}\,{;}\,{#2}\right[} +% intervalles ouvert fermé +\newcommand{\intOF}[2]{\left]{#1}\,{;}\,{#2}\right]} +% intervalles fermé ouvert +\newcommand{\intFO}[2]{\left[{#1}\,{;}\,{#2}\right[} +% intervalles fermé fermé +\newcommand{\intFF}[2]{\left[{#1}\,{;}\,{#2}\right]} + + +%% Vecteurs +% représentation d'un vecteur +\newcommand{\vect}[1]{\overrightarrow{#1}} +% Norme d'un vecteur +\newcommand{\norme}[1]{||\vect{#1}||} +% Produit scalaire +\newcommand{\scal}[2]{\vect{#1} \cdot \vect{#2}} +\newcommand{\vectCoord}[2]{% + {\renewcommand{\arraystretch}{1}% + \left(\begin{array}{c} #1 \\ #2 \end{array} \right)% + }% +} + +% Les complexes +\def\Ouv{$\left(\text{O}~;~\vect{u},~\vect{v}\right)$} +\newcommand{\e}{\mathrm{\,e\,}}% le e de l'exponentielle +%\renewcommand{\i}{\mathrm{\,i\,}}% le i des complexes + +%% Proba +\newcommand{\coefBino}[2]{\vectCoord{#1}{#2}} + +%% Logique +\renewcommand{\equiv}{\Leftrightarrow} + +%% Calculatrice +\usepackage{listings} +\newcommand{\calc}[1]{\Ovalbox{\lstinline|#1|}} +%\newcommand{\calc}[1]{\verb!#1!} + +%% Autres +\newcommand{\TODO}[1]{\textcolor{red}{note(#1)}} + +% Difficulté + +\usepackage{fontawesome5} +\newcommand{\dure}{(\faBolt) } +\newcommand{\superDure}{(\faBioHazard) } + +% Icones +\newcommand{\icon}[2][scale=0.4]{% +\includegraphics[#1]{icons/#2.png}% +} + +% Icones des compétences +\newcommand{\iconScale}{0.3} +\newcommand{\Cher}[1][scale=\iconScale]{% + \icon[#1]{card-pick} +} +\newcommand{\Mod}[1][scale=\iconScale]{% + \icon[#1]{processor} +} +\newcommand{\Rep}[1][scale=\iconScale]{% + \icon[#1]{chart} +} +\newcommand{\Rai}[1][scale=\iconScale]{% + \icon[#1]{brain} + %\icon[#1]{gears} +} +\newcommand{\Cal}[1][scale=\iconScale]{% + \icon[#1]{computing} +} +\newcommand{\Com}[1][scale=\iconScale]{% + \icon[#1]{conversation} +} +\newcommand{\Con}[1][scale=\iconScale]{% + \icon[#1]{book-cover} +} + +% Pour l'évaluation par compétence +\usepackage{tikzsymbols} +\usetikzlibrary{babel, shapes, snakes} + +\RequirePackage{xstring} +\newcommand{\RepLevel}[1]{% + \IfEqCase{#1}{% + {.}{\Xey[2]}% + {0}{\Changey[2]{-1}}% + {1}{\Changey[2][black!20]{0}}% + {2}{\Changey[2][black!40]{1}}% + {3}{\Cooley[2][black!60]}% + }[\PackageError{Rep}{Undefinded type of answer: #1}{}]% +} +\newcommand{\RepT}{\Cooley[2][black!70]} +\newcommand{\RepD}{\Changey[2][black!40]{1}} +\newcommand{\RepU}{\Changey[2][black!10]{0}} +\newcommand{\RepZ}{\Changey[2]{-1}} +\newcommand{\NoRep}{\Xey[2]} + +\newcommand{\EmptySignalBar}{% + \draw (0, 0) rectangle ++(0.8, 1); + \draw (1, 0) rectangle ++(0.8, 2); + \draw (2, 0) rectangle ++(0.8, 3); + \draw (3, 0) rectangle ++(0.8, 4); +} +\newcommand{\filledSignalBar}[1]{% + \IfEqCase{#1}{% + {}{% + } + {e}{% + \EmptySignalBar + } + {3}{% + \EmptySignalBar + \filldraw[fill=green] (0, 0) rectangle ++(0.8, 1); + \filldraw[fill=green] (1, 0) rectangle ++(0.8, 2); + \filldraw[fill=green] (2, 0) rectangle ++(0.8, 3); + \filldraw[fill=green] (3, 0) rectangle ++(0.8, 4); + } + {2}{% + \EmptySignalBar + \filldraw[fill=green] (0, 0) rectangle ++(0.8, 1); + \filldraw[fill=green] (1, 0) rectangle ++(0.8, 2); + \filldraw[fill=green] (2, 0) rectangle ++(0.8, 3); + } + {1}{% + \EmptySignalBar + \filldraw[fill=yellow] (0, 0) rectangle ++(0.8, 1); + \filldraw[fill=yellow] (1, 0) rectangle ++(0.8, 2); + } + {0}{% + \EmptySignalBar + \filldraw[fill=red] (0, 0) rectangle ++(0.8, 1); + } + }[\PackageError{Assesment}{Undefinded type of answer: #1}{}]% +} + +\newcommand{\SignalBar}[1]{% + \begin{tikzpicture}[scale=0.15] + \filledSignalBar{#1} + \end{tikzpicture} +} + +\newcommand{\Assesment}[1]{% + \SignalBar{#1} + \IfEqCase{#1}{% + {3}{% + Très bonne maîtrise% + }% + {2}{% + Maîtrise satisfaisante + }% + {1}{% + Maîtrise fragile% + }% + {0}{% + Maîtrise insufisante% + }% + }[\PackageError{Assesment}{Undefinded type of answer: #1}{}]% +} + +\newcommand{\competencesStatement}{% + \begin{multicols}{3} + \noindent + Nom: \dotfill \\[0.5cm] + Prénom: \dotfill \\ + \vfill\none + \columnbreak + \noindent + \Cher Chercher \hfill \SignalBar{e}\\ + \Mod Modélser \hfill \SignalBar{e}\\ + \Rep Représenter \hfill \SignalBar{e}\\ + \vfill\none + \columnbreak + \noindent + \Rai Raisonner \hfill \SignalBar{e}\\ + \Cal Calculer \hfill \SignalBar{e}\\ + \Com Communiquer \hfill \SignalBar{e}\\ + \end{multicols} +} + + +% ########################## +% Tikz shortcuts +% ########################## + +% Les dessins +\RequirePackage{tikz} + +%% le cercle trigo +\newcommand{\cercleTrigo}% +{% + \draw[->, very thick] (-1.1,0) -- (1.1, 0); + \draw[->, very thick] (0,-1.1) -- (0,1.1); + \draw[very thick] (0,0) circle (1); + \draw (0,0) node[below left] {$O$}; + \draw (1,0) node[below right] {$I$}; + \draw (0,1) node[above left] {$J$}; +} + +\newcommand{\cercleTrigoNoOIJ}% +{% + \draw[->, very thick] (-1.1,0) -- (1.1, 0); + \draw[->, very thick] (0,-1.1) -- (0,1.1); + \draw[very thick] (0,0) circle (1); +} + +%% Le repère orthonormé avec la grille +%%% \repere{xmin}{xmax}{ymin}{ymax} +\newcommand{\repere}[4]% +{% + \draw[very thin, gray] (#1,#3) grid (#2,#4); + \draw[->, very thick] (#1,0) -- (#2,0); + \draw[->, very thick] (0,#3) -- (0,#4); + \draw (0,0) node[below left] {$O$}; + \draw (1, 0) node [below left] {1}; + \draw (0, 1) node [below left] {1}; + } +\newcommand{\repereOIJ}[4]% +{% + \draw[very thin, gray] (#1,#3) grid (#2,#4); + \draw[->, very thick] (#1,0) -- (#2,0); + \draw[->, very thick] (0,#3) -- (0,#4); + \draw (0,0) node[below left] {$O$}; + \draw[->, very thick] (0, 0) -- node [below, midway] {$\vect{i}$} (1, 0); + \draw[->, very thick] (0, 0) -- node [left, midway] {$\vect{j}$} (0, 1); + } +\newcommand{\repereNoGrid}[4]% +{% + \draw[->, very thick] (#1,0) -- (#2,0); + \draw[->, very thick] (0,#3) -- (0,#4); + } + +%% Diagramme boite +%%% \boxplot{Vertical Center}{min}{Q1}{Me}{Q3}{Max} +\newcommand{\boxplot}[6]% +{% + \filldraw[color=highlightbg, draw=text] (#3, {#1 - 0.5}) rectangle (#5, {#1 + 0.5}); + \draw (#2, {#1 - 0.5}) -- (#2, {#1 + 0.5}) node[above] {$Min$}; + \draw (#3, {#1 - 0.5}) -- (#3, {#1 + 0.5}) node[above] {$Q_1$}; + \draw (#4, {#1 - 0.5}) -- (#4, {#1 + 0.5}) node[above] {$Me$}; + \draw (#5, {#1 - 0.5}) -- (#5, {#1 + 0.5}) node[above] {$Q_3$}; + \draw (#6, {#1 - 0.5}) -- (#6, {#1 + 0.5}) node[above] {$Max$}; + + \draw (#2, #1) -- (#3, #1); + \draw (#5, #1) -- (#6, #1); + + %\draw ({(#2 +#3)/2}, #1) node[above] {25\%}; + %\draw ({(#3 +#4)/2}, #1) node[above] {25\%}; + %\draw ({(#4 +#5)/2}, #1) node[above] {25\%}; + %\draw ({(#5 +#6)/2}, #1) node[above] {25\%}; + +} +\newcommand{\boxplotNoNames}[6]% +{% + \filldraw[color=highlightbg, draw=text] (#3, {#1 - 0.5}) rectangle (#5, {#1 + 0.5}); + \draw (#2, {#1 - 0.5}) -- (#2, {#1 + 0.5}); + \draw (#3, {#1 - 0.5}) -- (#3, {#1 + 0.5}); + \draw (#4, {#1 - 0.5}) -- (#4, {#1 + 0.5}); + \draw (#5, {#1 - 0.5}) -- (#5, {#1 + 0.5}); + \draw (#6, {#1 - 0.5}) -- (#6, {#1 + 0.5}); + + \draw (#2, #1) -- (#3, #1); + \draw (#5, #1) -- (#6, #1); +} + +\usetikzlibrary{quotes,arrows.meta} + +\tikzset{ + % drawing parallelepipoid + annotated cuboid/.pic={ + \tikzset{% + every edge quotes/.append style={midway, auto}, + /cuboid/.cd, + #1 + } + \draw [every edge/.append style={pic actions, densely dashed, opacity=.5}, pic actions] + (0,0,0) coordinate (o) -- ++(-\cubescale*\cubex,0,0) coordinate (a) -- ++(0,-\cubescale*\cubey,0) coordinate (b) edge coordinate [pos=1] (g) ++(0,0,-\cubescale*\cubez) -- ++(\cubescale*\cubex,0,0) coordinate (c) -- cycle + (o) -- ++(0,0,-\cubescale*\cubez) coordinate (d) -- ++(0,-\cubescale*\cubey,0) coordinate (e) edge (g) -- (c) -- cycle + (o) -- (a) -- ++(0,0,-\cubescale*\cubez) coordinate (f) edge (g) -- (d) -- cycle; + \path [every edge/.append style={pic actions, |-|}] + (b) +(0,-5pt) coordinate (b1) edge ["\cubex \cubeunits"'] (b1 -| c) + (b) +(-5pt,0) coordinate (b2) edge ["\cubey \cubeunits"] (b2 |- a) + (c) +(3.5pt,-3.5pt) coordinate (c2) edge ["\cubez \cubeunits"'] ([xshift=3.5pt,yshift=-3.5pt]e) + ; + }, + /cuboid/.search also={/tikz}, + /cuboid/.cd, + width/.store in=\cubex, + height/.store in=\cubey, + depth/.store in=\cubez, + units/.store in=\cubeunits, + scale/.store in=\cubescale, + width=10, + height=10, + depth=10, + units=cm, + scale=.1, +} +