|
|
|
\NeedsTeXFormat{LaTeX2e}
|
|
|
|
\ProvidesClass{businesscard-qrcode}[2018/08/13 cleanup and bug fixes]
|
|
|
|
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
% 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}
|
|
|
|
|
|
|
|
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
% 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{pgpfingerprint}{2em}{0em}-\ifcsdef{additionalnames}{2em}{0em}\relax}
|
|
|
|
|
|
|
|
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
% name - assemble full name from the parts, such as givennames and familynames
|
|
|
|
\newcommand\name{\ifexists{honoricprefix}{\honoricprefix\ }\ifexists{givennames}{\givennames\ }\ifexists{familynames}{\familynames}\ifexists{honoricsuffix}{\ \honoricsuffix}}
|
|
|
|
|
|
|
|
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
% vcard - the content of the vcard
|
|
|
|
\newcommand\vcard{BEGIN:VCARD^^J
|
|
|
|
VERSION:4.0^^J
|
|
|
|
N:\cond{familynames};\cond{givennames};\cond{additionalnames};\cond{honoricprefix};\cond{honoricsuffix}^^J
|
|
|
|
FN:\name\ifexists{additionalnames}{\ifcsempty{name}{}{\ }\additionalnames}^^J
|
|
|
|
\ifexists{printaddress}{ADR\ifexists{type}{;TYPE=\type}:\cond{pobox};\cond{extaddr};\cond{street};\cond{city};\cond{region};\cond{zip};\cond{country}^^J}
|
|
|
|
\ifexists{phone}{TEL;VALUE=uri;TYPE=\ifexists{type}{\type,}voice,text:tel:\phone^^J}
|
|
|
|
\ifexists{email}{EMAIL\ifexists{type}{;TYPE=\type}:\email^^J}
|
|
|
|
\ifexists{jabber}{IMPP;TYPE=XMPP:\jabber^^J}
|
|
|
|
\ifexists{matrixorg}{IMPP;TYPE=MATRIX:\matrixorg^^J}
|
|
|
|
\ifexists{cloud}{URL:https://nextcloud.com/federation/\#\cloud^^J}
|
|
|
|
\ifexists{homepage}{URL:https://\homepage^^J}
|
|
|
|
\ifexists{wordpress}{URL:https://\wordpress^^J}
|
|
|
|
\ifexists{drupal}{URL:https://\drupal^^J}
|
|
|
|
\ifexists{joomla}{URL:https://\joomla^^J}
|
|
|
|
\ifexists{wikipedia}{URL:https://\lang.wikipedia.org/wiki/\wikipedia^^J}
|
|
|
|
\ifexists{link}{URL:https://\link^^J}
|
|
|
|
\ifexists{world}{URL:https://\world^^J}
|
|
|
|
\ifexists{git}{URL:https://\git^^J}
|
|
|
|
\ifexists{gitea}{URL:https://\gitea^^J}
|
|
|
|
\ifexists{github}{URL:https://github.com/\github^^J}
|
|
|
|
\ifexists{facebook}{URL:https://facebook.com/\facebook^^J}
|
|
|
|
\ifexists{twitter}{URL:https://twitter.com/\twitter^^J}
|
|
|
|
\ifexists{youtube}{URL:https://youtube.com/user/\youtube^^J}
|
|
|
|
\ifexists{google}{URL:https://plus.google.com/+\google^^J}
|
|
|
|
\ifexists{pgpurl}{KEY;MEDIATYPE=application/pgp-keys:\pgpurl^^J}
|
|
|
|
\ifexists{pgpfingerprint}{KEY:data:application/x-pgp-fingerprint,\pgpfingerprint^^J}
|
|
|
|
END:VCARD^^J}
|
|
|
|
|
|
|
|
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
% address - the address as shown in the textbox
|
|
|
|
\newcommand\address{
|
|
|
|
|
|
|
|
\cond{pobox}
|
|
|
|
|
|
|
|
\cond{extaddr}
|
|
|
|
|
|
|
|
\cond{street}
|
|
|
|
|
|
|
|
\cond{zip} \cond{city}
|
|
|
|
|
|
|
|
\cond{region} \cond{country}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
% 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:]{phone}{faMobile}\insa[mailto:]{email}{Email}\insa[xmpp]{jabber}{faCommentsO}\insa[matrix.org]{matrixorg}{faCommentsO}\insa[nextcloud-id]{cloud}{faCloud}\insa[\protdisplay]{homepage}{faHome}\insa[\protdisplay]{wordpress}{faWordpress}\insa[\protdisplay]{drupal}{faDrupal}\insa[\protdisplay]{joomla}{faJoomla}\insa[{\protprefix}\lang.wikipedia.org/wiki/]{wikipedia}{faWikipediaW}\insa[\protdisplay]{link}{faLink}\insa[\protdisplay]{world}{faGlobe}\insa[\protdisplay]{git}{faGit}\insa[\protdisplay]{gitea}{faGithubAlt}\insa[{\protprefix}github.com/]{github}{faGithub}\insa[{\protprefix}facebook.com/]{facebook}{faFacebook}\insa[{\protprefix}twitter.com/]{twitter}{faTwitter}\insa[{\protprefix}youtube.com/user/]{youtube}{faYoutube}\insa[{\protprefix}plus.google.com/+]{google}{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{additionalnames}
|
|
|
|
|
|
|
|
}
|
|
|
|
%\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{pgpfingerprint}{
|
|
|
|
\vfill
|
|
|
|
\ifBCQ@iconleft
|
|
|
|
\faLock\ifBCQ@hint{\tiny\ pgp}\fi\hfill{\small\pgpfingerprint}
|
|
|
|
\else
|
|
|
|
{\small\pgpfingerprint}\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]
|