LaTeX forum ⇒ XeTeXGenerating small business cards

Information and discussion about XeTeX, an alternative for pdfTeX based on e-Tex
bartzmc
Posts: 10
Joined: Thu Apr 06, 2017 9:15 pm

Generating small business cards

Postby bartzmc » Tue Feb 26, 2019 6:25 pm

Based on https://www.overleaf.com/latex/examples/mailmerged-business-cards/gnnhcjvkvcfd

I'm trying to implement a project that would generate small business cards based on a csv file.
I created a code similar to here:

https://tex.stackexchange.com/questions/153834/print-business-cards-in-latex

That is, compiling one business card to the first.pdf file, and for the next compilation inserting it into the second page so that you can cut them according to the pattern. It's a two step process. I want these small business cards to be generated straight away from the file. I want to achive only second side of my file and in addition not only one person's business card but one by one each line from the file. But not necessarily, I care more about small business cards, it can be one person's data.

Image

Data.csv looks like:
Name,Subtitle,Division,Employer,JobTitle,Speciality1,Speciality2,Speciality3,Web,Email1,Email2,Mobile,GPG
{Helena Doe},subtitle,Division,Employer,Job Title,Speciality 1,Speciality 2,Speciality 3,https://fqdn/,helena@univ.edu,hxr42@gmail.com,+1 123 456 7890,425B 030A B8D2 0316 CA1B 4709 CA83 5DDA EC31 CA56

Image

My code:
\documentclass[11pt,a4paper]{article}

\setstocksize{55mm}{85mm} % UK Stock size
\setpagecc{55mm}{85mm}{*}
\settypeblocksize{45mm}{75mm}{*}
\setulmargins{5mm}{*}{*}
\setlrmargins{5mm}{*}{*}
\usepackage{xcolor}
\usepackage{datatool}
\DTLloaddb{namelist}{data.csv}

\setheadfoot{0.1pt}{0.1pt}
\setheaderspaces{1pt}{*}{*}

\checkandfixthelayout[fixed]

\pagestyle{empty}

\usepackage{pstricks}
\usepackage{auto-pst-pdf,pst-barcode}

%% These packages only for typesetting the instructions
\usepackage{listings}
\usepackage{enumitem}

\usepackage{stackengine}
\usepackage{graphicx}

\newlength\plusheight
\newlength\stackvgap

\def\myvgap{1ex}
\def\myhgap{1ex}

\def\myimg{\protect\includegraphics[scale=1.0]{first}}
\def\myimgwd{\widthof{\myimg}-\widthof{+}}
\def\imgline{\myimg\protect\hspace{\myhgap}\myimg}
\def\seperatorline{+\protect\rule{\myimgwd+\myhgap}{0pt}+\protect\rule{\myimgwd+\myhgap}{0pt}+}
\setlength\plusheight{\heightof{+}}
\addtolength\plusheight{\depthof{+}}
\setlength\stackvgap{\myvgap-\the\plusheight}
\setlength\stackvgap{.5\stackvgap}
\setstackgap{S}{\the\stackvgap}

\pagestyle{empty}
\usepackage{scrextend}

\begin{document}

%% For each line in namelist (which was loaded from data.csv), 
%% output the following text (with mailmerged field values)
\DTLforeach{namelist}{%
    %% Map each column header in your .csv file to a command
    \Name=Name,%
    \Subtitle=Subtitle,%
    \Division=Division,%
    \Employer=Employer,%
    \JobTitle=JobTitle,%
    \SpecialityOne=Speciality1,%
    \SpecialityTwo=Speciality2,%
    \SpecialityThree=Speciality3,%
    \Web=Web,%
    \EmailOne=Email1,%
    \EmailTwo=Email2,%
    \Mobile=Mobile,%
    \GPG=GPG%
}{%%%  Start designing your output text! 
  %%%  Mailmerged field values can be inserted using the commands
  %%%  you've just mapped above.

  \begin{Spacing}{0.75}%
    \noindent
    \textbf{\Name}\\[3pt]
    \tiny\mbox{}\Subtitle \hfill {\color{gray}\Division{} / \Employer}\\ 
    \rule{\textwidth}{.3mm}\\
    \begin{minipage}[t]{30mm}
        \vspace{-0mm}%
        \begin{pspicture}(25mm,25mm)
            % The MECARD format is used to exchange contact information. More information at:
            % https://www.nttdocomo.co.jp/english/service/developer/make/content/barcode/function/application/addressbook/index.html
\psbarcode{MECARD:N:\Name;URL:\Web;EMAIL:\EmailOne;TEL:\Mobile;NOTE:GPG key fingerprint: \GPG;}{eclevel=L width=1 height=1}{qrcode}
        \end{pspicture}
    \end{minipage}
    \hspace{1mm}
    \begin{minipage}[t]{42mm}
        \vspace{-0mm}%
        \begin{flushleft}
        {\scriptsize
            \begin{Spacing}{1}%
            \textbf{\JobTitle}\\[5mm]
            % \hspace{5mm}\mbox{}\SpecialityOne\\
            \mbox{}\SpecialityOne\\            
            \mbox{}\SpecialityTwo\\
            \mbox{}\SpecialityThree \vspace{2mm}\\
            \end{Spacing}
        }
        {\tiny
            \begin{tabular}{@{}rl@{}l}
                {\color{gray}email}: & \EmailOne    & \\
                {\color{gray}mobile}:& \Mobile      & \\
            \end{tabular}
            \vspace*{2mm}
        }
        \end{flushleft}
    \end{minipage}
    \rule{74mm}{0mm}\\
    \texttt{\fontsize{2.84mm}{3.55mm}\selectfont \GPG} % GPG KEY ID
    \end{Spacing}
}

\eject \pdfpagewidth=210mm \pdfpageheight=297mm
\leftskip10mm

\vfill
\Shortstack{%
 {\seperatorline}
 {\imgline} {\seperatorline}
 {\imgline} {\seperatorline}
 {\imgline} {\seperatorline}
 {\imgline} {\seperatorline}
 {\imgline} {\seperatorline}}
\vfill

\end{document}
Last edited by bartzmc on Sun Mar 03, 2019 12:20 pm, edited 4 times in total.

rais
Posts: 291
Joined: Sun Nov 16, 2014 8:51 pm

Postby rais » Fri Mar 01, 2019 7:30 pm

You could try putting the card in a box, say
\documentclass[11pt,a4paper]{article}
\usepackage{xcolor}
\usepackage{filecontents}
\begin{filecontents*}{\jobname-dat.csv} 
Name,Subtitle,Division,Employer,JobTitle,Speciality1,Speciality2,Speciality3,Web,Email1,Email2,Mobile,GPG
{Helena Doe},subtitle,Division,Employer,Job Title,Speciality 1,Speciality 2,Speciality 3,https://fqdn/,helena@univ.edu,hxr42@gmail.com,+1 123 456 7890,425B 030A B8D2 0316 CA1B 4709 CA83 5DDA EC31 CA56
{Jane Doe},subtitle,Division,Employer,Job Title,Speciality 1,Speciality 2,Speciality 3,https://fqdn/,jane@univ.edu,hxr42@gmail.com,+1 123 456 7890,425B 030A B8D2 0316 CA1B 4709 CA83 5DDA EC31 CA56
\end{filecontents*}
\usepackage{datatool}
\usepackage[left=1cm, right=1cm, top=1cm, bottom=1cm]{geometry}
\DTLloaddb{namelist}{\jobname-dat.csv}
     
\usepackage{fontspec}
\setmainfont{Universalis ADF Std}
     
\pagestyle{empty}
 
\usepackage{pstricks}
\usepackage{auto-pst-pdf,pst-barcode}
     
\newsavebox\currbizcard
 
\pagestyle{empty}
 
\usepackage{scrextend}
\newlength\xbetweencards
\newlength\ybetweencards
\setlength\xbetweencards{24pt}
\setlength\ybetweencards{24pt}

\begin{document}
     
%% For each line in namelist (which was loaded from \jobname-dat.csv), 
%% output the following text (with mailmerged field values)
\DTLforeach*{namelist}{% Map each column header in your .csv file to a command
  \Name=Name, \Subtitle=Subtitle, \Division=Division, \Employer=Employer,%
  \JobTitle=JobTitle, \SpecialityOne=Speciality1, \SpecialityTwo=Speciality2, \SpecialityThree=Speciality3,%
  \Web=Web, \EmailOne=Email1, \EmailTwo=Email2, \Mobile=Mobile, \GPG=GPG%
}{%
  \sbox\currbizcard{%
    \begin{minipage}{74mm}%
      \noindent
      \textbf{\Name}\\[3pt]
      \tiny \Subtitle \hfill {\color{gray}\Division{} / \Employer}\\ 
      \rule{\textwidth}{.3mm}\\
      \begin{minipage}[t]{30mm}
        \vspace{-0mm}%
        \begin{pspicture}(25mm,25mm)
          \psbarcode{MECARD:N:\Name;URL:\Web;EMAIL:\EmailOne;TEL:\Mobile;NOTE:GPG key fingerprint: \GPG;}{eclevel=L width=1 height=1}{qrcode}
        \end{pspicture}
      \end{minipage}%
      \hspace{1mm}%
      \begin{minipage}[t]{42mm}
        \vspace{-0mm}%
        \begin{flushleft}
          {\scriptsize
%            \begin{Spacing}{1}%
              \textbf{\JobTitle}\\[5mm]
              \SpecialityOne\\            
              \SpecialityTwo\\
              \SpecialityThree \vspace{2mm}\\
%            \end{Spacing}
          }
          {\tiny
            \begin{tabular}{@{}rl@{}}
              {\color{gray}email}: & \EmailOne\\
              {\color{gray}mobile}:& \Mobile\\
            \end{tabular}
            \vspace*{2mm}
          }
        \end{flushleft}
      \end{minipage}
      \rule{74mm}{0mm}\\
      \texttt{\fontsize{2.84mm}{3.55mm}\selectfont \GPG} % GPG KEY ID
    \end{minipage}
    }%
  \centering
  \null\vfill
    \usebox\currbizcard\hspace{\xbetweencards}\usebox\currbizcard\\[\ybetweencards]
    \usebox\currbizcard\hspace{\xbetweencards}\usebox\currbizcard\\[\ybetweencards]
    \usebox\currbizcard\hspace{\xbetweencards}\usebox\currbizcard\\[\ybetweencards]
    \usebox\currbizcard\hspace{\xbetweencards}\usebox\currbizcard\\[\ybetweencards]
    \usebox\currbizcard\hspace{\xbetweencards}\usebox\currbizcard\par
  \vfill\clearpage
}  
\end{document}

I may have thrown out a bit too much from the code, but hey...
The font you used I don't have on this machine, I opted for a font that ships with TL'18 instead.(that's not part of my
suggestion)
I renamed the csv file, because the filecontents package lets the filecontents environment overwrite any existing file with the filename given to this environment (to be able to make changes from within the .tex file)---in short, I didn't want to overwrite your data.csv by accident;-)

KR
Rainer

bartzmc
Posts: 10
Joined: Thu Apr 06, 2017 9:15 pm

Postby bartzmc » Sun Mar 03, 2019 10:11 am

Thank you for this solution.

victorpatrick123
Posts: 1
Joined: Wed Dec 11, 2019 11:53 am

Postby victorpatrick123 » Wed Dec 11, 2019 11:56 am

This is very useful.


Return to “XeTeX”

Who is online

Users browsing this forum: No registered users and 3 guests