Tout d’abord, ceci a pu être fait grâce à la lecture du livre “Tout ce que vous avez toujours voulu savoir sur LaTeX sans jamais oser le demander (ou comment utiliser LaTeX quand on n’y connaît goutte)” disponible gratuitement ici et plus précisément le chapitre 4 relatif à la manipulation de boites.
Pour faire un court résumé, tout fonctionne via des boites. Les lettres sont incluses dans des petites boites qui sont elles-mêmes contenues dans une boite représentant la ligne et le tout est dans une boite représentant le paragraphe.
Lorsque l’on arrive à identifier ces boites et leurs arrangements, il est possible de faire beaucoup de choses : Du texte en diagonal, imposer que la première lettre de chaque chapitre soit calligraphiée, ou même faire des super template LaTeX notamment pour les CV (modernCV est d’ailleurs un template qui est à la fois visuellement beau et bien écrit. Ceux voulant approfondir la mise en page en LaTeX peuvent regarder du coté du fichier “style classic” pour commencer).
Entrons dans le vif du sujet. Si vous avez lu le titre de l’article, vous aurez compris que le but est de faire des cartes de visite en LaTeX. Nous n’utiliserons pas ici de package comme bizcard ou ticket mais nous allons tout faire nous-même (ou presque).
Voici le rendu final :
Tout d’abord, définissons le contour de notre carte de visite.
Afin d’éviter les lourdeurs, seule la commande principale createonecard sera répétée. Pas de panique, le code entier est donné en fin d’article.
Notez ici, que j’utilise des frameboxes (boites avec une frontière) à la place de simples boxes afin de pouvoir visualiser les boites que nous manipulerons.
Afin de minimiser les changements non désirés lorsque nous supprimerons ces frameboxes (et mettrons des boxes à la place), j’impose le margin de ces boites à 0 via la commande \setlength{\fboxsep}{0pt}
.
\documentclass[11pt]{article}
\usepackage[T1]{fontenc}
\parindent0em
\usepackage{graphicx}
\usepackage{xcolor}
\usepackage{fontawesome}
\usepackage{geometry}
\geometry{hmargin=20mm,vmargin=20mm}
\usepackage{ifthen}
\thispagestyle{empty}
\newlength{\cardWidth}
\newlength{\cardHeight}
\setlength{\cardWidth}{8.5cm}
\setlength{\cardHeight}{5.5cm}
\setlength{\fboxsep}{0pt} %to have no space between boxes
\newcommand{\createonecard}{
\framebox{
\begin{minipage}[][\cardHeight][t]{\cardWidth}
%nothing
\end{minipage}
}
}
\begin{document}
\createonecard
\end{document}
Cependant, il serait peut-être intéressant de pouvoir définir une image de fond à notre carte de visite.
Pour cela, nous allons créer un nouvel environnement imgminipage
qui va générer notre minipage ainsi qu’un boite contenant l’image qui nous intéresse. On superpose enfin les boites via une translation horizontale de notre boite contenant l’image.
\newsavebox\mysavebox
\newenvironment{imgminipage}[3]{ %here the begin{imgminipage}
\def\imgcmd{
\ifx& %if the third argument is empty
%nothing
\else
\includegraphics[width=#2,height=#1]{#3}
\fi
}%
\begin{lrbox}{\mysavebox}%
\begin{minipage}[][#1][t]{#2}%
}{ %here the end{imgminipage}
\end{minipage}
\end{lrbox}%
\sbox\mysavebox{\framebox{\usebox\mysavebox}}%
\mbox{\rlap{\raisebox{-\dp\mysavebox}{\imgcmd}}\usebox\mysavebox}%
}
\newcommand{\createonecard}{
\begin{imgminipage}{\cardHeight}{\cardWidth}{}%bgIT.jpg}
%nothing
\end{imgminipage}
}
Pour comprendre plus en détail la définition du nouvel environnement vous pouvez consulter la page 85 du livre cité en début d’article. (NB : pour une meilleure compréhension sachez que \begin{lrbox}{\coucou}\end{lrbox}
est équivalent à \savebox\coucou
).
Nous obtenons le résultat impressionnant suivant :
Bon, ici pas de secret, LaTeX peut faire beaucoup de choses … mais pas arranger magiquement les boites pour vous créer un design sans que vous n’y ayez pensé. :p
Je vous donne un répit. Un design standard est :
– une partie supérieure contenant le nom ainsi que le titre.
– une partie inférieure contenant les informations supplémentaires.
En gros, le découpage suivant :
Vous aurez déjà compris le principe. On va créer des boites dans notre boite. 🙂
C’est partiiii !
\newlength{\sepLine}
\setlength{\sepLine}{1pt}
\newlength{\mainBoxWidth}
\setlength{\mainBoxWidth}{\cardWidth}
\addtolength{\mainBoxWidth}{-2\fboxsep}
\newlength{\headerHeight}
\setlength{\headerHeight}{0.4\cardHeight}
\addtolength{\headerHeight}{-2\fboxsep}
\addtolength{\headerHeight}{-\sepLine}
\newlength{\bottomHeight}
\setlength{\bottomHeight}{0.6\cardHeight}
\addtolength{\bottomHeight}{-2\fboxsep}
\addtolength{\bottomHeight}{-\sepLine}
\newcommand{\createonecard}{
\begin{imgminipage}{\cardHeight}{\cardWidth}{}%bgIT.jpg}
\framebox{%border
\parbox[][\headerHeight][c]{\mainBoxWidth}{%sup
\hfill
}
}
\framebox{%border
\parbox[][\bottomHeight][c]{\mainBoxWidth}{%inf
\hfill
}
}
\end{imgminipage}
}
Les \hfill
ne sont normalement pas obligatoires mais vu qu’il n’y a encore rien dans nos boites, elles prendraient directement une taille nulle et cela ne nous aiderait pas pour les voir.
Bon … il est temps de faire un découpage plus précis que cela et c’est donc à partir d’ici que vos goûts ne vont pas forcément rejoindre les miens. :p
En effet, tout d’abord et afin de séparer les deux composants, j’avais envie de tracer une ligne partant du bord droit et s’arretant peu avant le bord gauche.
Pour cela, on va créer une nouvelle boite qui sera entre la boite “sup” et la boite “inf”.
\definecolor{uni}{rgb}{.3019,.7216,.7019} %couleur de notre ligne
\newcommand{\createonecard}{
\begin{imgminipage}{\cardHeight}{\cardWidth}{}%bgIT.jpg}
\framebox{%border
\parbox[][\headerHeight][c]{\mainBoxWidth}{%sup
}
}
\makebox{%
\hspace*{0.2cm}%bricolage immonde pour que la ligne commence à droite de la carte sans padding
\parbox[c]{\mainBoxWidth}{
\raggedleft\raisebox{1pt}{
\color{uni}\rule{0.8\mainBoxWidth}{0.25ex}
}
}%
}
\framebox{%border
\parbox[][\bottomHeight][c]{\mainBoxWidth}{%inf
}
}
\end{imgminipage}
}
Et voici le résultat.
Nous sommes arrivés au moment où nous devons remplir notre carte de visite et donc de savoir comment arranger les différentes informations. :p
Pour ma part, voici le design que je désirais :
– une partie supérieure contenant un logo à gauche ainsi que mon nom et titre à droite.
– une partie inférieure contenant mes informations à gauche et un QRcode redirigeant vers un CV détaillé à droite.
Et c’est reparti pour des boites !
\newcommand{\createonecard}{
\begin{imgminipage}{\cardHeight}{\cardWidth}{}%bgIT.jpg}
\framebox{%border
\parbox[][\headerHeight][c]{\mainBoxWidth}{%sup
\framebox{
\parbox{0.3\mainBoxWidth}{%logo
\hfill
}
}
\framebox{%border
\hspace{3pt}
\parbox[c][\headerHeight][c]{0.65\mainBoxWidth}{%main info
\hfill
}
}
}
}
\makebox{%
\hspace*{0.2cm}%bricolage immonde pour que la ligne commence à droite de la carte sans padding
\parbox[c]{\mainBoxWidth}{
\raggedleft\raisebox{1pt}{
\color{uni}\rule{0.8\mainBoxWidth}{0.25ex}
}
}%
}
\framebox{%border
\parbox[][\bottomHeight][c]{\mainBoxWidth}{%inf
\framebox{%border
\hspace{3pt}
\parbox[c][0.9\bottomHeight][c]{0.64\mainBoxWidth}{%details
\hfill
}
}
\hspace{3pt}
\framebox{
\parbox{0.3\mainBoxWidth}{%qrcode
\hfill
}
}
}
}
\end{imgminipage}
}
Voici le résultat de notre premier découpage :
Et … en fait, la partie la plus compliquée est déjà terminée !
Il ne nous reste plus qu’à choisir les images et les polices de caractère.
Le dernier petit détail était pour les informations : je désirais afficher diverses icones correspondant aux informations à afficher. A part cela, le reste est très standard.
Nous allons remplir nos boites avec des \adress
, \phone
, \logo
dont nous attribuerons la valeur ultérieurement.
C’est parti pour la dernière ligne droite !
\newlength{\iconWidth}
\newcommand{\createonecard}{
\begin{imgminipage}{\cardHeight}{\cardWidth}{}%bgIT.jpg}
\framebox{%border
\parbox[][\headerHeight][c]{\mainBoxWidth}{%sup
\framebox{
\parbox{0.3\mainBoxWidth}{%logo
\ifthenelse{\isundefined{\logo}}
{\hfill}
{\includegraphics[width=0.3\mainBoxWidth]{\logo}}
}
}
\framebox{%border
\hspace{3pt}
\parbox[c][\headerHeight][c]{0.65\mainBoxWidth}{%main info
{\bfseries{\LARGE \name}} \par
\small\title
}
}
}
}
\makebox{%
\hspace*{0.2cm}%bricolage immonde pour que la ligne commence à droite de la carte sans padding
\parbox[c]{\mainBoxWidth}{
\raggedleft\raisebox{1pt}{
\color{uni}\rule{0.8\mainBoxWidth}{0.25ex}
}
}%
}
\framebox{%border
\parbox[][\bottomHeight][c]{\mainBoxWidth}{%inf
\framebox{%border
\hspace{3pt}
\parbox[c][0.9\bottomHeight][c]{0.64\mainBoxWidth}{%details
\hfill
\settowidth{\iconWidth}{\mailsymbol}
\tiny
\parbox[][][c]{0.63\mainBoxWidth}{
\makebox[\iconWidth]{
\mailsymbol
}
\raisebox{3pt}{
\email
}
}
\parbox[][][c]{0.63\mainBoxWidth}{
\makebox[\iconWidth]{
\phonesymbol
}
\raisebox{3pt}{
\phone
}
}
\parbox[][][c]{0.63\mainBoxWidth}{
\makebox[\iconWidth]{
\addresssymbol
}
\raisebox{3pt}{
\address
}
}
\parbox[][][c]{0.63\mainBoxWidth}{
\vspace*{5pt}
\makebox[\iconWidth]{
}
\extrainfo
}
}
}
\hspace{3pt}
\framebox{
\parbox{0.3\mainBoxWidth}{%qrcode
\ifthenelse{\isundefined{\qr}}
{\hfill}
{\includegraphics[width=0.3\mainBoxWidth]{\qr}}
}
}
}
}
\end{imgminipage}
}
\begin{document}
% personal data
\def\name{Renaud Hoyoux}
\def\title{Software Engineer -- IThusiast}
\def\address{Somewhere}
\def\email{Something}
\def\phone{Something}
\def\extrainfo{Great interest in Java technologies and banking environment.}
\def\logo{turtle}
\def\qr{radiuscode}
\def\mailsymbol{{\Large\faEnvelope}}
\def\addresssymbol{{\Large\faHome}}
\def\phonesymbol{{\Large\faMobilePhone}}
\def\homepagesymbol{{\Large\faGlobe}}
\createonecard
\end{document}
nous donne
où le QRcode a été généré avec Zxing grâce au tutorial de Thierry Leriche situé ici.
En retirant toutes les boites et en jouant un peu avec les espaces, nous obtenons enfin notre rendu final.
J’en profite pour faire une petite pub pour le site Unitag qui peut vous générer de jolis QRcodes gratuitement (comme le suivant) pour tout ceux qui n’ont pas envie de faire joujou avec Java2D. :p
Maintenant que nous savons faire une carte de visite, il ne nous reste plus qu’à en faire toute une page !
\newcommand{\createcards}{
\newcounter{counter}
\setcounter{counter}{0}
\whiledo{\value{counter}<8}{%
\ifthenelse{\isodd{\value{counter}}}%
{%
\createonecard%
\par%
}{%
\createonecard%
}%
\addtocounter{counter}{1}%
}
}
\begin{document}
% personal data
%...
\createcards
\end{document}
Nous sommes arrivés à générer le PDF montré au début de cet article et la boucle est bouclée. 🙂
Et voici comme promis le code complet 🙂
Update : Pour plus de facilité, vous trouverez ici le code actuel “empackagé” pour l’occasion.
\documentclass[11pt]{article}
\usepackage[T1]{fontenc}
\parindent0em
\usepackage{graphicx}
\usepackage{xcolor}
\usepackage{fontawesome}
\usepackage{geometry}
\geometry{hmargin=20mm,vmargin=20mm}
\usepackage{ifthen}
\thispagestyle{empty}
\newsavebox\mysavebox
\newenvironment{imgminipage}[3]{%
\def\imgcmd{
\ifx&%
%nothing
\else
\includegraphics[width=#2,height=#1]{#3}
\fi
}%
\begin{lrbox}{\mysavebox}%
\begin{minipage}[][#1][t]{#2}%
}{%
\end{minipage}
\end{lrbox}%
\sbox\mysavebox{\framebox{\usebox\mysavebox}}%
\mbox{\rlap{\raisebox{-\dp\mysavebox}{\imgcmd}}\usebox\mysavebox}%
}
\newlength{\cardWidth}
\newlength{\cardHeight}
\setlength{\cardWidth}{8.5cm}
\setlength{\cardHeight}{5.5cm}
\newlength{\sepLine}
\setlength{\sepLine}{1pt}
\newlength{\mainBoxWidth}
\setlength{\mainBoxWidth}{\cardWidth}
\addtolength{\mainBoxWidth}{-2\fboxsep}
\newlength{\headerHeight}
\setlength{\headerHeight}{0.4\cardHeight}
\addtolength{\headerHeight}{-2\fboxsep}
\addtolength{\headerHeight}{-\sepLine}
\newlength{\bottomHeight}
\setlength{\bottomHeight}{0.6\cardHeight}
\addtolength{\bottomHeight}{-2\fboxsep}
\addtolength{\bottomHeight}{-\sepLine}
\newlength{\iconWidth}
\setlength{\fboxsep}{0pt} %to have no space between boxes
\newcommand{\createonecard}{
\begin{imgminipage}{\cardHeight}{\cardWidth}{}%bgIT.jpg}
\parbox[][\headerHeight][c]{\mainBoxWidth}{%sup
\parbox{0.3\mainBoxWidth}{%logo
\ifthenelse{\isundefined{\logo}}
{\hfill}
{\includegraphics[width=0.3\mainBoxWidth]{\logo}}
}
\hspace{3pt}
\parbox[c][\headerHeight][c]{0.65\mainBoxWidth}{%main info
{\bfseries{\LARGE \name}} \par
\small\title
\hfill
}
}
\makebox{%
\hspace*{0.2cm}%bricolage immonde pour que la ligne commence à droite de la carte sans padding
\parbox[c]{\mainBoxWidth}{
\raggedleft\raisebox{1pt}{
\color{uni}\rule{0.8\mainBoxWidth}{0.25ex}
}
}%
}
\parbox[][\bottomHeight][c]{\mainBoxWidth}{%inf
\hspace{3pt}
\parbox[c][0.9\bottomHeight][c]{0.64\mainBoxWidth}{%details
\hfill
\settowidth{\iconWidth}{\mailsymbol}
\tiny
\parbox[][][c]{0.63\mainBoxWidth}{
\makebox[\iconWidth]{
\mailsymbol
}
\raisebox{3pt}{
\email
}
}
\parbox[][][c]{0.63\mainBoxWidth}{
\makebox[\iconWidth]{
\phonesymbol
}
\raisebox{3pt}{
\phone
}
}
\parbox[][][c]{0.63\mainBoxWidth}{
\makebox[\iconWidth]{
\addresssymbol
}
\raisebox{3pt}{
\address
}
}
\parbox[][][c]{0.63\mainBoxWidth}{
\vspace*{5pt}
\makebox[\iconWidth]{
}
\extrainfo
}
}
\hspace{3pt}
\parbox{0.3\mainBoxWidth}{%qrcode
\ifthenelse{\isundefined{\qr}}
{\hfill}
{\includegraphics[width=0.3\mainBoxWidth]{\qr}}
}
}
}
\end{imgminipage}
}
\newcommand{\createcards}{
\newcounter{counter}
\setcounter{counter}{0}
\whiledo{\value{counter}<8}{%
\ifthenelse{\isodd{\value{counter}}}%
{%
\createonecard%
\par%
}{%
\createonecard%
}%
\addtocounter{counter}{1}%
}
}
\begin{document}
\definecolor{uni}{rgb}{.3019,.7216,.7019}
% personal data
\def\name{Renaud Hoyoux}
\def\title{Software Engineer -- IThusiast}
\def\address{Somewhere}
\def\email{Something}
\def\phone{Something}
\def\extrainfo{Great interest in Java technologies and banking environment.}
\def\logo{turtle}
\def\qr{radiuscode}
\def\mailsymbol{{\Large\faEnvelope}}
\def\addresssymbol{{\Large\faHome}}
\def\phonesymbol{{\Large\faMobilePhone}}
\createcards
\end{document}