Je souhaiterais savoir quel est l'environnement LaTeX le plus commun pour coder les 3 figures (qui sont des conglomérats de colonnes ; voir jpeg en attaché), chacune d'entre elles étant composée de trois colonnes mise côte à côte. Aussi j'ai besoin, pour chacune des figures, de l'accolade chapeautant les deux premières colonnes et labellisée "coregion", plus l'autre accolade chapeautant la 2e et la 3e accolade et labellisée "région" (voir le jpeg). Peut-on mettre du texte ou des maths verticalement dans ces colonnes (comme dans le jpeg).

alt text

Posée 04 Jul '22, 04:39

Camell's gravatar image

Camell
12819
Taux d'acceptation : 0%

Modifiée 04 Jul '22, 17:20

denis's gravatar image

denis ♦♦
7.3k1510

Les formules de politesse et les signatures sont à éviter : celle(s) de votre contribution a (ont) été supprimée(s).

(04 Jul '22, 17:13) denis ♦♦ denis's gravatar image
1

L'image doit-elle être vue tournée de 90° vers la gauche (en paysage) ?

(04 Jul '22, 17:16) denis ♦♦ denis's gravatar image

Ou mettre ce code ici:

$$\begin{tikzpicture} \draw (-0.5,1)--(0.5,1); \draw (0.5,1)--(0.5,-3); \draw (-0.5,1)--(-0.5,-3); \draw (-0.5,-3)--(0.5,-3); \draw (0.5,1)--(1.5,1); \draw (0.5,-1)--(1.5,-1); \draw (1.5,1)--(1.5,-1); \draw (1.5,-1)--(2.5,-1); \draw (2.5,-1)--(2.5,2.5); \draw (2.5,2.5)--(1.5,2.5); \draw (1.5,2.5)--(1.5,1); \draw (0,-2) node[rotate=90]{$\alpha$}; \draw (1,-0.5) node[rotate=90]{$\beta$}; \draw (2,-0.5) node[rotate=90]{$\gamma$}; \end{tikzpicture}$$

(06 Jul '22, 04:55) Camell Camell's gravatar image

Solution

Un environnement qui me semble adapté et plutôt commun est tikzpicture (issu du package tikz) qui peut donner des choses comme ceci :

Solution plus élégante (ajoutée le 14 juillet 2022)

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}% pour le positionnement relatif
\usetikzlibrary{decorations.pathreplacing}% pour les accolades

% épaisseur des traits des cases
\newlength{\colLineWidth}
\setlength{\colLineWidth}{0.4pt}

% largeur des cases
\newlength{\colWidth}
\setlength{\colWidth}{1cm}

% longueur entre l'accolade et ce qu'elle embrasse
\newlength{\accoSep}
\setlength{\accoSep}{1.5mm}

% longueur à enlever aux accolades de chaque côté
\newlength{\accoRetrecie}
\setlength{\accoRetrecie}{0.5mm}
\addtolength{\accoRetrecie}{\colLineWidth}% pour que la longueur ci-dessus soit celle entre l'accolade et l'extérieur du trait de la case (augmenter \colLineWidth et commenter la ligne pour voir l'effet)

% amplitude de l'accolade
\newlength{\accoAmp}
\setlength{\accoAmp}{2mm}

% longueur entre l'accolade et son label
\newlength{\accoLabelSep}
\setlength{\accoLabelSep}{1mm}
\addtolength{\accoLabelSep}{\accoAmp}% pour que la longueur ci-dessus soit celle entre la pointe (et non les extrémités) de l'accolade et le label

% dessine une accolade au-dessus de deux points avec un label
%   #1 : point à gauche
%   #2 : point à droite
%   #3 : texte au dessus de l'accolade
\newcommand{\accoladeDessus}[3]{%
    \draw [decorate,decoration={brace,amplitude=\accoAmp}] ([shift={(\accoRetrecie,\accoSep)}]#1) -- ([shift={(-\accoRetrecie,\accoSep)}]#2) node [midway,above=\accoLabelSep] {#3};
}

% dessine une accolade en dessous de deux points avec un label
%   #1 : point à gauche
%   #2 : point à droite
%   #3 : texte en dessous de l'accolade
\newcommand{\accoladeDessous}[3]{%
    \draw [decorate,decoration={brace,mirror,amplitude=\accoAmp}] ([shift={(\accoRetrecie,-\accoSep)}]#1) -- ([shift={(-\accoRetrecie,-\accoSep)}]#2) node [midway,below=\accoLabelSep] {#3};
}

% dessine une colonne
%   #1 : nom de la colonne
%   #2 : hauteur de la colonne
%   #3 : options (pour positionner la colonne)
\newcommand{\creerColonne}[3]{%
    \node (#1) [draw,line width=\colLineWidth,text width=\colWidth,text height=#2,#3] {};
}

\begin{document}
\begin{tikzpicture}[
    inner sep=0mm,
    node distance=0mm,
    titre/.style={font=\bfseries},
]
    %%%%
    %% INDUCTION 1
    %%%%

    % colonnes
    \creerColonne{col1}{4cm}{}
    \creerColonne{col2}{5.5cm}{right=-\colLineWidth of col1.north east,anchor=north west}
    \creerColonne{col3}{7cm}{right=-\colLineWidth of col2.south east,anchor=south west}

    % contenu des colonnes
    \begin{scope}[every node/.style={rotate=90}]
        \node at (col1) {texte};
        \node at (col2) {$a^2 + b^2 = c^2$};
        \node at (col3) {texte};
    \end{scope}

    % accolades
    \accoladeDessus{col1.north west}{col2.north east}{corégion}
    \accoladeDessous{col2.south west}{col3.south east}{région}

    % titre
    \node [titre,yshift=2.5cm] at (col2.north) {Induction 1};

    %%%%
    %% INDUCTION 2
    %%%%

    \begin{scope}[xshift=5cm]
        % colonnes
        \creerColonne{col1}{4cm}{};
        \creerColonne{col2}{2.5cm}{right=-\colLineWidth of col1.north east,anchor=north west}
        \creerColonne{col3}{1.5cm}{right=-\colLineWidth of col2.south east,anchor=south west}

        % contenus des colonnes
        \node at (col3.center) {(3)};
        \node at ([xshift=-\colWidth]col3.center) {(2)};
        \node at ([xshift=-2\colWidth]col3.center) {(1)};

        % accolades
        \accoladeDessus{col1.north west}{col2.north east}{corégion}
        \accoladeDessous{col2.south west}{col3.south east}{région}

        % titre
        \node [titre,yshift=2.5cm] at (col2.north) {Induction 2};
    \end{scope}
\end{tikzpicture}
\end{document}

Solution initiale

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}% pour le positionnement relatif
\usetikzlibrary{decorations.pathreplacing}% pour les accolades

\newlength{\caseStrokeWidth}
\setlength{\caseStrokeWidth}{.4pt}

\begin{document}
\begin{tikzpicture}[inner sep=0mm,node distance=0mm,case/.style={draw=black,line width=\caseStrokeWidth},accolade/.style={decorate,decoration={brace,amplitude=2mm}},titre/.style={font=\bfseries}]
    \node (case1) [case,rotate=90,text width=4cm,minimum size=1cm,align=center] {texte};
    \node (case2) [case,rotate=90,right=-\caseStrokeWidth of case1.south east,anchor=north east,text width=5.5cm,minimum size=1cm,align=center] {$a^2 + b^2 = c^2$};
    \node (case3) [case,rotate=90,right=-\caseStrokeWidth of case2.south west,anchor=north west,text width=7cm,minimum size=1cm,align=center] {texte};
    \draw [accolade] ([shift={(\caseStrokeWidth,2\caseStrokeWidth)}]case1.north east) -- ([shift={(-\caseStrokeWidth,2\caseStrokeWidth)}]case2.south east) node [midway,yshift=4mm] {corégion};
    \draw [accolade] ([shift={(-\caseStrokeWidth,-2\caseStrokeWidth)}]case3.south west) -- ([shift={(\caseStrokeWidth,-2\caseStrokeWidth)}]case2.north west) node [midway,yshift=-4mm] {région};
    \draw (case2.east) node [titre,yshift=2.5cm] {Induction 1};
    \begin{scope}[shift={(5,0)}]
        \node (case1) [case,text width=1cm,text height=4cm,align=center] {};
        \node (case2) [case,right=-\caseStrokeWidth of case1.north east,anchor=north west,text width=1cm,text height=2.5cm,align=center] {};
        \node (case3) [case,right=-\caseStrokeWidth of case2.south east,anchor=south west,text width=1cm,text height=1.5cm] {};
        \node at (case3.center) {(3)};
        \node at ([xshift=-1cm]case3.center) {(2)};
        \node at ([xshift=-2cm]case3.center) {(1)};
        \draw [accolade] ([shift={(\caseStrokeWidth,2\caseStrokeWidth)}]case1.north west) -- ([shift={(-\caseStrokeWidth,2\caseStrokeWidth)}]case2.north east) node [midway,yshift=4mm] {corégion};
        \draw [accolade] ([shift={(-\caseStrokeWidth,-2\caseStrokeWidth)}]case3.south east) -- ([shift={(\caseStrokeWidth,-2\caseStrokeWidth)}]case2.south west) node [midway,yshift=-4mm] {région};
        \draw (case2.north) node [titre,yshift=2.5cm] {Induction 2};
    \end{scope}
\end{tikzpicture}
\end{document}

La troisième figure est laissée en exercice 😉.

Explications

\usetikizlibrary

Les fonctionnalités du package tikz peuvent être étendues avec des librairies qui se chargent à l'aide de la commande \usetikzlibrary dans le préambule. Par exemple \usetikzlibrary{decorations.pathreplacing} permet entre autres de faire un trait en forme d'accolade. Au final \usetikzlibrary similaire à \usepackage.

Options globales

L'environnement tikzpicture admet un argument optionnel sous forme d'une liste de clés-valeurs, ce qui permet d'éviter d'écrire une option plusieurs fois à l'intérieur de l'environnement.

\documentclass{article}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}[draw=red]% ici tous les chemins, sauf ordre contraire, seront en rouge
\draw (0,0) circle (2cm);
\end{tikzpicture}
\end{document}

inner sep

C'est la longueur entre la boîte et le contenu d'un nœud :

\documentclass{article}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}
\node [draw] at (0,0) {A};
\node [draw,inner sep=1cm] at (2,0) {B};
\end{tikzpicture}
\end{document}

truc/.style

Lorsque l'on a plusieurs objets qui auront les mêmes options on peut créer une « super option », localement en argument optionnel de l'environnement tikzpicture, ou globalement en argument de la commande \tikzset.

Localement

\documentclass{article}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}[patate/.style={draw=orange,fill=yellow}]
\draw [patate] (0,0) circle (2cm);
\end{tikzpicture}
\end{document}

Globalement

\documentclass{article}
\usepackage{tikz}

\tikzset{patate/.style={draw=orange,fill=yellow}}

\begin{document}
\begin{tikzpicture}
\draw [patate] (0,0) circle (2cm);
\end{tikzpicture}
\end{document}

text width et align

Ces options de nœuds sont le plus souvent utilisées pour des paragraphes, text width est la longueur de la boîte contenant le texte et align l'alignement du texte :

\documentclass{article}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}
\node [draw,text width=2cm] at (0,0) {Petit paragraphe bla bla bla bla};
\node [draw,text width=4cm,align=center] at (0,-2) {Petit paragraphe bla bla bla bla};
\node [draw,text width=5cm] at (0,-4) {Mot};
\node [draw,text width=5cm,align=center] at (0,-6) {Mot};
\end{tikzpicture}
\end{document}

minimum size

Cette option permet de définir une largeur et une hauteur minimum pour la boîte d'un nœud, je l'ai utilisée pour avoir un largeur de colonne (mais qui correspond à la hauteur de la boîte en elle-même car on la tourne de 90°) d'un centimètre dans l'induction 1.

\documentclass{article}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}
\node [draw,minimum size=2cm] at (0,0) {A};
\node [draw,minimum size=0cm] at (0,-2) {B};
\node [draw,text width=5cm,align=center,minimum size=2cm] at (0,-4) {Mot};
\end{tikzpicture}
\end{document}

text height

L'option text height permet de modifier la hauteur de la boîte d'un nœud, cela change seulement la hauteur de la boîte et pas la profondeur (qui est gérée par text depth). Pour ne pas trop m'embêter à placer le contenu des colonnes, j'ai d'abord dessiner des nœuds vides, puis j'ai placé du texte dedans :

\documentclass{article}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}[every node/.style={draw}]
\node at (0,0) {A};
\node [text height=2cm] at (1,0) {B};
\node [text depth=2cm] at (2,0) {C};
\node [text height=2cm,minimum size=8mm] (D) at (3,0) {};
\node [draw=none] at (D) {D};
\end{tikzpicture}
\end{document}

Points cardinaux et positionnement simples

Lorsque l'on crée un nœud avec un nom, Tikz crée plusieurs coordonnées avec des points cardinaux qui correspondent aux extrémités de la boîte du nœud.

Par défaut un nœud est centré sur le point qu'on lui donne (c'est le at (x,y)) mais on peut changer cela en utilisant left, right, above, below (et des combinaisons de ceux-ci) ou l'option anchor à qui l'on donnera comme valeur east, west, south, north (ou des combinaisons de celles-ci). Par exemple left signifie : « place mon nœud à gauche du point », et anchor=east signifie : « le pôle Est du nœud doit correspondre au point », ces deux instructions sont équivalentes.

\documentclass{article}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}[every node/.style={draw}]% permet de passer draw en option de tous les node
\node [draw,minimum size=4cm,lightgray] (A) at (0,0) {bla bla bla bla bla bla};
\fill [red] (A.center) circle (1pt) node [above] {(A.center)};
\fill [red] (A.north) circle (1pt) node [above] {(A.north)};
\fill [red] (A.south) circle (1pt) node [below] {(A.south)};
\fill [red] (A.west) circle (1pt) node [left] {(A.west)};
\fill [red] (A.east) circle (1pt) node [right] {(A.east)};
\fill [red] (A.north west) circle (1pt) node [above left] {(A.north west)};
\fill [red] (A.north east) circle (1pt) node [above right] {(A.north east)};
\fill [red] (A.south west) circle (1pt) node [below left] {(A.south west)};
\fill [red] (A.south east) circle (1pt) node [below right] {(A.south east)};
\node [draw,circle,minimum size=4cm,lightgray] (B) at (0,-7) {bla bla bla bla bla bla};
\fill [red] (B.center) circle (1pt) node [anchor=south] {(B.center)};
\fill [red] (B.north) circle (1pt) node [anchor=south] {(B.north)};
\fill [red] (B.south) circle (1pt) node [anchor=north] {(B.south)};
\fill [red] (B.west) circle (1pt) node [anchor=east] {(B.west)};
\fill [red] (B.east) circle (1pt) node [anchor=west] {(B.east)};
\fill [red] (B.north west) circle (1pt) node [anchor=south east] {(B.north west)};
\fill [red] (B.north east) circle (1pt) node [anchor=south west] {(B.north east)};
\fill [red] (B.south west) circle (1pt) node [anchor=north east] {(B.south west)};
\fill [red] (B.south east) circle (1pt) node [anchor=north west] {(B.south east)};
\end{tikzpicture}
\end{document}

Positionnement relatif et node distance

Si l'on positionne relativement les nœuds, on n'utilisera (presque) pas les coordonnées absolues. On peut alors omettre les coordonnées du premier qui seront automatiquement (0,0).

On peut positionner un nœud relativement à un autre en utilisant left of, above of... L'option node distance est la distance entre le centre du premier nœud et le point d'ancrage du deuxième (le point « anchor ») :

\documentclass{article}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}[every node/.style={draw}]
\node (A) {A};
\draw [orange] (0,0) circle (1cm);
\draw [red] (0,-1.5) arc (-90:-130:1.5);
\draw [red] (0,-1.5) arc (-90:-50:1.5);
\node [left of=A] {left of};% par défaut anchor=center
\node [right of=A,right] {right of};
% les deux lignes ci-dessous montre qu'il faut mettre `position of` avant `postion` ou `anchor=`
\node [above left,above left of=A] {above left of};% la position n'est pas prise en compte
\node [above right of=A,anchor=south west] {above right of};% la position est prise en compte
\node [below of=A,anchor=north,node distance=1.5cm] {below of};
% etc.
\node (B) at (5,0) {B};
\node [below of=B,below,node distance=0cm] {below of};
\end{tikzpicture}
\end{document}

Malheureusement on ne peut pas mettre below of=B.south, on a alors deux options.

La première se déduit des explications précédentes :

\documentclass{article}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}[every node/.style={draw}]
\node (B) at (5,0) {B};
\node [below,node distance=0cm] at (B.south) {C};
\end{tikzpicture}
\end{document}

La deuxième est plus facile à comprendre lorsque l'on lit le code mais requiert la librairie positioning :

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}

\begin{document}
\begin{tikzpicture}[every node/.style={draw}]
\node (B) at (5,0) {B};
\node [below=0cm of B.south] {C};
\end{tikzpicture}
\end{document}

Chevauchement des boîtes des nœuds et line width

On remarque en agrandissant les deux derniers exemples que les bords des boîtes de B et C ne sont pas confondues. Pour y remédier il suffit de connaître la largeur du trait et de mettre son opposé à la place de 0cm dans \node [below=0cm of B.south] {C};.

L'option line width permet de gérer l'épaisseur des traits :

\documentclass{article}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}
\draw (0,0) -- (2,0);
\draw [line width=2mm] (0,-1) -- (2,-1);
\node [draw] at (4,0) {A};
\node [draw,line width=1mm] at (4,-1) {B};
\end{tikzpicture}
\end{document}

Ainsi le tour est joué et on peut même utiliser une longeur que l'on pourra faire varier :

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}

\newlength{\malongueur}
\setlength{\malongueur}{1mm}

\begin{document}
\begin{tikzpicture}[case/.style={draw,line width=\malongueur}]
\node [case] (B) at (5,0) {B};
\node [case,below=-\malongueur of B.south] {C};
\end{tikzpicture}
\end{document}

shift et option midway

Les options xshift, yshift et shift permettent de faire des translations. Les deux premières prennent une longueur en paramètre et la dernière des coordonnées, par exemple shift={(2,3)}. Les accolades sont importantes car si elles n'y sont pas TikZ va croire que ce sont deux paires de clés-valeurs : shift=(2 et 3), ce qu'on ne veut pas. On peut placer ces options de façon « classique » ou directement après la parenthèse ouvrante de coordonnées. Cette dernière méthode est nécessaire pour les coordonnées comme (A) ou (A.east).

L'option de nœud midway permet de placer un nœud au milieu d'un trait :

\documentclass{article}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}
\draw (0,0) node [above] {(0,0)} -- (3,0) node [above] {(2,0)};
\draw [yshift=2cm] (0,0) -- (3,0) node [above,midway] {\verb|yshift=2cm|};
\draw [shift={(0,-2)}] (0,0) -- (3,0) node [below,midway] {\verb|shift={(0,-2)}|};
\node [draw,minimum size=2cm] (A) at (6,0) {A};
\fill [red,xshift=1cm] (A.east) circle (2pt);% loupé
\fill [teal] ([xshift=1cm]A.east) circle (2pt);% réussi
\fill ([shift={(1,1)}]A.north east) circle (2pt);
\end{tikzpicture}
\end{document}

Accolade

Pour dessiner un trait en forme d'accolade on a besoin de la librairie decorations.pathreplacing. On peut gérer sa largeur (pas celle du trait) avec l'option amplitude et son « sens » avec l'option mirror ou en échangeant les coordonnées :

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing}

\begin{document}
\begin{tikzpicture}
\draw [decorate,decoration={brace}] (0,0) -- (3,0);
\draw [yshift=-2cm,decorate,decoration={brace,amplitude=1cm}] (0,0) -- (3,0);
\draw [yshift=-4cm,decorate,decoration={brace,amplitude=2mm,mirror}] (0,0) -- (3,0);
\draw [yshift=-6cm,decorate,decoration={brace,amplitude=2mm}] (3,0) -- (0,0);
\end{tikzpicture}
\end{document}

Environnement scope

Il permet de passer une option à tout ce qui est à l'intérieur. C'est utile pour éviter la répétition de code et lorsque les trucs/.style sont moins adaptés :

\documentclass{article}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}
\draw (0,0) -- (0,3) -- (3,3) -- (3,0) -- cycle;
\begin{scope}[line width=1mm,red,xshift=5cm]
    \draw (0,0) -- (0,3) -- (3,3) -- (3,0) -- cycle;
    \fill (0,0) circle (1cm);
\end{scope}
\end{tikzpicture}
\end{document}
Lien permanent

Publiée 04 Jul '22, 17:50

YannD's gravatar image

YannD
465310
Taux d'acceptation : 25%

Modifiée 14 Jul '22, 18:59

Un grand Merci YannD ! Je code mes diagrammes avec tikzcd, mais je ne connais pas tikzpicture. As-tu un ECM (exemple complet minimal) pour que je m'acclimate un peu avec cet environnement, avant de coder la dernière colonne comme exercice ? En effet le résultat est top, mais ça parait pas facile pour un novice...

(05 Jul '22, 05:27) Camell Camell's gravatar image

J'ai réussi à coder la 3e série de colonnes (3e figure),cependant j'ai fais cela avec la façon naive de tikzpicture, i.e celle utilisant les coordonnées cartésiennes. C'est mon premier codage avec cet environnement ! Mais je n'ai pas réussi à coder les accolades, avec les étiquettes "région" et "corégion" ... Comment le fais t'on à partir de mon codage naif décrit plus haut, juste après le commentaire de Denis ?

(06 Jul '22, 04:55) Camell Camell's gravatar image
1

@Camell J'ai ajouté une solution que je trouve plus élégante et beaucoup d'explications, avec un exemple à chaque fois, qui te permettront je l'espère d'y voir plus clair. Je t'invite à poser une nouvelle question sur ce forum du style « Quelles ressources pour apprendre TikZ ? » si tu souhaites en apprendre plus :-)

(14 Jul '22, 19:08) YannD YannD's gravatar image

Peut-être comme ceci ? alt text

Lien permanent

Publiée 04 Jul '22, 17:37

MFerrer's gravatar image

MFerrer
459917
Taux d'acceptation : 16%

Oui, in fine c'est comme cela que ça doit apparaitre !

(05 Jul '22, 05:28) Camell Camell's gravatar image
1

Attention ! Cette réponse était un commentaire plutôt qu'une réponse et a été convertie comme tel.

(06 Jul '22, 08:51) denis ♦♦ denis's gravatar image
Votre réponse
(dés)activer l'aperçu

Suivre cette question

Par courriel :

Une fois que vous serez enregistré, vous pourrez souscrire à n'importe quelle mise à jour ici

Par flux RSS :

Réponses

Réponses et commentaires

Bases de Markdown

  • *italique* ou _italique_
  • **gras** ou __gras__
  • Lien ::[texte](http://url.com/ "Titre ")
  • Image : ?![alt texte](/path/img.jpg "Titre ")
  • Liste numérotée : 1. Foo 2. Bar
  • Pour ajouter un passage à la ligne, ajoutez deux espaces à l'endroit où vous souhaitez que la ligne commence.
  • Les balises HTML de base sont également prises en charge.