Page 2 sur 2

Re: [eqnarray] Supprimer tout espace vertical (avant et aprè

MessagePosté: Dimanche 13 Février 2011, 23:45
par Deviling
pg a écrit:il vaut mieux, au lieu de \renewcommand, utiliser \DeclareRobustCommand, c'est plus prudent


Merci pour tout.
J'ai quand même un peu du mal à suivre notamment avec \DeclareRobustCommand.
C'est plus "prudent" car cela déclare la macro robust, mais concrètement cela fait quoi ?
Faudrait-il alors l'utiliser à la place de newcommand/renewcommand ou ils ont encore un intérêt.

De plus cela permettrait-il de résoudre les deux problèmes suivants (ou alors comment faire) :
Code: Tout sélectionner
\renewcommand*{\par}[1]{\right( #1 \left)}
\renewcommand*{\mp}{\ensuremath{\mp}}


Dans le premier, il m'est impossible de redéfinir \par...
Dans le second, j'ai une boucle infinie, donc si je suis forcé de donner un autre nom...

Re: [eqnarray] Supprimer tout espace vertical (avant et aprè

MessagePosté: Lundi 14 Février 2011, 21:55
par pg
Certaines macros ont besoin d'être robustes pour fonctionner correctement dans des endroits où elles seront écrites dans un fichier externe (par exemple les titres de sections sont écrites dans le fichier de table des matières pour fabriquer la table des matières). Pour des exemples où la robustesse importe : "\section{Calcul du vecteur $\overrightarrow{AB}$}", "\section{Classe de similitude de la matrice $\begin{pmatrix}a&b\\c&d\end{pmatrix}$}", etc.

Pour les macros personnelles, il vaut mieux se cantonner à \newcommand. Par contre, il faut faire attention à \renewcommand qui peut causer des problèmes si on ne sait pas ce que l'on fait (en particulier, il faut savoir ce que fait la commande qu'on écrase pour savoir si c'est dangereux de la redéfinir). Par exemple \par est une commande fondamentale de TeX et LaTeX et ne doit pas être redéfinie (elle sert à terminer les paragraphes tout comme le fait une ligne blanche dans le fichier source). Un autre nom du type \paren réglera ton problème pour les parenthèses, bien qu'il ne soit pas sûr du tout qu'on gagne en clarté à utiliser \paren{...} au lieu de \left(...\right).

Le problème avec \mp est que la redéfinition utilise la définition originelle donc LaTeX entre dans une boucle infinie. Un moyen de faire ce genre de chose est de sauvegarder l'ancienne macro avec \let puis de la réutiliser dans la redéfinition :

Code: Tout sélectionner
\let\mporiginal\mp
\renewcommand*{\mp}{\ensuremath{\mporiginal}}

Re: [eqnarray] Supprimer tout espace vertical (avant et aprè

MessagePosté: Lundi 14 Février 2011, 22:11
par Deviling
Merci énormément.
Ayant déclaré de nombreuses macros, il ne me reste qu'à vérifier si certaines ont besoin d'être robuste.
Encore merci pour tes explications.

Re: [eqnarray] Supprimer tout espace vertical (avant et aprè

MessagePosté: Lundi 21 Février 2011, 23:41
par Deviling
pg a écrit:Pour la redéfinition de \[...\], il vaut mieux, au lieu de \renewcommand, utiliser \DeclareRobustCommand, c'est plus prudent (et c'est d'ailleurs ce que fait amsmath qui redéfinit \[...\] comme étant {equation*}):

Code: Tout sélectionner
\DeclareRobustCommand{\[}{\begin{gather*}}
\DeclareRobustCommand{\]}{\end{gather*}}


J'ai un problème :
Code: Tout sélectionner
\documentclass[a4paper, oneside, 11pt]{article}

\usepackage[frenchb]{babel}
\usepackage[utf8x]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{amsmath}

\newcommand*{\noskip}{\setlength{\abovedisplayskip}{5pt}\setlength{\belowdisplayskip}{5pt}}
\DeclareRobustCommand{\[}{\noskip\begin{align*}}
\DeclareRobustCommand{\]}{\end{align*}}

\begin{document}
bla
\[bla\end{align*}
bla
\end{document}

fonctionne, mais pas
Code: Tout sélectionner
\documentclass[a4paper, oneside, 11pt]{article}

\usepackage[frenchb]{babel}
\usepackage[utf8x]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{amsmath}

\newcommand*{\noskip}{\setlength{\abovedisplayskip}{5pt}\setlength{\belowdisplayskip}{5pt}}
\DeclareRobustCommand{\[}{\noskip\begin{align*}}
\DeclareRobustCommand{\]}{\end{align*}}

\begin{document}
bla
\[bla\]
bla
\end{document}

Re: [eqnarray] Supprimer tout espace vertical (avant et aprè

MessagePosté: Mardi 22 Février 2011, 10:35
par pg
C'est ma faute, j'aurais dû tester avant d'écrire. J'avais oublié que {gather*} et {align*} lisent tout leur argument avant et que la technique utilisée ne peut fonctionner que dans un environnement. Ici, tu peux t'en sortir ainsi :

Code: Tout sélectionner
\documentclass{article}

\usepackage{amsmath}

\AtBeginDocument{\setlength{\abovedisplayskip}{5pt}\setlength{\belowdisplayskip}{5pt}}

\makeatletter
\def\highlighting@hack{\[\[}% pour la coloration syntaxique
\def\collect@until@bracket#1\]{\def\@the@body@{#1}\]}
\DeclareRobustCommand{\[}{\collect@until@bracket}
\DeclareRobustCommand{\]}{\begin{align*}\@the@body@\end{align*}}
\makeatother

\begin{document}

Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla
\[
  A & = B \\
    & = C
\]
bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla.

\end{document}

J'ai mis les changement aux displayskips dans un \AtBeginDocument car, par soucis d'homogénéité, il faut qu'il affectent tout le document.

Re: [eqnarray] Supprimer tout espace vertical (avant et aprè

MessagePosté: Mardi 22 Février 2011, 14:16
par Deviling
Merci beaucoup ! C'est nickel !