You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
318 lines
11 KiB
318 lines
11 KiB
% Author: Marc Wäckerlin |
|
% License: LGPL |
|
\NeedsTeXFormat{LaTeX2e} |
|
\ProvidesClass{businesscard-qrcode}[2018/08/15 version 1.2 ready for ctan] |
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
% option evaluation |
|
\RequirePackage{kvoptions} |
|
\SetupKeyvalOptions{ |
|
family=BCQ, |
|
prefix=BCQ@ |
|
} |
|
\DeclareStringOption[89mm]{paperwidth} |
|
\DeclareStringOption[59mm]{paperheight} |
|
\DeclareStringOption[85mm]{contentwidth} |
|
\DeclareStringOption[55mm]{contentheight} |
|
\DeclareStringOption[8pt]{fontsize} |
|
\DeclareStringOption[2mm]{padding} |
|
\DeclareStringOption[2]{cutdist} |
|
\DeclareStringOption[1]{cutlen} |
|
\DeclareStringOption[0.50]{textwidth} |
|
\DeclareStringOption[0.40]{qrwidth} |
|
\DeclareStringOption[de]{lang} |
|
\DeclareBoolOption[true]{address} |
|
\DeclareComplementaryOption{noaddress}{address} |
|
\DeclareBoolOption[true]{hint} |
|
\DeclareComplementaryOption{nohint}{hint} |
|
\DeclareBoolOption[true]{icon} |
|
\DeclareComplementaryOption{noicon}{icon} |
|
\DeclareBoolOption[true]{rightalign} |
|
\DeclareComplementaryOption{leftalign}{rightalign} |
|
\DeclareBoolOption[true]{iconleft} |
|
\DeclareComplementaryOption{iconright}{iconleft} |
|
\DeclareBoolOption[true]{fill} |
|
\DeclareComplementaryOption{nofill}{fill} |
|
\DeclareBoolOption[true]{qrfirst} |
|
\DeclareComplementaryOption{textfirst}{qrfirst} |
|
\DeclareBoolOption[true]{https} |
|
\DeclareComplementaryOption{www}{https} |
|
\DeclareDefaultOption{\@unknownoptionerror} |
|
\ProcessKeyvalOptions* |
|
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
% definitions from the options |
|
\def\content{paperwidth=\BCQ@contentwidth,paperheight=\BCQ@contentheight} |
|
\def\papersize{width=\BCQ@paperwidth,height=\BCQ@paperheight} |
|
\def\padding{\BCQ@padding} % padding around the content |
|
\def\border{\BCQ@cutdist} % distance between start of cutmark and content in mm |
|
\def\cutlen{\BCQ@cutlen} % length of ct marks in mm |
|
\def\textpercents{\BCQ@textwidth} % size of text part 0..1 |
|
\def\imagepercents{\BCQ@qrwidth} % size of qrcode image part 0..1 |
|
\def\lang{\BCQ@lang} |
|
\def\protdisplay{\ifBCQ@https https://\else www.\fi} |
|
\def\protprefix{\ifBCQ@https https://\fi} |
|
\ifBCQ@address\def\printaddress{}\fi |
|
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
% global dependencies and settings |
|
\LoadClass[\BCQ@fontsize]{extarticle} |
|
\RequirePackage{marvosym} |
|
\RequirePackage{fontawesome} |
|
\RequirePackage[final]{qrcode} |
|
\RequirePackage{etoolbox} |
|
\RequirePackage{DejaVuSans} |
|
\RequirePackage[T1]{fontenc} |
|
\RequirePackage{wrapfig} |
|
\RequirePackage[\content,top=\padding,left=\padding,right=\padding,bottom=\padding]{geometry} |
|
%\RequirePackage{pbox} |
|
\RequirePackage{varwidth} |
|
\RequirePackage{calc} |
|
\pagestyle{empty} |
|
\setlength{\parindent}{0pt} |
|
\renewcommand*\familydefault{\sfdefault} |
|
\setlength{\fboxsep}{0pt} |
|
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
% data registration |
|
\newcommand\registerData[1]{ |
|
\expandafter\newcommand\csname #1\endcsname[1]{ |
|
\expandafter\def\csname X#1\endcsname{##1} |
|
} |
|
} |
|
\registerData{type} |
|
\registerData{givennames} |
|
\registerData{familynames} |
|
\registerData{honoricprefix} |
|
\registerData{honoricsuffix} |
|
\registerData{additionalnames} |
|
\registerData{pobox} |
|
\registerData{extaddr} |
|
\registerData{street} |
|
\registerData{city} |
|
\registerData{region} |
|
\registerData{zip} |
|
\registerData{country} |
|
\registerData{phone} |
|
\registerData{email} |
|
\registerData{jabber} |
|
\registerData{matrixorg} |
|
\registerData{cloud} |
|
\registerData{homepage} |
|
\registerData{wordpress} |
|
\registerData{drupal} |
|
\registerData{joomla} |
|
\registerData{wikipedia} |
|
\registerData{link} |
|
\registerData{world} |
|
\registerData{git} |
|
\registerData{gitea} |
|
\registerData{github} |
|
\registerData{facebook} |
|
\registerData{twitter} |
|
\registerData{youtube} |
|
\registerData{google} |
|
\registerData{pgpurl} |
|
\registerData{pgpfingerprint} |
|
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
% auxiliary commands |
|
\newcommand\enforceright{\leftskip0pt plus 1fill\rightskip0pt} |
|
\newcommand\exec[1]{\csname #1\endcsname} |
|
\newcommand\insa[3][]{\ifcsdef{#2}{ |
|
|
|
\ifBCQ@iconleft |
|
\ifBCQ@icon\parbox{1em}{\centering\exec{#3}}\ \fi\ifBCQ@hint{\tiny#1}\fi\ifBCQ@fill\hfill\fi\exec{#2} |
|
\else |
|
\ifBCQ@hint{\tiny#1\ }\fi\exec{#2}\ifBCQ@fill\hfill\fi\ifBCQ@icon\ \parbox{1em}{\centering\exec{#3}}\fi |
|
\fi |
|
}{}} |
|
\newcommand\ifexists[2]{\ifcsdef{#1}{#2}{}} |
|
\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\heightscale{\dimexpr\textheight-\ifcsempty{name}{0em}{2em}-\ifcsdef{Xpgpfingerprint}{2em}{0em}-\ifcsdef{Xadditionalnames}{2em}{0em}\relax} |
|
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
% name - assemble full name from the parts, such as Xgivennames and Xfamilynames |
|
\newcommand\name{\ifexists{Xhonoricprefix}{\Xhonoricprefix\ }\ifexists{Xgivennames}{\Xgivennames\ }\ifexists{Xfamilynames}{\Xfamilynames}\ifexists{Xhonoricsuffix}{\ \Xhonoricsuffix}} |
|
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
% vcard - the content of the vcard |
|
\newcommand\vcard{BEGIN:VCARD^^J |
|
VERSION:4.0^^J |
|
N:\cond{Xfamilynames};\cond{Xgivennames};\cond{Xadditionalnames};\cond{Xhonoricprefix};\cond{Xhonoricsuffix}^^J |
|
FN:\name\ifexists{Xadditionalnames}{\ifcsempty{name}{}{\ }\Xadditionalnames}^^J |
|
\ifexists{printaddress}{ADR\ifexists{Xtype}{;TYPE=\Xtype}:\cond{Xpobox};\cond{Xextaddr};\cond{Xstreet};\cond{Xcity};\cond{Xregion};\cond{Xzip};\cond{Xcountry}^^J} |
|
\ifexists{Xphone}{TEL;VALUE=uri;TYPE=\ifexists{Xtype}{\Xtype,}voice,text:tel:\Xphone^^J} |
|
\ifexists{Xemail}{EMAIL\ifexists{Xtype}{;TYPE=\Xtype}:\Xemail^^J} |
|
\ifexists{Xjabber}{IMPP;TYPE=XMPP:\Xjabber^^J} |
|
\ifexists{Xmatrixorg}{IMPP;TYPE=MATRIX:\Xmatrixorg^^J} |
|
\ifexists{Xcloud}{URL:https://nextcloud.com/federation/\#\Xcloud^^J} |
|
\ifexists{Xhomepage}{URL:https://\Xhomepage^^J} |
|
\ifexists{Xwordpress}{URL:https://\Xwordpress^^J} |
|
\ifexists{Xdrupal}{URL:https://\Xdrupal^^J} |
|
\ifexists{Xjoomla}{URL:https://\Xjoomla^^J} |
|
\ifexists{Xwikipedia}{URL:https://\lang.wikipedia.org/wiki/\Xwikipedia^^J} |
|
\ifexists{Xlink}{URL:https://\Xlink^^J} |
|
\ifexists{Xworld}{URL:https://\Xworld^^J} |
|
\ifexists{Xgit}{URL:https://\Xgit^^J} |
|
\ifexists{Xgitea}{URL:https://\Xgitea^^J} |
|
\ifexists{Xgithub}{URL:https://github.com/\Xgithub^^J} |
|
\ifexists{Xfacebook}{URL:https://facebook.com/\Xfacebook^^J} |
|
\ifexists{Xtwitter}{URL:https://twitter.com/\Xtwitter^^J} |
|
\ifexists{Xyoutube}{URL:https://youtube.com/user/\Xyoutube^^J} |
|
\ifexists{Xgoogle}{URL:https://plus.google.com/+\Xgoogle^^J} |
|
\ifexists{Xpgpurl}{KEY;MEDIATYPE=application/pgp-keys:\Xpgpurl^^J} |
|
\ifexists{Xpgpfingerprint}{KEY:data:application/x-pgp-fingerprint,\Xpgpfingerprint^^J} |
|
END:VCARD^^J} |
|
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
% address - the address as shown in the textbox |
|
\newcommand\address{ |
|
|
|
\cond{Xpobox} |
|
|
|
\cond{Xextaddr} |
|
|
|
\cond{Xstreet} |
|
|
|
\cond{Xzip} \cond{Xcity} |
|
|
|
\cond{Xregion} \cond{Xcountry} |
|
|
|
} |
|
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
% inserttext - assemble the textbox |
|
\newcommand\inserttext{ |
|
%\frame |
|
{ |
|
\begin{minipage}[c][\heightscale][c]{\textpercents\textwidth} |
|
\ifBCQ@rightalign\begin{flushright}\fi |
|
\ifexists{printaddress}{ |
|
\ifBCQ@iconleft |
|
\ifBCQ@icon\parbox[c]{1em}{\faMapMarker}\ \ifBCQ@fill\hfill\fi\fi |
|
%\frame{ |
|
%\pbox[t]{\dimexpr\textwidth-2em\relax}{ |
|
\begin{varwidth}{\dimexpr\textwidth-2em\relax} |
|
\ifBCQ@rightalign\enforceright\fi\address |
|
\end{varwidth} |
|
%} |
|
%} |
|
\else |
|
%\pbox[t]{\dimexpr\textwidth-2em\relax}{ |
|
\begin{varwidth}{\dimexpr\textwidth-2em\relax} |
|
\ifBCQ@rightalign\enforceright\fi\address |
|
\end{varwidth} |
|
%} |
|
\ifBCQ@icon\ifBCQ@fill\hfill\fi\ \parbox[c]{1em}{\faMapMarker}\fi |
|
\fi |
|
\vspace{1em} |
|
} |
|
|
|
\insa[tel:]{Xphone}{faMobile}\insa[mailto:]{Xemail}{Email}\insa[xmpp]{Xjabber}{faCommentsO}\insa[matrix.org]{Xmatrixorg}{faCommentsO}\insa[nextcloud-id]{Xcloud}{faCloud}\insa[\protdisplay]{Xhomepage}{faHome}\insa[\protdisplay]{Xwordpress}{faWordpress}\insa[\protdisplay]{Xdrupal}{faDrupal}\insa[\protdisplay]{Xjoomla}{faJoomla}\insa[{\protprefix}\lang.wikipedia.org/wiki/]{Xwikipedia}{faWikipediaW}\insa[\protdisplay]{Xlink}{faLink}\insa[\protdisplay]{Xworld}{faGlobe}\insa[\protdisplay]{Xgit}{faGit}\insa[\protdisplay]{Xgitea}{faGithubAlt}\insa[{\protprefix}github.com/]{Xgithub}{faGithub}\insa[{\protprefix}facebook.com/]{Xfacebook}{faFacebook}\insa[{\protprefix}twitter.com/]{Xtwitter}{faTwitter}\insa[{\protprefix}youtube.com/user/]{Xyoutube}{faYoutube}\insa[{\protprefix}plus.google.com/+]{Xgoogle}{faGooglePlus} |
|
|
|
\ifBCQ@rightalign\end{flushright}\fi |
|
\end{minipage} |
|
} |
|
} |
|
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
% insertqrcode - insert the qr-code |
|
\newcommand\insertqrcode{ |
|
%\frame |
|
{ |
|
\begin{minipage}[c][\heightscale][c]{\imagepercents\textwidth} |
|
\qrcode[level=Q,version=0,height=\textwidth]{\vcard} |
|
\end{minipage} |
|
} |
|
} |
|
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
% insertname - insert the name on the top |
|
\newcommand\insertname{ |
|
%\frame |
|
%\begin{minipage}{\textwidth} |
|
%\pbox[t]{0.9\textwidth} |
|
{\bfseries |
|
|
|
\cond{name} |
|
|
|
\cond{Xadditionalnames} |
|
|
|
} |
|
%\end{minipage} |
|
} |
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
% drawcard - assemble all blocks into the visiting card |
|
\newcommand\drawcard{ |
|
\ifBCQ@rightalign\begin{flushright}\fi |
|
\insertname |
|
\noindent\makebox[\linewidth]{\rule{\paperwidth}{0.4pt}} % horizontal line |
|
\vfill |
|
\ifBCQ@qrfirst |
|
\insertqrcode |
|
\hfill |
|
\inserttext |
|
\else |
|
\inserttext |
|
\hfill |
|
\insertqrcode |
|
\fi |
|
\ifexists{Xpgpfingerprint}{ |
|
\vfill |
|
\ifBCQ@iconleft |
|
\faLock\ifBCQ@hint{\tiny\ pgp}\fi\hfill{\small\Xpgpfingerprint} |
|
\else |
|
{\small\Xpgpfingerprint}\hfill\ifBCQ@hint{\tiny{pgp\ }}\fi\faLock |
|
\fi |
|
} |
|
\ifBCQ@rightalign\end{flushright}\fi |
|
} |
|
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
% cut / crop marks |
|
\RequirePackage[\papersize,noinfo,center,pdftex]{crop} |
|
\newcommand\tl{ |
|
\begin{picture}(0,0) |
|
\thinlines\unitlength1mm |
|
\put(-\border,0){\line(1,0){\cutlen}} |
|
\put(0,\border){\line(0,-1){\cutlen}} |
|
\end{picture} |
|
} |
|
\newcommand\tr{ |
|
\begin{picture}(0,0) |
|
\thinlines\unitlength1mm |
|
\put(\border,0){\line(-1,0){\cutlen}} |
|
\put(0,\border){\line(0,-1){\cutlen}} |
|
\end{picture} |
|
} |
|
\newcommand\bl{ |
|
\begin{picture}(0,0) |
|
\thinlines\unitlength1mm |
|
\put(-\border,0){\line(1,0){\cutlen}} |
|
\put(0,-\border){\line(0,1){\cutlen}} |
|
\end{picture} |
|
} |
|
\newcommand\br{ |
|
\begin{picture}(0,0) |
|
\thinlines\unitlength1mm |
|
\put(\border,0){\line(-1,0){\cutlen}} |
|
\put(0,-\border){\line(0,1){\cutlen}} |
|
\end{picture} |
|
} |
|
\cropdef[]\tl\tr\bl\br{cut} |
|
\crop[cut]
|
|
|