diff options
Diffstat (limited to 'Master/texmf-dist/tex/latex/fancyqr/fancyqr.sty')
-rw-r--r-- | Master/texmf-dist/tex/latex/fancyqr/fancyqr.sty | 173 |
1 files changed, 112 insertions, 61 deletions
diff --git a/Master/texmf-dist/tex/latex/fancyqr/fancyqr.sty b/Master/texmf-dist/tex/latex/fancyqr/fancyqr.sty index 5d199ecccae..bb2b9f3ebb5 100644 --- a/Master/texmf-dist/tex/latex/fancyqr/fancyqr.sty +++ b/Master/texmf-dist/tex/latex/fancyqr/fancyqr.sty @@ -1,21 +1,29 @@ -% Florian Sihler, 2022 +% Florian Sihler, 2024 % Licensed under GNU General Public License version 3 % https://opensource.org/licenses/gpl-3.0.html \def\filename{fancyqr} -\ProvidesPackage{\filename}[2022/08/19 version v1.1 Fancy QR-Codes] -\RequirePackage{tikz, qrcode} +\ProvidesPackage{\filename}[2024/04/13 version v2.0 Fancy QR-Codes] +\RequirePackage{pict2e, xfp, qrcode} % element % x: {\the\j}; y: {\the\i} | \@max@x \@max@y -\def\FancyQrColor#1{\if@fancyqr@gradient -\pgfmathsetmacro\angle{Mod(\fancyqr@gradient@angle+225,360)}% rotate to align 0 to the right -\pgfmathsetmacro\gradient{% +\def\@@fancyqr@color@gradient#1{\edef\angle{\fpeval{% + % approximate mod + \fancyqr@gradient@angle+225 - floor((\fancyqr@gradient@angle+225)/360)*360 +}}% rotate to align 0 to the right +\edef\gradient{\fpeval{% % we do rotate the x and y points before color drawing by % Mod(\fancyqr@gradient@angle,360) with the shifted origin % Old: #3/2 #4/2 - ((\the\j-\@max@x/2)*cos(\angle) - (\the\i-\@max@y/2)*sin(\angle) + \@max@x/2)/\@max@x * 50% rel x [0,1] - + ((\the\j-\@max@x/2)*sin(\angle) + (\the\i-\@max@y/2)*cos(\angle) + \@max@y/2)/\@max@y * 50% rel y [0,1] - }\@declaredcolor{qr@fancy@gradient@br!\gradient!qr@fancy@gradient@tl}\else\@declaredcolor{qr@fancy@gradient@tl}\fi{#1}} + ((\the\j-\@half@max@x)*cos(\angle) - (\the\i-\@half@max@y)*sin(\angle) + \@half@max@x)/\@max@x * 50% rel x [0,1] + + ((\the\j-\@half@max@x)*sin(\angle) + (\the\i-\@half@max@y)*cos(\angle) + \@half@max@y)/\@max@y * 50% rel y [0,1] + }}\@declaredcolor{qr@fancy@gradient@br!\gradient!qr@fancy@gradient@tl}{#1}} +\def\@@fancyqr@color@default#1{\@declaredcolor{qr@fancy@gradient@tl}{#1}} +\def\@@fancyqr@color@random#1{\pgfmathrandomitem{\@fancyqr@random@c@l@r}{@@fancyqr@@randomcol}\@declaredcolor{\@fancyqr@random@c@l@r}{#1}} +\let\FancyQrColor\@@fancyqr@color@default + +\def\fancyqr@rounding@factor{.5} +\edef\fancyqr@rounding@other{\fpeval{1-\fancyqr@rounding@factor}} % O 1 O % 2 X 3 @@ -26,43 +34,71 @@ \csname qcc\@up\@left\@right\@down\endcsname \else\rule\qr@modulesize\z@\fi} -\tikzset{qrrc/.style={rounded corners=.5\qr@modulesize},qrrd/.style={fill}} +% backwards compatibility +\def\fancyqr@clap#1{\hb@xt@\z@{\hss#1\hss}} +\newdimen\fancyqr@edge@compensate +\fancyqr@edge@compensate=.15\p@ % is larger to be compensated by overlaps -\def\qrm{\dimexpr\qr@modulesize+.15\p@\relax} +\def\qrm{\dimexpr\qr@modulesize+\fancyqr@edge@compensate\relax} \long\def\qr@newpattern#1#2#3#4#5{% -\expandafter\def\csname qcc#1#2#3#4\endcsname{% - \parbox[b][\qr@modulesize]\qr@modulesize{\kern-.075\p@\smash{\clap{\tikz[x=\qrm,y=\qrm,inner sep=\z@,outer sep=\z@]{\path[qrrd]#5;}}}}% +\expandafter\def\csname qcc#1#2#3#4\endcsname{\parbox[b][\qr@modulesize]\qr@modulesize{\kern-\fancyqr@edge@compensate\relax\smash{\fancyqr@clap{\picture(\@ne,\@ne)#5\endpicture}}}% }} -\def\FancyLoadDefault{% +% [#3][#2] +% [#4][#1] +\def\fancyqr@rounded@rect#1#2#3#4{% + \ifnum#4=\@ne\relax \moveto(\fancyqr@rounding@factor,\z@)\else\moveto(\z@,\z@)\fi + \ifnum#1=\@ne + \lineto(\fancyqr@rounding@other,\z@)% + \circlearc\fancyqr@rounding@other\fancyqr@rounding@factor\fancyqr@rounding@factor{270}{360} + \else\lineto(\@ne,\z@)\fi + \ifnum#2=\@ne + \lineto(\@ne,\fancyqr@rounding@other)% + \circlearc\fancyqr@rounding@other\fancyqr@rounding@other\fancyqr@rounding@factor{0}{90} + \else\lineto(\@ne,\@ne)\fi + \ifnum#3=\@ne + \lineto(\fancyqr@rounding@factor,\@ne)% + \circlearc\fancyqr@rounding@factor\fancyqr@rounding@other\fancyqr@rounding@factor{90}{180} + \else\lineto(\z@,\@ne)\fi + \ifnum#4=\@ne + \lineto(\z@,\fancyqr@rounding@factor)% + \circlearc\fancyqr@rounding@factor\fancyqr@rounding@factor\fancyqr@rounding@factor{180}{270} + \else\lineto(\z@,\z@)\fi + \fancyqr@rounded@rect@close +} +\def\fancyqr@rounded@rect@close{\fillpath} + +\def\FancyQrLoadDefault{% % . -\qr@newpattern0000{[qrrc](0,0)rectangle(\qrm,\qrm)}% +\qr@newpattern0000{\fancyqr@rounded@rect1111}% % | | - - -\qr@newpattern1000{(0,\qrm)[qrrc]--(0,0)--(\qrm,0)[sharp corners]--(\qrm,\qrm)--cycle}% -\qr@newpattern0001{(0,0)[qrrc]--(0,\qrm)--(\qrm,\qrm)[sharp corners]--(\qrm,0)--cycle}% -\qr@newpattern0100{(0,0)[qrrc]--(\qrm,0)--(\qrm,\qrm)[sharp corners]--(0,\qrm)--cycle}% -\qr@newpattern0010{(\qrm,0)[qrrc]--(0,0)--(0,\qrm)[sharp corners]--(\qrm,\qrm)--cycle}% +\qr@newpattern1000{\fancyqr@rounded@rect1001}% +\qr@newpattern0001{\fancyqr@rounded@rect0110}% +\qr@newpattern0100{\fancyqr@rounded@rect1100}% +\qr@newpattern0010{\fancyqr@rounded@rect0011}% % corners -\qr@newpattern1100{(\qrm,\qrm)[qrrc]--(\qrm,0)[sharp corners]--(0,0)--(0,\qrm)--cycle}% top left -\qr@newpattern1010{(0,\qrm)[qrrc]--(0,0)[sharp corners]--(\qrm,0)--(\qrm,\qrm)--cycle}% top right -\qr@newpattern0101{(0,\qrm)[qrrc]--(\qrm,\qrm)[sharp corners]--(\qrm,0)--(0,0)--cycle}% bottom left -\qr@newpattern0011{(0,0)[qrrc]--(0,\qrm)[sharp corners]--(\qrm,\qrm)--(\qrm,0)--cycle}% bottom right +\qr@newpattern1100{\fancyqr@rounded@rect1000}% bottom right +\qr@newpattern1010{\fancyqr@rounded@rect0001}% bottom left +\qr@newpattern0101{\fancyqr@rounded@rect0100}% top right +\qr@newpattern0011{\fancyqr@rounded@rect0010}% top left % straights | -- -\qr@newpattern1001{(0,0)rectangle(\qrm,\qrm)}% -\qr@newpattern0110{(0,0)rectangle(\qrm,\qrm)}% +\qr@newpattern1001{\fancyqr@rounded@rect0000}% +\qr@newpattern0110{\fancyqr@rounded@rect0000}% % enclosed -\qr@newpattern1111{(0,0)rectangle(\qrm,\qrm)}% +\qr@newpattern1111{\fancyqr@rounded@rect0000}% % t's -\qr@newpattern0111{(0,0)rectangle(\qrm,\qrm)}% -\qr@newpattern1011{(0,0)rectangle(\qrm,\qrm)}% -\qr@newpattern1101{(0,0)rectangle(\qrm,\qrm)}% -\qr@newpattern1110{(0,0)rectangle(\qrm,\qrm)}% +\qr@newpattern0111{\fancyqr@rounded@rect0000}% +\qr@newpattern1011{\fancyqr@rounded@rect0000}% +\qr@newpattern1101{\fancyqr@rounded@rect0000}% +\qr@newpattern1110{\fancyqr@rounded@rect0000}% } -\FancyLoadDefault % allows to reset the style after other loads +\FancyQrLoadDefault % allows to reset the style after other loads \def\@fancy@qr@default@name{default} -\def\FancyQrLoad#1{\let\@tmp\newpattern\let\newpattern\qr@newpattern\@bsphack\def\@@tmp{#1}\ifx\@@tmp\@fancy@qr@default@name\FancyLoadDefault\else +\def\FancyQrLoad#1{% +\def\fancyqr@rounded@rect@close{\fillpath}% +\let\@tmp\newpattern\let\newpattern\qr@newpattern\@bsphack\def\@@tmp{#1}\ifx\@@tmp\@fancy@qr@default@name\FancyQrLoadDefault\else \expandafter\edef\csname pingu@lib@#1@atcode\endcsname{\the\catcode`\@}% \catcode`\@=11\relax \input{fancyqr-style-#1.code} @@ -108,6 +144,7 @@ \def\fancy@qr@printmatrix#1{% \def\qr@white{0}\def\qr@black{1}% + \protected@edef\fancyqr@currprint{#1}% \let\qr@black@fixed\qr@black \let\qr@white@fixed\qr@white \let\qr@black@format\qr@black @@ -115,44 +152,50 @@ %Set module size \qr@modulesize=\qr@desiredheight \divide\qr@modulesize by \qr@size\relax - \qr@minipagewidth=\qr@modulesize + \unitlength=\dimexpr\qr@modulesize+\fancyqr@edge@compensate\relax % initialize unitlength once \if@fancyqr@image@% image is in \fancyqr@imgbox - \pgfmathsetmacro\@x{int(ceil((.5\wd\fancyqr@imgbox)/\qr@modulesize)+\fancyqr@img@padding@x)}% - \pgfmathsetmacro\@y{int(ceil((.5\ht\fancyqr@imgbox+.5\dp\fancyqr@imgbox)/\qr@modulesize)+\fancyqr@img@padding@y)}% + \edef\@x{\fpeval{ceil((.5\wd\fancyqr@imgbox)/\qr@modulesize)+\fancyqr@img@padding@x}}% + \edef\@y{\fpeval{ceil((.5\ht\fancyqr@imgbox+.5\dp\fancyqr@imgbox)/\qr@modulesize)+\fancyqr@img@padding@y}}% \FancyQrDoNotPrintSquare\@x\@y \fi - \multiply\qr@minipagewidth by \qr@size\relax - \ifqr@tight \else \advance\qr@minipagewidth by 8\qr@modulesize \fi - \minipage\qr@minipagewidth + \qr@minipagewidth=\qr@desiredheight + \ifqr@tight \advance\qr@minipagewidth by -\qr@modulesize \else \advance\qr@minipagewidth by 7\qr@modulesize \fi + \minipage\qr@minipagewidth% + \hfuzz=\qr@modulesize \baselineskip=\qr@modulesize + \lineskiplimit=\z@ \lineskip=\z@ \parskip=\z@ \ifqr@tight\else\rule\z@{4\qr@modulesize}\par\fi% %Blank space at top. - \edef\@max@x{\qr@numberofrowsinmatrix{#1}}% - \edef\@max@y{\qr@numberofcolsinmatrix{#1}}% - \edef\@do@x@min{\the\numexpr\@max@x/2-\fancy@qr@donotprint@center@x-1}% - \edef\@do@x@max{\the\numexpr\@max@x/2+\fancy@qr@donotprint@center@x+1}% - \edef\@do@y@min{\the\numexpr\@max@y/2-\fancy@qr@donotprint@center@y-1}% - \edef\@do@y@max{\the\numexpr\@max@y/2+\fancy@qr@donotprint@center@y+1}% - \qr@for \i=1 to \@max@y by 1{% + \edef\@max@x{\qr@numberofrowsinmatrix\fancyqr@currprint}\edef\@half@max@x{\the\numexpr\@max@x/2}% + \edef\@max@y{\qr@numberofcolsinmatrix\fancyqr@currprint}\edef\@half@max@y{\the\numexpr\@max@y/2}% + \edef\@do@x@min{\the\numexpr\@half@max@x-\fancy@qr@donotprint@center@x-\@ne}% + \edef\@do@x@max{\the\numexpr\@half@max@x+\fancy@qr@donotprint@center@x+\@ne}% + \edef\@do@y@min{\the\numexpr\@half@max@y-\fancy@qr@donotprint@center@y-\@ne}% + \edef\@do@y@max{\the\numexpr\@half@max@y+\fancy@qr@donotprint@center@y+\@ne}% + \qr@for \i=\@ne to \@max@y by \@ne{% \ifqr@tight\else\rule{4\qr@modulesize}\z@\fi% %Blank space at left. - \qr@for \j=1 to \@max@x by 1{% + \qr@for \j=\@ne to \@max@x by \@ne{% \qr@fancy@updateif\i\j \iffancy@qr@do@print@ - \edef\@mid{\qr@matrixentry{#1}{\the\i}{\the\j}}% + \edef\@mid{\qr@matrixentry\fancyqr@currprint{\the\i}{\the\j}}% \ifnum\@mid=\qr@white \rule\qr@modulesize\z@ \else% if not white, get its pattern - \iffancy@qr@roundcut@\qr@fancy@clear@surround{#1}{\the\i}{\the\j}\fi - \edef\@up{\qr@matrixentry{#1}{\the\numexpr\the\i-1}{\the\j}}% - \edef\@left{\qr@matrixentry{#1}{\the\i}{\the\numexpr\the\j-1}}% - \edef\@right{\qr@matrixentry{#1}{\the\i}{\the\numexpr\the\j+1}}% - \edef\@down{\qr@matrixentry{#1}{\the\numexpr\the\i+1}{\the\j}}% + \iffancy@qr@roundcut@\qr@fancy@clear@surround\fancyqr@currprint{\the\i}{\the\j}\fi + \edef\@up{\qr@matrixentry\fancyqr@currprint{\the\numexpr\the\i-1}{\the\j}}% + \edef\@left{\qr@matrixentry\fancyqr@currprint{\the\i}{\the\numexpr\the\j-1}}% + \edef\@right{\qr@matrixentry\fancyqr@currprint{\the\i}{\the\numexpr\the\j+1}}% + \edef\@down{\qr@matrixentry\fancyqr@currprint{\the\numexpr\the\i+1}{\the\j}}% \FancyQrColor{\GetPattern}% \fi\else \rule\qr@modulesize\z@\fi }\par}% \ifqr@tight\else\rule\z@{4\qr@modulesize}\par\fi \endminipage \if@fancyqr@image@\nobreak - \llap{\parbox\qr@minipagewidth{\centering\usebox\fancyqr@imgbox}}\fi + \llap{\parbox\qr@minipagewidth{\centering\usebox\fancyqr@imgbox}% + % if half the width is odd, offset by half a module width, done by centering + \edef\@halfcheck{\fpeval{round(\fancy@qr@donotprint@center@x/2)}}% + \ifodd\@halfcheck \kern.5\qr@modulesize\fi + }\fi }% \def\fancy@qr@setup#1{% @@ -205,17 +248,21 @@ }% \newsavebox\fancyqr@imgbox +\newif\if@fancyqr@randomcolor@ \define@key{fancyqr}{image x padding}{\def\fancyqr@img@padding@x{#1}} \define@key{fancyqr}{image y padding}{\def\fancyqr@img@padding@y{#1}} \define@key{fancyqr}{image padding}{\def\fancyqr@img@padding@x{#1}\def\fancyqr@img@padding@y{#1}} \define@key{fancyqr}{image}{\@fancyqr@image@true\savebox\fancyqr@imgbox{#1}} -\define@key{fancyqr}{color}{\@fancyqr@gradientfalse\colorlet{qr@fancy@gradient@tl}{#1}} -\define@key{fancyqr}{left color}{\colorlet{qr@fancy@gradient@br}{#1}} -\define@key{fancyqr}{l color}{\colorlet{qr@fancy@gradient@br}{#1}} -\define@key{fancyqr}{right color}{\colorlet{qr@fancy@gradient@tl}{#1}} -\define@key{fancyqr}{r color}{\colorlet{qr@fancy@gradient@tl}{#1}} -\define@key{fancyqr}{gradient angle}{\def\fancyqr@gradient@angle{#1}} +\define@key{fancyqr}{color}{\@fancyqr@randomcolor@false\@fancyqr@gradientfalse\colorlet{qr@fancy@gradient@tl}{#1}} +\define@key{fancyqr}{left color}{\@fancyqr@randomcolor@false\colorlet{qr@fancy@gradient@br}{#1}} +\define@key{fancyqr}{l color}{\@fancyqr@randomcolor@false\colorlet{qr@fancy@gradient@br}{#1}} +\define@key{fancyqr}{right color}{\@fancyqr@randomcolor@false\colorlet{qr@fancy@gradient@tl}{#1}} +\define@key{fancyqr}{r color}{\@fancyqr@randomcolor@false\colorlet{qr@fancy@gradient@tl}{#1}} +\define@key{fancyqr}{gradient angle}{\@fancyqr@randomcolor@false\def\fancyqr@gradient@angle{#1}} \define@boolkey{fancyqr}[@fancyqr@]{gradient}[true]{}% if@fancyqr@gradient +\define@key{fancyqr}{random color}{\@fancyqr@randomcolor@true\def\@fancyqr@random@colors{#1}} +\define@key{fancyqr}{width}{\setkeys{qr}{height=#1}} +\define@key{fancyqr}{size}{\setkeys{qr}{height=#1}} \def\fancyqrset#1{\setkeys{qr,fancyqr}{#1}} \fancyqrset{image padding=0,gradient=true,gradient angle=135,r color=teal,l color=purple} @@ -227,8 +274,12 @@ \def\ns@fancyqr{\qr@starinvokedfalse\@@fancyqr} \newcommand\@@fancyqr[1][]{\begingroup\@fancyqr@init \ifqr@starinvoked\qr@hyperlinkfalse\fi -\setkeys{qr,fancyqr}{#1}\bgroup -\qr@verbatimcatcodes\qr@setescapedspecials\qrcode@in} +\setkeys{qr,fancyqr}{#1}% +\if@fancyqr@randomcolor@% +\ifcsname pgfmathdeclarerandomlist\endcsname\else +\PackageError{fancyqr}{Random colors requested but pgfmath not loaded}{Please load pgfmath if you want this}\fi +\pgfmathdeclarerandomlist{@@fancyqr@@randomcol}{\@fancyqr@random@colors}\let\FancyQrColor\@@fancyqr@color@random\else\if@fancyqr@gradient\let\FancyQrColor\@@fancyqr@color@gradient\fi\fi +\bgroup\qr@verbatimcatcodes\qr@setescapedspecials\qrcode@in} \endinput % TODO: NEGATIVE PATTERNS IF MIDDLE IS 0 |