[Tikz] Position des labels sur les branches d'un arbre

Tout ce qui concerne le langage LaTeX et ses variantes. Ce langage est supporté sur le forum via les balises tex.

Modérateur : gdm_tex

Règles du forum
Merci de soigner la rédaction de vos messages et de consulter ce sujet avant de poster. Pensez également à utiliser la fonction recherche du forum.
pg
Modérateur
Modérateur
Messages : 2600
Inscription : vendredi 15 juin 2007, 00:31

Re: [Tikz] Position des labels sur les branches d'un arbre

Message par pg »

Fabrice Couvreur a écrit :La macro \ex étant :
Il manque surtout la macro \syst
Fabrice Couvreur a écrit :Ainsi, je sais ce que fait la commande \vspace*{2em} (initialement, le texte après la résolution du système était "collé" au dernier système), par contre, pour la commande \null\vspace{-2\baselineskip}, je ne suis pas certain de comprendre ce qu'elle fait exactement. Tu me l'avais proposée dans un post précédent, je l'avais utilisée, sans chercher à l'analyser faute de temps !
C'était dans ce post, c'est ça ?

La commande \null\vspace{-2\baselineskip} est équivalente à \vspace*{-2\baselineskip} et -2\baselineskip c'est à peu près la même chose que -2em.

Cet espacement supplémentaire servait à compenser le fait qu'une minipage suivie d'un \[...\] introduit un espacement supplémentaire indésirable. Donc selon comment est définie la macro \syst, ce n'est pas forcément utile ici.

Fabrice Couvreur
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 604
Inscription : samedi 18 août 2007, 01:55

Re: [Tikz] Position des labels sur les branches d'un arbre

Message par Fabrice Couvreur »

Bonjour pg,
pg a écrit :Il manque surtout la macro \syst

Code : Tout sélectionner

\newcommand{\syst}[4]{\renewcommand{\arraystretch}{1.6}\renewcommand{\arraycolsep}{1.4pt}\[\left\{
        \begin{array}{ccc}
          #1 & = & #2\\
          #3 & = & #4\\
        \end{array}
\right.
\]}
pg a écrit :Cet espacement supplémentaire servait à compenser le fait qu'une minipage suivie d'un \[...\] introduit un espacement supplémentaire indésirable.
Nous avions un environnement muticol suivi de \[....\].
Minipage et multicol, des similitudes dans le comportement ?
Merci.
PS : je sais que tout est histoire de goût, mais est-ce que la macro \ex est correcte, notamment au niveau des espacements avant et après ?
Merci.

pg
Modérateur
Modérateur
Messages : 2600
Inscription : vendredi 15 juin 2007, 00:31

Re: [Tikz] Position des labels sur les branches d'un arbre

Message par pg »

Quelques remarques sur le code :
  • il est inutile d'écrire "blabla~:~\[...\]", "blabla~:\[...\]" suffit (du point de vue de la présentation du code, c'est même mieux de faire un saut de ligne entre le : et le \[)
  • au lieu d'utiliser des \\ et des \noindent partout, il vaut mieux faire un \parindent=0pt et ensuite taper le texte normalement (c'est-à-dire en laissant une ligne blanche lorsqu'on veut changer de paragraphes)
  • les \renewcommand{\arraycolsep}{1.4pt} sont déjà dans \syst, donc inutile de les répéter à chaque début de multicols
  • il vaut mieux rajouter un \nobreak après le \par à la fin de \ex pour qu'il n'y ait pas une éventuelle coupure de page intempestive juste après \ex
  • je définirai bien une commande \euros{xxx} qui prend en argument un nombre et affiche la somme en euros correspondante :

    Code : Tout sélectionner

    \newcommand{\euros}[1]{\nombre{#1}\text{\,\texteuro}}
    J'ai supprimé l'espace après le symbole euro qui, me semble-t-il, n'est pas utile et j'ai utilisé \texteuro à la place de \EUR (a priori, \texteuro a été conçu pour s'harmoniser un peu mieux que le logo officiel de l'euro, mais à toi de voir ce que tu préfère).
Concernant l'espacement autour de \ex, effectivement, tu peux probablement rajouter un petit \vspace{3pt} après, mais surtout rajouter un \vskip 3pt plus 9pt avant, cela fera que TeX de mettra toujours au moins 3pt avant et mettre au plus 3pt+9pt=12pt si besoin est. Ça rajoute un peu d'extensibilité à cet endroit. La commande ressemblera donc à ça (j'ai supprimé le tableau qui est inutile, rajouté "inner sep = 5pt" et changé la couleur en 0.9white pour qu'elle soit cohérente avec celle du titre, mais peut-être as-tu fait le contraire en changeant la couleur du titre en LightGrey).

Code : Tout sélectionner

\newcounter{exercice}
\newcommand{\ex}{\par\vskip 3pt plus 9pt\stepcounter{exercice}%
\begin{tikzpicture}\node[rectangle,rounded corners=2pt,draw,fill=0.9white,drop shadow={fill=gray,opacity=1},inner sep=5pt]
{\bfseries Exercice~\arabic{exercice}};
\end{tikzpicture}\par\nobreak\vspace{3pt}}
Concernant la macro \syst, il vaut mieux tout mettre entre un \begingroup et un \endgroup afin que les redéfinitions soient locales (afin d'éviter tout effet de bord indésirable). J'ai aussi changé le ccc en un ccr pour l'alignement des nombres du membre de droite (à voir) :

Code : Tout sélectionner

\newcommand{\syst}[4]{\begingroup\renewcommand{\arraystretch}{1.6}%
\renewcommand{\arraycolsep}{1.4pt}%
\[\left\{
        \begin{array}{ccr}
          #1 & = & #2\\
          #3 & = & #4\\
        \end{array}
\right.
\]\endgroup}
Avec tout ça, voici le résultat :

[attachment=0]dl_math.png[/attachment]


Pour obtenir ceci, voici le contenu de perso.sty (probablement différent du tien) :

Code : Tout sélectionner

\RequirePackage[latin1]{inputenc}
\RequirePackage[frenchb]{babel}
\RequirePackage[autolanguage]{numprint}
\RequirePackage[T1]{fontenc}
\RequirePackage{lmodern}
\RequirePackage{textcomp}
\RequirePackage{xcolor}
\RequirePackage{tikz}
\usetikzlibrary{shadows}
\RequirePackage{tabularx}
\RequirePackage{multicol}
\RequirePackage{marvosym}
\RequirePackage{amsmath}
\RequirePackage{nccmath}
\RequirePackage{geometry}
\geometry{a4paper}
\definecolor{0.9white}{rgb}{0.9,0.9,0.9}
\def\classe#1{\gdef\@classe{#1}}
\def\numerodevoir#1{\gdef\@numerodevoir{#1}}
\def\typededevoir#1{\gdef\@typededevoir{#1}}
\def\@maketitle{\noindent\begin{tikzpicture}
\node[rectangle,rounded corners=8pt,draw,fill=0.9white,drop shadow={fill=gray,opacity=1}] {\begin{tabularx}{\textwidth}{lXr}
{\bfseries \@classe}&  & {\bfseries \`{A} rendre le \@date}\tabularnewline
\noalign{\vspace*{0.25em}}\multicolumn{3}{c} {\large\bfseries \@typededevoir\ de Mathématiques \no \@numerodevoir \vspace*{0.25em}}
\end{tabularx}};
\end{tikzpicture}\vspace*{0.5em}}
\renewcommand\maketitle{\par
  \begingroup
    \renewcommand\thefootnote{\@fnsymbol\c@footnote}%
    \def\@makefnmark{\rlap{\@textsuperscript{\normalfont\@thefnmark}}}%
    \long\def\@makefntext##1{\parindent 1em\noindent
            \hb@xt@1.8em{%
                \hss\@textsuperscript{\normalfont\@thefnmark}}##1}%
    \if@twocolumn
      \ifnum \col@number=\@ne
        \@maketitle
      \else
        \twocolumn[\@maketitle]%
      \fi
    \else
      \newpage
      \global\@topnum\z@   % Prevents figures from going at top of page.
      \@maketitle
    \fi
    \thispagestyle{empty}\@thanks
  \endgroup
  \setcounter{footnote}{0}%
  \global\let\thanks\relax
  \global\let\maketitle\relax
  \global\let\@maketitle\relax
  \global\let\@thanks\@empty
  \global\let\@author\@empty
  \global\let\@date\@empty
  \global\let\@title\@empty
  \global\let\title\relax
  \global\let\author\relax
  \global\let\date\relax
  \global\let\and\relax
}

\newcommand{\syst}[4]{\begingroup\renewcommand{\arraystretch}{1.6}%
\renewcommand{\arraycolsep}{1.4pt}%
\[\left\{
        \begin{array}{ccr}
          #1 & = & #2\\
          #3 & = & #4\\
        \end{array}
\right.
\]\endgroup}

\newcounter{exercice}
\newcommand{\ex}{\par\vskip 3pt plus 9pt\stepcounter{exercice}%
\begin{tikzpicture}\node[rectangle,rounded corners=2pt,draw,fill=0.9white,drop shadow={fill=gray,opacity=1},inner sep=5pt]
{\bfseries Exercice~\arabic{exercice}};
\end{tikzpicture}\par\nobreak\vspace{3pt}}

\parindent=0pt
\pagestyle{empty}
\newcommand{\euros}[1]{\nombre{#1}\text{\,\texteuro}}
et le contenu du fichier principal

Code : Tout sélectionner

\documentclass[landscape,svgnames,a4paper,10pt]{article}
\usepackage{perso}
\begin{document}
\typededevoir{Corrigé du dl}
\numerodevoir{2}
\classe{Seconde~2}
\date{le 6 janvier 2009}
\maketitle
\setlength{\columnseprule}{0.4pt}
\begin{multicols}{2}
\ex
Soit $x$ le prix d'un repas, et $y$ celui de la chambre.

Le prix de la pension complète est de \euros{690} par jour, donc on a~:
\[2x+y=690.\]
Le  montant du séjour sans les frais divers est égal à~:
\[\nombre{13650}-\nombre{1500}=\nombre{12150}.\]
On en déduit alors l'équation suivante~:
\begin{align*}
14(2x+y)+4(2x+0,8y)&=\nombre{12150}\\
36x+17,2y & =\nombre{12150}.
\end{align*}
Les systèmes suivants sont équivalents~:
\setlength{\columnseprule}{0pt}
\begin{multicols*}{2}
\syst{2x+y}{690}{36x+17,2y}{\nombre{12150}}
\syst{2x+y}{690}{18x+8,6y}{\nombre{6075}}
\syst{17,2x+8,6y}{\nombre{5934}}{18x+8,6y}{\nombre{6075}}
\syst{0,8x}{141}{2x+y}{690}
\syst{x}{\nombre{176,25}}{y}{\nombre{337,5}}
\end{multicols*}
Le prix d'une chambre est donc de \euros{337,5} et celui d'un repas de \euros{176,25}.

\ex
Soit $x$ le montant placé en actions, et $y$ celui placé en obligations.

Les systèmes suivants sont équivalents~:
\setlength{\columnseprule}{0pt}
\begin{multicols*}{2}
\syst{x+y}{\nombre{50000}}{\mfrac{8}{100}x+\mfrac{11}{100}y}{\nombre{4500}}
\syst{x+y}{\nombre{50000}}{8x+11y}{\nombre{450000}}
\syst{11x+11y}{\nombre{550000}}{8x+11y}{\nombre{450000}}
\syst{3x}{\nombre{100000}}{x+y}{\nombre{50000}}
\syst{x}{\mfrac{\nombre{100000}}{3}}{y}{\mfrac{\nombre{50000}}{3}}
\end{multicols*}
J'avais placé environ \euros{33333,33} en actions, et environ \euros{16666,67} en obligations.
\end{multicols}
\end{document}
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.

Fabrice Couvreur
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 604
Inscription : samedi 18 août 2007, 01:55

Re: [Tikz] Position des labels sur les branches d'un arbre

Message par Fabrice Couvreur »

Bonsoir pg,

Un simple merci ne suffit plus pour exprimer toute ma gratitude. J'apprends énormément de tes conseils toujours très judicieux.
Je viens d'analyser toutes les améliorations que tu proposes, je pense avoir compris sauf peut-être :
Concernant la macro \syst, il vaut mieux tout mettre entre un \begingroup et un \endgroup afin que les redéfinitions soient locales (afin d'éviter tout effet de bord indésirable).
Merci infiniment.

pg
Modérateur
Modérateur
Messages : 2600
Inscription : vendredi 15 juin 2007, 00:31

Re: [Tikz] Position des labels sur les branches d'un arbre

Message par pg »

Le fait de redéfinir \arraycolsep et \arraystretch change tout ce qui en dépend, notamment les matrices. Par exemple, le code suivant

Code : Tout sélectionner

\documentclass{article}
\usepackage{amsmath}
\newcommand{\syst}[4]{%\begingroup
\renewcommand{\arraystretch}{1.6}%
\renewcommand{\arraycolsep}{1.4pt}%
\[\left\{
        \begin{array}{ccr}
          #1 & = & #2\\
          #3 & = & #4\\
        \end{array}
\right.
\]%\endgroup
}
\begin{document}

\[\begin{pmatrix}1 & 2 \\ 3 & 4\end{pmatrix}\]

\syst{x}{2}{y}{3}

\[\begin{pmatrix}1 & 2 \\ 3 & 4\end{pmatrix}\]

\end{document}
donne
pmatrix_syst.png
La deuxième matrice n'a pas un espacement correct car les valeurs de \arraycolsep et \arraystretch ont changé à cause de l'appel de \syst. Si on met un \begingroup et un \endgroup à l'intérieur de \syst, le problème disparaît car les redéfinitions sont alors locales, sans effet sur le reste. C'est ce que je voulais dire par éviter des effets de bord indésirables.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.

Fabrice Couvreur
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 604
Inscription : samedi 18 août 2007, 01:55

Re: [Tikz] Position des labels sur les branches d'un arbre

Message par Fabrice Couvreur »

Bonjour pg,
Je pense avoir compris ce que cela voulait dire, mais il y a encore un petit détail que j'aimerais régler.
Dans le code que tu as proposé, l'instruction

Code : Tout sélectionner

%\begingroup
voulait bien dire que l'environnement \begingroup était inopérant, j'ai donc testé ton code en le rendant opérant, c'est-à-dire en enlevant %.
Pourquoi mets-tu un % dans l'instruction

Code : Tout sélectionner

\renewcommand{\arraystretch}{1.6}%
\renewcommand{\arraycolsep}{1.4pt}%


Ce symbole est en général utilisé pour rendre inopérante une commande ou ajouter un commentaire dans un code source.
Merci.

pg
Modérateur
Modérateur
Messages : 2600
Inscription : vendredi 15 juin 2007, 00:31

Re: [Tikz] Position des labels sur les branches d'un arbre

Message par pg »

Mettre des % en fin de lignes quand on définit des commandes est une bonne habitue à prendre pour éviter les mauvaises surprises. Ici, on pourrait les enlever, mais en général les oublier peut mettre des espaces supplémentaires là où on ne veut pas (pour TeX, une fin de ligne est interprétée comme un espace). Voici un petit exemple simple qui montre la différence entre mettre des % et ne pas les mettre :

Code : Tout sélectionner

\documentclass{article}
\newcommand{\A}{
A
}
\newcommand{\Abis}{%
A%
}
\begin{document}
b\A{}b

b\Abis{}b
\end{document}
Dans le premier cas, on obtient "b A b" (car il y a deux sauts de lignes qui sont convertis en espaces) et dans le deuxième "bAb".

Fabrice Couvreur
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 604
Inscription : samedi 18 août 2007, 01:55

Re: [Tikz] Position des labels sur les branches d'un arbre

Message par Fabrice Couvreur »

Bonsoir pg,
Excuses mon côté perfectioniste :)
pg a écrit :Mettre des % en fin de lignes quand on définit des commandes
Toutes les nouvelles commandes ou un certain type ?
Par exemple, quand tu proposes la nouvelle commande

Code : Tout sélectionner

\newcommand{\euros}[1]{\nombre{#1}\text{\,\texteuro}}
tu ne mets pas ce symbole.
Merci.

pg
Modérateur
Modérateur
Messages : 2600
Inscription : vendredi 15 juin 2007, 00:31

Re: [Tikz] Position des labels sur les branches d'un arbre

Message par pg »

Le % à la fin d'une accolade de définition n'est utile que lorsqu'une définition est à l'intérieur d'une autre (et encore, pas dans tous les cas) ou quand la définition de la commande est dans le texte (ce qui est plutôt rare, usuellement, les définitions sont dans le préambule). Pour les définitions du type de \euros dans le préambule, il n'y a aucun problèmes de ce genre.