From f7b9202b31d862471afcca6dbe9123c0a3aae8d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20W=C3=A4ckerlin?= <4056726+mwaeckerlin@users.noreply.github.com> Date: Tue, 11 Nov 2025 18:19:29 +0100 Subject: [PATCH] logo can be an image or a LaTeX element --- README.md | 4 ++-- businesscard-qrcode.cls | 19 +++++++++++++++++-- photo-in-qr-example.pdf | Bin 5882497 -> 5882499 bytes 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index e404166..0f33e19 100644 --- a/README.md +++ b/README.md @@ -176,8 +176,8 @@ See this example: - `\google`: your account name on [google+] — only the name of the account, the url is prepended automatically - `\pgpurl`: the full url to your pgp public key (only added to the QR-Code, not shown in the text) - `\pgpfingerprint`: the fingerprint of your pgp public key -- `\logo[height=...]{file}`: path to logo file (PNG, JPG, etc.) for display next to name. Optional `height` parameter (e.g., `height=6em`) overrides global `logoheight` option. -- `\qrlogo[scale=...,opacity=...]{file}`: path to logo file for display in QR code center. Optional parameters: `scale` (fraction like `0.3` for 30% of QR width) overrides `qrlogoscale`, `opacity` (0.0-1.0) overrides `qrbgopacity`. Remember that every logo lowers the QR-code's error-correction margin—keep the scale conservative and always test the code with multiple devices (smartphones plus command-line tools such as `zbarimg`). +- `\logo[height=...]{content}`: supply either a path to an image file (PNG, JPG, PDF, …) or arbitrary LaTeX content (e.g., `\Pacta`). When a readable file exists it is loaded via `\includegraphics`; otherwise the content is typeset as provided. Optional `height` parameter (e.g., `height=6em`) overrides the global `logoheight` option. +- `\qrlogo[scale=...,opacity=...]{content}`: behaves like `\logo`, but places the content in the center of the QR code. Pass an image path or LaTeX markup. Optional parameters: `scale` (fraction like `0.3` for 30% of QR width) overrides `qrlogoscale`, `opacity` (0.0-1.0) overrides `qrbgopacity`. Remember that every logo lowers the QR-code's error-correction margin—keep the scale conservative and always test the code with multiple devices (smartphones plus command-line tools such as `zbarimg`). - `\companylogo[height=...]{content}`: backwards-compatible helper that still allows arbitrary content below the name. Prefer the new `\company[logo=...]{...}` syntax, but this command remains available. - `\background[scale=...,opacity=...]{file/color}`: path to background image file or color name (e.g., `yellow!20`, `blue!10`). If file exists, it's used as image; otherwise treated as color. Optional parameters: `scale` (factor like `1.5`) overrides `bgscale`, `opacity` (0.0-1.0) overrides `bgopacity`. diff --git a/businesscard-qrcode.cls b/businesscard-qrcode.cls index e18722c..3a30ab9 100644 --- a/businesscard-qrcode.cls +++ b/businesscard-qrcode.cls @@ -268,6 +268,21 @@ \newcommand\ifboth[3]{\ifcsdef{#1}{\ifcsdef{#2}{#3}{}}{}} \newcommand\ifany[3]{\ifcsdef{#1}{#3}{\ifcsdef{#2}{#3}{}}} \newcommand\cond[1]{\ifcsdef{#1}{\exec{#1}}{}} +\newcommand\BCQ@graphiccontent[2]{% + \begingroup + \edef\BCQ@graphicscan{\expandafter\detokenize\expandafter{#1}}% + \IfSubStr{\BCQ@graphicscan}{\string\\}{% + \endgroup #1% + }{% + \xdef\BCQ@graphicspath{\BCQ@graphicscan}% + \endgroup + \IfFileExists{\BCQ@graphicspath}{% + \includegraphics[#2]{\BCQ@graphicspath}% + }{% + #1% + }% + }% +} % internal boxes and lengths for measuring \newsavebox{\BCQ@namebox} @@ -628,7 +643,7 @@ END:VCARD\BCQ@nl} % Logo with transparent background preserved (no fill), padding still applied % qrlogoscale/scale is unitless fraction (0.25 = 25% of QR width) \node[inner sep=\BCQ@qrlogoborder\textwidth] at (qr2.center) {% - \includegraphics[width=\BCQ@qrlogoscale@used\textwidth]{\Xqrlogo}% + \BCQ@graphiccontent{\Xqrlogo}{width=\BCQ@qrlogoscale@used\textwidth}% }; \end{tikzpicture}% }{% @@ -659,7 +674,7 @@ END:VCARD\BCQ@nl} }% % Store logo height as dimension for heightscale calculation \ifcsdef{Xlogo}{% - \sbox{\BCQ@logobox}{\includegraphics[height=\BCQ@logoheight@used]{\Xlogo}}% + \sbox{\BCQ@logobox}{\BCQ@graphiccontent{\Xlogo}{height=\BCQ@logoheight@used}}% \setlength{\BCQ@logoheightdimen}{\BCQ@logoheight@used}% \setlength{\BCQ@namecolumnwidth}{\dimexpr\textwidth-\wd\BCQ@logobox-\BCQ@logosep\relax}% }{% diff --git a/photo-in-qr-example.pdf b/photo-in-qr-example.pdf index 62bf40ac83320eaca0f209e7d81b13d8a49b0ba7..9311f89bc700f234e33b8d35821486d430a5275a 100644 GIT binary patch delta 6259 zcmai%MOf4iptS|bp<6<_8DQv;ZWy{#8U!RHbdVT?9}Uvo-AD)wE!`;%(%oGG-v8oT ze0OyhXLpw8d7txs3*JKx`Y!umWrVJHP>e0ZxDm;07Q7 z55NoX0sMdfAP5Kn!hi@M3cLfv0C7M9kOZUvX+Q>$1>^vEKmkw$lmKNw1%LvofEu6< zXaJgk7N8C20J?x4pbr=ThChuG^5A?D5+DyxcUwzm5Nydy+eg(zk4mB`akW+Y5YkF% zeS8a&a7!5IhiWDuIS=p!)ygcSR!VWkG**he4(gJ@-|Zrp!-&GI!x_S7{&ta$p|3I7?Z(+bIYz#Ac0H%El)pgOk3kSF9e= zVj*EF$3b1)@NQB4yWh9Q@)7CuI;<73NN|R-kk#EPm+JA$q_6c=E}`l1>=~wy*BZU< zIy>>Fs{|=kt?$lf@7MOWXz=5{3MdXc$HyS5R_4p&rW{&oK6u3dUf^B{F zfkI;WR}QPnysiCtn)g?)#tqjfGj7-UzcHP(_6bzIfvOg-P}kqps6T@~2DaD-2x$fc ztwRu)9Vi~_)esK!ja&*=X)z^aE_x{>ppxd$ON2=6ee4_XQTZ*C0Ga@1N2pS6_{|LDJyAR$bx>wLxy6pGl zHm%s@qvU`3UAE*7o(@ip=U11$r|%x_9`>`t;zg3(MZ>Xx%g9e>5F2#A5}Rr(Ox}H? zZAjRP&7`}#=6u;vl9P&=qHGVK52&H z5z80QF4`Yp5`%XyO$;#bUr0rRHyBytdqu0Eg>zv7VN@uIH~SO#&V&@Ep;lEv|GH7= zMl_D&D!*%u{3R>4tze3O%@!WF;{C)Zq1l%y3fl9k{S`uU$c8pJk>z`(}LtbGUFDr=_l78c{jOG~qhJ3G|D-1bMn-B!iI-LUvKKGc)TBp68Og7z0g9!nebPP<`pN~e~?3E(s9qaPkWR-Rq)&p ziE1nS^$n83`M0rz{rPYI1Y$CLsx!^q`YIJ)as(Ny@OmT7`LA8lrM#MKZ3XqS!s~ZM z8sJ=Of~hzK-6W)`YbMc?^mTGaL<6ne-keQs#r+<>hC|z|Lo`k~?Bx}~=obZ$t&7cn zd`%H3F_LBB|6j1x!_w8ArC5EPS&z3ZPp`4*WH*W)HcTmdm6B6pLLSZe9g-50 z(V|An5(I>?4M&AQj59O8UF zlY9Tgb18bGCDC)FY|YhYRKof}+}c@UqmW05f+L~dNO`N0Y08dDrtUh0^Qd5`N_HeLa3ckvy#r{1id`1@p0#?urs0(9(l<3uuX> zWG0adWg=rKg6VNUvaSVg#9jQ{wk>9ru~C@n3P@3OXblA{yj90PkI^eG^xsuRREiwg z9GwVu3Bnx&9|UJjUp0MS9(nHmd%66OVfYL5MEboK6(L_kln=xJYajibiJb9N{2KTT z6F*CAjlFva$vczRsov&Kj6BJ)ot27w^YrnWR4KmvlJuT-I<6*Ln&W_IGUc6Fhx8~esBr1*?l!sw%J$B4mEPbU`x|Dw~-j2UmHG%Yk%b5;H zo8^sFIE*=rBWdv8jK4(VSs4eX>U$li(i?(BJ;VLu&B<;AqCa_-LBA1ID)+HdQ2i_j_ss}(tWPvUJR+r6QU$jd z!Nv<8$*v2U(xoGv4R*X`+Xo{w6~Cgwg5mk3q6*YXGmBV!sIDufFuEUE7+;oGFESb+ zLk1fH6&Yt|hC6~6(ZY^JsZd>1Ek(`^<=YyA!dCAE&gjiY*ZSkDpIuZVYC$G5oitDI zc7YA=%;0Ghf=RD2rymbatlFb=mZ3itQOQ;k7Zd%GLkfo!Vp zvMBs_q$=-di6wvN7L{w?m`!VpMvN37xgi;x`HKcO<5TCnxpC02G)b!+H8fdK;fhb^ zBq1l|XfoWp@6u8If)~A;ed#tx3?Iz$qgH(P1YUJDJv=Bf+T6%1J34VLZ!L*U6r6Fm zq(3aBr6!~IUpUUl(@q#d_By}{Jb<+Scx$@79bVqoR8zmc>FuuZN^uYBnV8wQJR0%z zI6yPu=XbT+ys%i$U~SI^<~iK>ejjJhAK0rGUXd?YK4?XlM5eGl|rs+_8RsVhY+(PfDTwm|t2uRD^RW&Phis3-8y2OTD)){{j42-#_*W=b^X?oRr ztAS8W>~DWHUJpL79x^+Aw2S*Op>lJ?r!TnHZst`6McVq%updLWPlS(#ffDDV{FVnt z`mStJot$+W$PWv6_$Ixv1;>0lcDu)Hiq%GXuZv}Ew8`WBq0QZ8R-~kc#FbH%DUoHh zf3jG9jN_CLAA|KBnhzzVy1BqL{u^oPV4*P%a~D{~C;`R}{Vu`|Q!0qe%5Nv40EscP za&&Uw(3-D7PG0u`s@|U+RW&y8dzbY_wElI_>316(iKe))VIW_3O z;ip>JTrLfnO{5lLst-T^nUnOD^`X`QB?NM%eriwMU6{2p88%RCa~M_D|3rtABw>?z z_OFW#$7-J+&mA(HC^joL_*>l})@-@QIiUiUnRqH(d(%6ov$&JiZC%Oke-$ZYsK=~R zfnTl}d)}5xLc$XZ$45AT$d2)lJ5xVJqw?Ro``-&Yyej6 zHqd^@*J5;QhrEVz3YxxmX?Q7ou_>fm&$a8++1_))bs1mIy!-Yo5%i@x3pSYBp2QbWYuLNuG(;rtlq?AR8ANmR`jVrJ4u z2P&oZjN9pNMMMKmm@q*ZeX;wOXC&LBT?~qsG28S0{UJ&kXd1SbeElO>g>S9!y?sVD zqXTKGMSM5#DJkx_586mf${30hvQl`K_tQZ(5sHNy+XtjwKgf)E+D_Nh{L;|%w3CV1 zUjPGAPVrnjcsM9k&iMmv)*S$Xm`o`g;`-`KOzwzTvKxgGMJtC(Sd0)3P0$+)l)Hx9Oj~rztWQ5QQs|4iw50 zVF4A7Xy_HDY{jtP3hm~6JjhkJ49jn!gi`H-hN&g^Pm9f=CuAq~pjQt#)5-8DTF zo15ZAKr~kVWO0edBeQdO{Czi(cW|r;eBYGk;qPahkf3=;jB!GEj@0X2@Ng z$dT;NS|?I0%{`Hy6=cTe++<7WUsYsFMh-f^E-rf==h+aC^}inq6Q|QE^yNOUe3Nyj z+A0?bm!b>V`WgG$Bs&|OLHC!$cdKmDsXGz2%jT!EsA4nhiCPP*3s_vy1tvw_azdFc z8v5b8$5Sf(RwL}XlZ3~L=O#REcX-E1H$-Jw(L7m$E^b6Ww9x#$@s`>Pb0FE{i_j~~ zT&*QA?i@lp`*OrIiCA6|4IA;uLyP(hFo$`<$DJJqM3>KS7iteA2hfj8X|fKW&IhK= zMWxd|R+J(J?u{=W{WfgfGgihCl@;@|ipgNwRk>DX9@YIzs--C`5(K!?f6NRmAkf_jE^_i0YD{O=UJyv> zvb2)fXYr~hXAbEHZPKFc5zY|~2No%{Y3n?js1Vzikr&RtO*?V)c?}|+va2eG_2q^P zP;1LPhuVGRKV&FPQ^whC-WJ}?X3wOiYevZK={iue|mJ*n|;CyGi%uNrbYWM+@G zT42cnSgH`pX84r_i+n(qNVkl7Y*Z$ThV$rEX*B-?@;O;yyJrgB1Z!P^vL|L13KX0= zKOLm2(ODPvRhAI;n^9qURp)5C_8xR*9J}E66q_yVgh% zNjPP<)`$lF=^Rf2u~M8ID@XMEy>W8njUw^s?!?LN=d+eO7kU(~eQtRsO9uvl{IJ}w zvDxhVUG#ahfxg6*zvdx_U-l+KPcy~6)_vFS-mQ6zr}WTOkbI)rJ3c-*ka+VE6ya!y z8O?+RKT#0ibrkM#=2>CtS3l~v|6JU1{Mwpz+HJQhK5 zRjgpOT3BjF>6YsM_nW)C7o_1PG3;b^HvSwZ2Uk8s5Kw zZ|0iMM0Z{U@KNQPd#KexT%1(T6Uko)W@5i8-sB$EwP> zhYd6BNjj`P!I0oPp?}>T?mavHQLAc<);#_dbISVrkb9jcZt&To4qvBvsB8d=JJ7r9 zboo6khHCjz@7)VB7aSk&|2c?l%0aUcR#U`JBX@MT!2hozv-(hvO=0|wi64{Bx!TIm zI@?7ZoiZk2n^epz`UIQEjogJm7%4c#nUJ^B--LG~ZotKTp~p(9O24(}RKpw!rcXox zf)g>i(-g(J<--Us&IiKDK;2=viEipZD7!TMcZGO}`c&qUAU%Pg7%jE251ft#d-<25 zWGSBb&l}8=X<4S0?~@{p*)gBv&!sGAOvr&=*$INfwa(BHZi7xw?Sh#coy{%Y&VpVg zMEtpJBjMB!`@SAo;rDYaJ;t*XJ+(n*e0)1Kn&JJdRr&VrNA-%zGuO>#nF%YGncK_3 z0=S*Y%;bk(QOvifGY@Q|ui#~6r-EZzzpn>ELtQ7Gc(RChu0hdyW=FiChHEzAFaGX7 zdF~6A^U#rZTtcZZGP@25XZHzrJfknZn5D_5?MKwuRoQq)O66c}EEPB*>luLf>?Xt-l;TyTHrzoQFx9XY3#2 zQ{~OTZYsllNY?j$1B?aE8M&Tu`*jVfu66WTqbb|=SXI7ozw6K_DKgV@81d|63aAR(`|4= z;;MK#k`FOi{S-*jy|K&D0HyIssnvpxfki%*rvk?fb7BFaEOKC?L;8Z&(c85{l6 zU7J>KLG87oOx*=cP0r+t1p-m-JmC1o)W*TjY_a<=LS0|q>ke+5^oBLFJSnOd*b?J$ zNY-%n^6Z63USjK|!_;;}wUa)-bb6s>#pK*tJwvm&L)d@Z#*Bi!JO)}+hAX9Hmg!F% zm&ca`w+5RxgT{;J1>(d4)sq&q8D4|t`iK8!hD<72*(tN+jPvI~DsP@L0lI5D#|R$O z%!fP=UmK@U33!3D+^rwD1{@C)hOqU!AX3Ko?b^dfL!$Z`QF$_DKq9)i#YHVs0evbd zEyL`C6v0Luq)uhzS~dE)|yTkGYf*S-l`Bd&j3?Mr<0Pgksh zvn5A!#IH>u&oG#Q<@?8nUWB{ESb0mElb5zf(eil_T-7VQrty)DS)k% zW}jMGjP>KWxvt|*9{f>l1!ZTbbe2r`p4%+vUdS;!k9(?#HA+;Ry!>*)fLo26PKLiQ z$lMXbjZ2*W^{}&*b&Ev36O;FVxa{{m!!x{Otu6w3GhLOUgbEE}?~i*1e(VjHWLy)# zgZ^c9zTkRYNV$|!0@!7ggKrPfT4!djboJ&nM@dPD5nXDa*-=OTqv?Plfte<>!y|2{ z)b(dHX7c#P;bhGN%B&z0k!^AcW|;Sg^z0=38J)Ja&kXXL)b8wgUK22Kzxu_uL?sbjZzG{jp#9WKuk>X I8VaEQ0T%ul^Z)<= delta 6270 zcmai$MOc&pqlKlVyHmP51|+0I8ir2k?nXx7qd{PX20^;JLAq1ArMqz`LE-*)_utiB zoZVTT^FD8Q#1UfXfAR%D01yEr02x35PysaHEr1SS0GI$4fDPaPxBwo24-f!^01-e8 zkN~6r89)wD0F(d~Kn>6Uv;ZCO4xk4Z07ifbU8l07 z`2vs1af0n%XXAPjYte#c2h65zNq-Pp@L*gKSkx14p8mjm!#?y&3n|ZCx0Wjyg(lcT zSPDIdZM^v6*V*&m@GyqBulhtsm2ef1`2l>RySJB)yEF`Tm`G^tWQ`AI!v z-zJNb68gS~zbtk_7t;Qc{VI#?qlwEg-h?7ACd2~X|A%{{!Is0Xk*`yUl~Z6aba2+T zS1g(p%#?0i1l~V;83x^Y;&i<}!aaq@J|K>wh*`YZ3KcrlubZw6LVXNnO+v;A&))vX zi+TCGk(~}j0S_B0P2o=Z2E!jwsO(LiX3fIcf?-AGX{kbaBBb06xi8FLI@@9?W&n3Y zi74(2LRhnm=|VYQ)kPlUEI3d9>>{4XmiCBx#nL&%2eL7W_T{0a>xSMLVXa_ujThmg zkg5`+$O{FHBif~Y1Sdhr7Dn+K*Gb(p$h!4^KeUp8y1L0hgo>==d#Uma0_{cuyi=JYf zV*14W&wps6yk?$8qV)agq(WnTIZ3X?SKAyF!l)0cLxX-~4dLB7lEz(c$!|G5DL&*9 z*uUrdUhh~nb`g{0&k*LndbFAt83teYfL$0`>{gmJyTZo%Y3}rzwr9|sRZKPDlTSG%AAonw0 zH#ea6-x&win)1jG=0%j=4;hjcCKh#D8F<`hJxV>vA$#A201?s9wm=vNeN$iz>bYZ_ zXWscjZ0(9el>oa|@xbZf|IW+KSY%=Ab9Xv9r|qZv#b3giGDa~TS49pzIv{>mlgg3? zZk0`dz9+j&9q_?Tzft14qP#H`l3x8Q80ycX%-F7qb}-gI1is#1%_`YVTf3j{vRm6a zjvT0KMQ{oIH;GK!YLlhJ9F9jD>xfC?EM040q$UH!Jc)D7rreM_o?Vi9Ghso3m3~od zs0^8P4Cf{K{8N8pB#lq7W*vrHHT2H;qU-`~aQ_rh0G*Hj?{g;W=amTL=_%1D7%b(k zd}&Hz;ci9UuuRMxXk?z9T~9#^?SK`Wv<`K#K=WocQw;5?m2~KXg?< zbNwfz@|aTTTyN8*TgKS8^+}!-&@y6(|2ld&vl)k81)kx--m{n zY}^n#|2$n6}ujCIiT|t~qzkKx1a+;TW9$vOyU;i0LR#hjfGJDM^$W5B#@o}-f zP=E8aYU5`5<$3zNPSf}R3i$~-(*QYeLWjqSZuI6JEur=jH17$8h*%hZV zc{u2i^8=C!1G8_f6U`KGj)?^cVvfOr7@`HU_E;2g%-@%jI6P%H?U{ee!nN=)6yDh* zXy?l-CCDVBM&!3@fnqJP()oW)>nRN*mwtaUj2FH(OPHzWYjhvJh+Ijn7Zv3(0F82K z#c6@4H%_>{@LY?xh=ZbofQZw(^qZMV8Ja`$qDRpT)QGyb*Rvx3=sX`WW*_Z2k3 z$=x=`M6f>dWO*`;8o3J2RTfE-wQslQCHszndJ7qV(XFtCjNpxebPP#ru>bE5!KXvT*i;Nfnlr=y{L%lC&xu z`Y*IUyvfCh_QwirufnFoFq?}Mzvx3)9rLXYLgl`7@#A(a2HEL7WdSeviJ7X?ty(Gcf&=-BGqgAW&|$nFUr!#W$%1KFXY9T$*tV-$Zv z$BxOuNximH_eIkGyh}$V)Y-#PcRQY3OaJ-VsYWu`fDi`DDcP<6xP_6>&={`9!>seDywk`KBlL zz^4O}Gb(fc*pthAz6~83oJ4F3&EaC2+$^Tc%dEBB+>*6t3}pv3>Qc@E z9E{zNce_zjlH}|{ne>`R-E92mQb3eW!@ zz|#{qSiTsJxcJvq_<$=bZhiVy)%^;l7Y=eUK^(40k-r-#LWRRxAL+q7+AOVa1`jpb zRH4H?Z>AeLPprn&&Yx_P6CYIW&II&@x4KLN%0D9PIiwyZzB?wwLw$>!{H#pPhb`Tu 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 LCMJ0e1&sdz=C$rO