summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/fancyqr/fancyqr.sty
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/latex/fancyqr/fancyqr.sty')
-rw-r--r--Master/texmf-dist/tex/latex/fancyqr/fancyqr.sty173
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