\chapter{Les tableaux et boîtes sous \LaTeX{}} \label{chap-table}\lettrine{S}{ynthétiser} l'information n'est pas toujours évident. Et pourtant, un bon tableau suffit parfois à véhiculer un message ou à lister des éléments. Voyons comment en créer sous \LaTeX{}. \\ \input{./Chapitres/code-base} \section{Conventions} C'est le passage un peu rébarbatif du guide mais qu'il faut rappeler si tu t'intéresses un peu à la mise en forme de documents. Les conventions que je vais énoncer ci-après proviennent à l'origine du guide du package \verb?booktabs?\footnote{Disponible sur : \url{https://www.ctan.org/pkg/booktabs}.}, qui permet d'améliorer la qualité des tableaux sous \LaTeX{}. \begin{regles}{Les conventions pour rédiger des tableaux} {\noindent\huge\bfseries\color{gray!75}\og} Tu ne feras pas de graves erreurs si tu te rappelles à tout moment de deux simples commandements : \begin{enumerate} \item Ne jamais, au grand jamais, utiliser de filets verticaux. \item Ne jamais utiliser de filets doubles. \\ \end{enumerate} Ces commandements peuvent sembler extrêmes mais en des années d'expérience je n'ai jamais trouvé un bon argument pour passer outre. Par exemple, si tu estimes que les informations dans la moitié gauche d'une table sont si différentes de celles de la droite qu'il faut les séparer par une ligne verticale, alors tu devrais plutôt utiliser deux tables. Le second commandement est très, très occasionnellement violé. [\dots{}] \\ Il y a trois autres conseils que je pourrai citer ici car ils sont si peu connus en dehors des cercles des typographes et éditeurs professionnels : \begin{enumerate} \item Place les unités dans l'en-tête de la colonne (pas dans le corps de la table). \item Fais toujours précéder un point décimal (une virgule décimale en français) par un chiffre ; donc 0.1 (ou 0,1) et pas simplement .1 (,1). \item N'utilises pas de signes \og ditto \fg{} ou toute convention analogue pour répéter une valeur précédente. Dans la plupart des cas, un blanc fait aussi bien l'affaire. Sinon, répètes la valeur. \\ \end{enumerate} Est-ce que c'est moi qui suis pédant ? Ces derniers conseils sont de plus en plus souvent ignorés dans les travaux publiés. Pour moi, ceci montre simplement que la typographie est celle d'un amateur. {\hfill\huge\bfseries\color{gray!75}\fg} \\ \begin{flushright} Guide du package \verb?booktabs? \url{https://www.ctan.org/pkg/booktabs} \end{flushright} \end{regles} Maintenant que les conventions sont posées, voyons désormais comment créer un tableau. \section{Création de tableaux} Nativement, tous les éléments sont disponibles sous \LaTeX{} pour créer des tableaux extrêmement simples. Pour ce faire, il faut utiliser l'environnement \verb?tabular?. Si tu te souviens bien de la construction de l'environnement \verb?array? (tableaux en mode mathématiques), tu vas vite te rendre compte que le fonctionnement de base de l'environnement \verb?tabular? (tableaux en mode texte) est identique. Un petit exemple, comme toujours : \begin{codedisplay}{Premiers tableaux} \begin{tabular}{cc} Centrage & Ici aussi \\ Ok ! & $\alpha = 13$ \end{tabular} \\ \\ \begin{tabular}{ll} \hline Tableau & simple \\ \hline sous & \LaTeX{} \\ \hline \end{tabular} \end{codedisplay} Comme tu peux le constater, je ne t'ai pas menti : la construction est rigoureusement identique à celle de l'environnement \verb?array?. La seule différence ? Comme il s'agit d'un tableau en mode texte, il est tout à fait licite d'introduire un mode mathématiques local (avec des \verb?$?) pour écrire des mathématiques dans une cellule du tableau. Pour la séparation avec un filet\footnote{Terme consacré apparemment : c'est l'équivalent d'un ``trait''.} horizontal, il faut donc appeler la commande \verb?\hline? \textbf{après} un saut de ligne (hormis au début du tableau). \begin{attention}{Une question ?} \og Par rapport à ton exemple, mes tableaux sont plus resserrés. Pourquoi n'avons-nous pas le même résultat ? \fg{} \\ Question très pertinente : j'ai en effet une corde supplémentaire à mon arc. J'ai indiqué dans le \textbf{préambule} de ce guide une commande qui impacte tous mes tableaux et permet de les aérer un peu plus. Cette commande est la suivante : \begin{center} \verb?\renewcommand{\arraystretch}{1.3}? \end{center} Elle permet d'agrandir la hauteur minimale d'une ligne, ce qui permet d'aérer les tableaux. Le coefficient de \verb?1.3? est un choix personnel : libre à toi de le modifier à ta convenance. \end{attention} \begin{conseil}{La petite astuce} Si jamais tu as un ``grand nombre'' de colonnes à déclarer lors de la création de ton tableau, il existe un petit raccourci. Au lieu d'écrire \verb?c...c? (\verb?N? fois), tu peux écrire \verb?*{N}{|c}|?. Ainsi, tu crées \verb?N? colonnes centrées. Pratique, non ? \end{conseil} Si tu veux des options plus poussées sur les tableaux (fusion de cellules, remplissage, mise en gras d'une colonne entière\dots{}), je te renvoie à la 3\up{ème} partie de ce guide où tu peux trouver des réponses. Internet peut aussi t'aider si besoin. Sache encore que, dès l'instant où tu arpentes le chemin d'une personnalisation très poussée et sophistiquée, tu risques de perdre beaucoup de temps à faire en sorte que le code \LaTeX{} fonctionne. Avec les éléments de base que je viens de te présenter, j'estime que tu peux déjà faire 70 \% des tableaux nécessaires. Pour les 30 \% restants, à titre indicatif et si tu es curieux, tu peux te tourner vers les packages suivants : \verb?array?, \verb?booktabs?, \verb?longtable? et \verb?multirow? (fusion de lignes ; fusion de colonnes possible de base avec la commande \verb?\multicolumn?). \\ Maintenant que les éléments de base ont été présentés, passons à un autre élément important. \section{Insérer une légende} Avoir un tableau, c'est bien. Avoir un tableau avec une légende, c'est mieux. Et avoir une légende avec une numérotation automatique, c'est encore mieux ! Fort heureusement, \LaTeX{} propose tous ces éléments nativement. Je ne vais pas rentrer dans les détails du concept, que je développe plus amplement dans le prochain chapitre. Sache juste, pour commencer, qu'il te faut procéder de la manière suivante : \begin{enumerate} \item Insertion du tableau dans un environnement \verb?table?. \item Insertion de la légende avant ou après le tableau (au choix) grâce à la commande \verb?\caption{Légende}?. \\ \end{enumerate} Un exemple minimaliste serait alors le suivant : % codedisplay impossible ici (ou emploi de \begin{table}[H]) \begin{code}{Tableau \& légende} \begin{table} \centering \caption{Légende du tableau} \begin{tabular}{ccc} Tableau & de & test \\ \hline sous & \LaTeX{} \end{tabular} \end{table} \end{code} Passons maintenant à un autre élément disponible sous \LaTeX{} pour faire un peu de mise en forme sans nécessairement passer par un tableau : les boîtes. \section{Les boîtes} \subsection*{La théorie} Si tu peux tout à fait utiliser un tableau pour encadrer des formules, des images ou du texte, il existe d'autres solutions plutôt complètes et personnalisables sous \LaTeX{}. En l'occurrence, parlons des boîtes. \\ Sous \LaTeX{}, tout tient dans une boîte : les lettres, les paragraphes, les tableaux, les images, les équations\dots{} Bref, tout ! Concrètement, une \textit{box} (boîte) est le terme technique en \LaTeX{} pour un contenant invisible qui peut contenir soit un élément visible, soit une autre boîte, soit rien du tout. Ensuite, chaque boîte est connecté grâce à de la \textit{glue} (colle), qui détermine la séparation entre les boîtes. Dans un document traditionnel, les ``lettres-boîtes'' sont donc collées à d'autres pour former des mots, eux-mêmes collés élastiquement à d'autres mots pour former des phrases. Ces phrases sont découpées en lignes et placées dans un paragraphe (boîte encore une fois), écarté ou collé à d'autres paragraphes de manière élastique là encore, cette fois pour former des pages suffisamment aérées et remplies. C'est donc ainsi que \LaTeX{} construit un document et les pages qui le compose, en collant les boîtes ensembles et grâce aux règles de base (natives) et à celles définies par l'utilisateur. \\ Concrètement, une boîte ressemble à : \begin{figure}[H] \begin{tikzpicture}[arrow/.style = {<->, > = Triangle}, legend/.style = {align = center, text width = 2cm}] \node[draw, font = \fontsize{110pt}{55pt}\selectfont, inner sep = 0pt] (lettre) {p}; \def\shift{7pt} \draw[arrow, Green] ([xshift = -\shift]lettre.north west) -- node[left, legend] {hauteur \textbackslash\texttt{height}} ([shift = {(lettre.west)}, xshift = -\shift]lettre.base); \draw[arrow, cyan] ([shift = {(lettre.west)}, xshift = -\shift]lettre.base) -- node[left, legend] {profondeur \\ \textbackslash\texttt{depth}} ([xshift = -\shift]lettre.south west); \draw[arrow, orange] ([yshift = \shift]lettre.north west) -- node[above, legend] {largeur \\ \textbackslash\texttt{width}} ([yshift = \shift]lettre.north east); \draw[arrow, red, very thick] ([shift = {(lettre.west)}]lettre.base) -- ([shift = {(lettre.east)}]lettre.base) node[right] {ligne de base}; \end{tikzpicture} \hfill \begin{tikzpicture} \node[draw = Green, very thick] { \begin{tikzpicture}[every node/.style = {draw = cyan, font = \fontsize{90pt}{45pt}\selectfont, anchor = south west, inner sep = 0pt}] \node (lettreA) {I}; \node (lettreB) at (lettreA.south east) {n}; \node (lettreC) at (lettreB.south east) {d}; \node (lettreD) at (lettreC.south east) {i}; \end{tikzpicture} }; \end{tikzpicture} \caption{Schéma d'une boîte et de ses composants} \end{figure} Les différentes dimensions de la boîte sont contenues au sein de 4 variables : \verb?\width? pour la largeur de la boîte ; \verb?\height? pour sa hauteur ; \verb?\depth? pour sa profondeur ; et \verb?\totalheight? pour sa hauteur totale soit \verb?\height? + \verb?\depth?. Ces variables ne peuvent être utilisées que pour des boîtes. Passons à un peu de pratique pour voir comment appeler les boîtes en question et se servir de ces dimensions qui leur sont propres. \subsection*{La pratique} Tout d'abord, les \verb?framebox? constituent la base en \LaTeX{}. La commande est assez simple : \begin{center}\verb?\framebox[largeur][pos]{texte}?\end{center} \noindent{}avec les choix suivants pour \verb?pos?\footnote{Par défaut, si rien n'est indiqué pour \verb?pos?, le texte est centré à l'intérieur de la boîte.} : \begin{itemize}[label = \ding{118}] \item \verb?l? pour aligner \verb?texte? sur la gauche de la boîte ; \item \verb?r? pour aligner \verb?texte? sur la droite de la boîte ; \item \verb?s? pour aligner \verb?texte? sur toute la longueur de la boîte. \\ \end{itemize} Si \verb?texte? fait référence à l'objet à encadrer (texte, image, formule\dots{}), \verb?largeur? fait référence à la largeur de la boîte. Tu peux renseigner une unité de distance (\verb?13pt?, \verb?215mm?, etc.). Naturellement, si tu renseignes \verb?1cm? alors que le texte en fait 2, le résultat risque de ne pas être satisfaisant. Les dimensions propres aux boîtes peuvent alors être utilisées, comme \verb?\width? : \begin{codedisplay}{Utilisation des \texttt{framebox}} \framebox[1cm]{Texte} \\ \framebox[13pt][r]{Test} \\ \framebox[45mm][s]{Plus grande boîte} \\ \framebox[\width]{Pile poil !} \\ \framebox[2\width]{Espacement} \\ \framebox[\linewidth]{Largeur de la page} \end{codedisplay} Comme démontré avec le dernier cas de figure, la longueur \verb?\linewidth?, présente nativement sous \LaTeX{}, peut être utilisée pour créer une boîte de largeur égale à celle de la page.\footnote{La notion de \og longueur \fg{} sous \LaTeX{} est abordée plus amplement en page \pageref{longueurs}.} \\ Il existe un raccourci pour appeler plus simplement une \verb?framebox? avec la commande \verb?\fbox?. Aucune option n'a besoin d'être indiqué, juste la partie \verb?texte?. La taille de la boîte s'adapte alors au contenu : \begin{codedisplay}{Le petit raccourci sympathique} \fbox{Un peu de texte} \\ \fbox{Un peu plus de texte} \\ \fbox{Des maths : $i = \sqrt{169}$} \end{codedisplay} \begin{conseil}{De l'utilisation des \texttt{fbox}} Les \verb?fbox? sont très pratiques, pour comprendre comment un paragraphe ou une image est agencé, ainsi que la taille qu'il occupe. \\ Lors de montages ou de nouvelles créations, il peut se révéler très utile d'encadrer les différents éléments grâce à des \verb?fbox? pour comprendre comment \LaTeX{} les agence et pouvoir apporter les correctifs nécessaires afin d'avoir le résultat souhaité ! \end{conseil} Tu trouveras aussi dans la littérature les \verb?makebox?, dont l'appel est rigoureusement identique à une \verb?framebox?. Il s'agit tout simplement d'une \verb?framebox? sans cadre, ce qui ne présente que peu d'intérêt selon moi. Techniquement, la \verb?framebox? est construite à partir d'une \verb?makebox? mais j'ai trouvé plus judicieux de présenter directement la première. Bien, terminons avec une autre boîte bien utile. \subsection*{La plus utile} La boîte qui se révèle bien utile pour faire quelques montages reste la \verb?parbox? et l'environnement qui lui est associé : la \verb?minipage?. Sa syntaxe est la suivante : \begin{center}\verb?\parbox[ext][hauteur][int]{largeur}{texte}?\end{center} \noindent{}avec \verb?hauteur? et \verb?largeur? respectivement la hauteur et la largeur de la boîte (distance manuelle comme \verb?13mm? ou une longueur propre aux boîtes comme \verb?\width? ou une longueur \LaTeX{} comme \verb?\linewidth?). \begin{codedisplay}{Fonctionnement de base d'une \texttt{parbox}} \parbox{13mm}{Texte} \\ \fbox{ % Intérêt de la fbox ! \parbox{\linewidth-2cm}{Partie A \\ Partie B} } \end{codedisplay} Ensuite, \verb?ext? correspond à l'alignement externe de la \verb?parbox? par rapport à la ligne de base\footnote{Ligne sur laquelle reposent les lettres.}, avec les choix suivants : \begin{itemize}[label = \ding{118}] \item \textcolor{Green}{\verb?m? (par défaut) ou si aucune option n'est donnée} pour centrer la boîte sur la ligne de base ; \item \verb?b? pour aligner le bas (\textit{bottom}) de la boîte sur la ligne de base ; \item \verb?t? pour aligner le haut (\textit{top}) de la boîte sur la ligne de base. \end{itemize} \begin{codedisplay}[sidebyside = false, listing and text]{Alignement externe} A : \parbox[b]{2cm}{Par. 1 \\ Par. 2} \hfill B : \parbox{2cm}{Par. 3 \\ Par. 4} \hfill C : \parbox[t]{2cm}{Par. 5 \\ Par. 6} \end{codedisplay} Enfin, \verb?int? désigne l'alignement interne de la boîte, pour pouvoir positionner verticalement le texte dans la boîte, \textbf{sous réserve qu'une hauteur ait été indiquée}. Elle peut prendre quatre valeurs : \begin{itemize}[label = \ding{118}] \item \verb?b? pour repousser le texte vers le bas de la boîte ; \item \verb?t? pour situer le texte en haut de la boîte ; \item \textcolor{Green}{\verb?c? (par défaut) ou si aucune option n'est donnée} pour centrer verticalement le texte ; \item \verb?s? pour étirer verticalement le texte. \\ \end{itemize} Toutefois, comme tu as pu le constater avec mes exemples, il n'est pas évident de gérer plusieurs paragraphes dans une \verb?parbox?. Il est même impossible d'y introduire d'autres environnements ! \label{minipage-explications}Il faut donc inclure le tout dans l'environnement équivalent : \verb?minipage?. L'appel à cet environnement se fait de la manière suivante, avec des paramètres identiques à ceux d'une \verb?parbox?, mais dans un ordre différent : \begin{verbatim} \begin{minipage}[ext][hauteur][int]{largeur} texte \end{minipage} \end{verbatim} Il convient donc de définir correctement une \verb?minipage? si tu veux éviter les erreurs. Dès l'instant où tu renseignes une des options non obligatoires (\verb?ext?, \verb?hauteur? ou \verb?int?), il faut toutes les indiquer ou le rendu ne sera pas conforme : \begin{codedisplay}{Appel de \texttt{minipage}} \begin{minipage}{0.8\linewidth} Texte avec un \\ retour à la ligne ! \end{minipage} \\ \\ \fbox{ \begin{minipage}[m][1cm][b]{2cm} Lorem \end{minipage} } \& ipsum \end{codedisplay} \begin{attention}{De l'utilisation des \texttt{minipage}} \textcolor{red}{\bfseries{}Il ne faut pas utiliser une \verb?minipage? pour simplement avoir un texte sur 2 colonnes !} D'abord, le résultat ne correspondra pas à tes attentes, ne sera pas esthétique et sera difficile à gérer. Ensuite, \LaTeX{} met à disposition l'option \verb?twocolumn? lors de la définition de la classe. \\ Une \verb?minipage? sert donc exclusivement pour des montages, par exemple une image à côté d'une autre image ou d'un texte, comme nous aurons l'occasion de le voir par la suite. Enfin, il faut savoir qu'il n'y a pas d'alinéa dans une \verb?minipage? : dans sa définition, par défaut, l'indentation est nulle. \end{attention} \subsection*{Le petit bonus} Si tu veux continuer à arpenter le chemin des boîtes et avoir encore plus de personnalisation, je te recommande le package \verb?fancybox?. Il permet, entre autres, d'ajouter du surlignage et de l'ombrage aux boîtes. \\ Mais il existe un autre package bien plus puissant\dots{} \section{Le Saint-Graal des boîtes} Découvert lors de la rédaction de la première version de ce guide (été 2016), le package \verb?tcolorbox? est extrêmement complet et permet une personnalisation totale des boîtes. Tous les encadrés que tu as pu rencontrer jusqu'à présent dans ce guide sont générés grâce à ce package ! Si tu fouines un peu sur Internet, tu devrais trouver la documentation officielle\dots{} allez, je suis gentil, je te donne le lien : \url{http://fr.lmgtfy.com/?q=tcolorbox+help}. C'est actuellement 500 pages complexes mais qui assez illustrées, pour te permettre donc de réaliser des boîtes aussi jolies que celles présentes dans ce guide et bien plus. Beaucoup plus ! \\ Pour te donner un premier aperçu, voici un exemple extrêmement simple : \begin{codedisplay}{Première utilisation de \texttt{tcolorbox}} % Ajout dans le préambule %\usepackage{tcolorbox} \begin{tcolorbox}[colframe = orange, colback = orange!50, boxrule = 2pt, arc = 6pt, title = {Un titre}, coltitle = black] J'adore ce package ! \\ De toute mon âme ! \end{tcolorbox} \end{codedisplay} Et il ne s'agit que la partie émergée de l'iceberg ! La documentation officielle décrit toutes les options disponibles, les différentes boîtesmise à disposition, la création d'environnement pour appeler ses propres boîtes\dots{} \\ Mais je crois m'être légèrement emporté. Je reviens sur ce package plus en détail dans la partie suivante. Le but de cette partie reste de te présenter les bases sous \LaTeX{}. Passons désormais à un point plus sympathique mais que j'avais envie de garder pour la fin. Oh, mais je suis persuadé que tu l'attendais depuis un petit moment : comment insérer une image ! \\ \begin{figure}[H] \centering \includegraphics[width = 0.75\linewidth]{Aide_LaTeX6.png} \end{figure}