P'tite macro

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.
rebouxo
Modérateur global
Modérateur global
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre

P'tite macro

Message par rebouxo »

Hello, hello.
Voilà, je suis en train de travailler sur mes annales, de mettre de l'ordre, etc.
Et je voudrais faire une macro qui fasse des intervalles et tant qu'à faire j'aimerais avoir une macro qui s'appelle \interval, et en utilisant xkeyval, pouvoir lui passer des options : open, close (par défaut), openA, openB, closeA, closeB (si ouvert et fermé se disent comme cela chez les anglais, qui nous ont brûlé Jeanne d'Arc et qui nous volent nos maisons).

Sauf que, j'ai toujours rien pigé au système de déclarations des clés dans xkeyval. Donc si sur cet exemple vous auriez la bonté de m'expliquer, cela me ferait plaisir.

Olivier
@Kojak, je pense à toi, je pense à toi.

kojak
Modérateur global
Modérateur global
Messages : 10383
Inscription : samedi 18 novembre 2006, 19:50

Re: P'tite macro

Message par kojak »

rebouxo a écrit :@Kojak, je pense à toi, je pense à toi.
T'en fais pas des cauchemars, j'espère :lol:

[HS]
Pour info, le bac STI GMA 2007, exo 1 est très original : il y a eu le même exo à une question près en GMB en 2003 exo2
[/HS]
Pas d'aide par MP.

rebouxo
Modérateur global
Modérateur global
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre

Re: P'tite macro

Message par rebouxo »

kojak a écrit : T'en fais pas des cauchemars, j'espère :lol:
Je n'en dors plus la nuit, donc je me suis mis à Emacs (prototype du logiciel pas du tout user-friendly, c'est le moins que l'on puisse dire).

Olivier

toufan
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 139
Inscription : mercredi 04 janvier 2006, 18:09
Localisation : Paris

Re: P'tite macro

Message par toufan »

rebouxo a écrit :Hello, hello.

Sauf que, j'ai toujours rien pigé au système de déclarations des clés dans xkeyval. Donc si sur cet exemple vous auriez la bonté de m'expliquer, cela me ferait plaisir.

Olivier
@Kojak, je pense à toi, je pense à toi.
Bonsoir Olivier,

voici un exemple de 'xkeyval' :

Code : Tout sélectionner

\documentclass{article}
\usepackage{xkeyval}
\usepackage{amsmath,amssymb}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\makeatletter
\define@key{integrale}{inf} {\def\binf{#1}}
\define@key{integrale}{sup}{\def\bsup{#1}}
\define@key{integrale}{fonction} {\def\ff{#1}}
\define@key{integrale}{variable} {\def\xvar{\, \textrm{d}#1}}


\presetkeys{integrale}{inf=0,sup=1,fonction={h(x)},variable=x}{}

\def\integrale{\@ifnextchar[\@integrale{\@integrale[]}}
\def\@integrale[#1]{\setkeys{integrale}{#1}%
  \ensuremath{\displaystyle{\int_{\binf}^{\bsup}\ff\xvar}}}
\makeatother

\begin{document}

par default:   \verb| \[\integrale \]  | :    \[\integrale \] \\

avec les options :  \\
\verb|\[\integrale[inf=-\pi, sup=2\pi , variable=\theta, fonction=\sin(\theta)] \]| : \\



\[\integrale[inf=-\pi, sup=2\pi , variable=\theta, fonction=\sin(\theta)] \]

\[\mathbb{E}[X]=\integrale[inf=-\pi, sup=2\pi , variable=\theta, fonction=\theta\,\sin(\theta)] \]


\end{document}
Moi aussi j'ai passé des nuits blanches à comprendre le principe de xkeyval.

J'espère que code va t'aider.

Bon courage

Toufan
Amateur de LaTeX

Tryphon
Utilisateur chevronné
Utilisateur chevronné
Messages : 1839
Inscription : mercredi 01 juin 2005, 18:39
Localisation : Un peu plus à l'Ouest

Message par Tryphon »

des simples macros du type \intoo{a}{b} pour un ouvert/ouvert, \intof, \intfo, \intff ne te suffisent pas ? (perso j'ai défini ça dans mon fichier de macro il y a au moins deux ans de ça et ça ne m'a jamais fait défaut...)

(pour info, pour le bac STI GET, l'Inspectrice nous a demandé d'élaborer un barème par compétences et non par questions, j'en ris encore).
Pas de questions en MP
La calculatrice, c'est comme Linux, c'est de la merde !

rebouxo
Modérateur global
Modérateur global
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre

Message par rebouxo »

Tryphon a écrit :des simples macros du type \intoo{a}{b} pour un ouvert/ouvert, \intof, \intfo, \intff ne te suffisent pas ? (perso j'ai défini ça dans mon fichier de macro il y a au moins deux ans de ça et ça ne m'a jamais fait défaut...)
J'avais fais la même chose mais je trouve l'idée d'une seule macro plus élégante. Et puis je me dis que c'est l'occasion de comprendre xkeyval.
Tryphon a écrit : (pour info, pour le bac STI GET, l'Inspectrice nous a demandé d'élaborer un barème par compétences et non par questions, j'en ris encore).
On ne masturbe pas mon fil, STP :D

Je regarde le code de Toufan.
Olivier

rebouxo
Modérateur global
Modérateur global
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre

Message par rebouxo »

Bon, ben j'ai regardé le code de Toufan et, j'suis perdu.
Enfin, non pas vraiment, car mes définitions de clés me semblent bonnes :

Code : Tout sélectionner

\makeatletter
\define@key{MTMX}{openA}[\rbrack] {\def\openA{#1}}
\define@key{MTMX}{openB}[\lbrack]{\def\openB{#1}}
\define@key{MTMX}{closeA}[\lbrack] {\def\closeA{#1}}
\define@key{MTMX}{closeB}[\rbrack]{\def\closeB{#1}}
\makeatother 
Bien que je ne sois pas vraiment sur des \def\openA{#1}.
Bon disons que j'ai réussi à faire un petit progrès pour ce soir.

Après je nage. Les \def en cascades ? :?: :!: C'est pour pouvoir écrire
\intervalle[clé] ? Mais pourquoi ? Peut-on remplacer le premier \def par un \newcommand ?

Ensuite je suis enquiquiné, parce que tu affectes des valeurs à tes clès, mais moi, en fait je n'affecte rien. Si j'ai openA alors \rbrack. Je vais donc être obligé de faire un test et mes test de TeX, pas glop, pas glop.

Olivier
Dodo

rebouxo
Modérateur global
Modérateur global
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre

Message par rebouxo »

Je me réponds car les nuits portent conseils et parfois donnent des idées.
En fait je pense que la commande devrait-être uniquement \interval avec uniquement des options :
\Interval[inf=a,sup=b,close]

L'intérêt c'est alors de fabriquer une macro : \setInterval{inf=a,sup=b,close}, qui serait valable jusqu'au prochain \setInterval. Dans un texte d'exo, on n'a souvent besoin que d'un intervalle, voilà une 3e raison pour la supériorité de cette macro.

Dans le code de la macro, je pense qu'il faut écrire une macro \@open et une macro \@close qui se charge de l'ouverture et la fermeture de l'intervalle.

Olivier

Tryphon
Utilisateur chevronné
Utilisateur chevronné
Messages : 1839
Inscription : mercredi 01 juin 2005, 18:39
Localisation : Un peu plus à l'Ouest

Message par Tryphon »

Mieux encore : tu permets un numero.

Par exemple

Code : Tout sélectionner

\setinterval{id=1,left=0,right=\infty,open}
\setinterval{id=2,left=2,right=10,close}

Les $\interval 1$ et $\interval 2$ sont respectivement ouverts et fermés.
Mieux encore mais mieux, si le id n'est pas précisé, c'est le 1 par défaut !
Pas de questions en MP
La calculatrice, c'est comme Linux, c'est de la merde !

rebouxo
Modérateur global
Modérateur global
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre

Message par rebouxo »

Tryphon a écrit :Mieux encore : tu permets un numero.

Par exemple

Code : Tout sélectionner

\setinterval{id=1,left=0,right=\infty,open}
\setinterval{id=2,left=2,right=10,close}

Les $\interval 1$ et $\interval 2$ sont respectivement ouverts et fermés.
Mieux encore mais mieux, si le id n'est pas précisé, c'est le 1 par défaut !
Ah, yes encore une fonctionnalité. Je pensais aussi au séparateur (; ou ,) à l'espace entre le séparateur et les bornes. Bref, c'est pas les idées qui manquent, c'est juste la méthode de programmation.

Olivier

P.Fradin

Message par P.Fradin »

Bonjour,

juste pour donner une idée:

Code : Tout sélectionner

\documentclass[11pt,frenchb]{article}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{amssymb,amsmath,amsfonts}
\usepackage[margin=1cm]{geometry}
\usepackage{ifthen,xkeyval,babel}

\makeatletter
\def\@leftdelim{]}%délimiteur gauche
\def\@rightdelim{[}%délimiteur droit
\def\@binf{}% borne de gauche
\def\@bsup{}% borne de droite

\define@key[Intervalle]{fam}{inf}[0]{% définit le borne inf
\def\@binf{#1}%
}%

\define@key[Intervalle]{fam}{sup}[1]{% défnit la borne sup
\def\@bsup{#1}%
}%

\newcommand{\interval}[1][]{% la commande interval
\setkeys[Intervalle]{fam}{#1}% la macro magique d'xkeyval!
\@leftdelim\@binf;\@bsup\@rightdelim% affichage
}%
\makeatother

\begin{document}
 
$\interval[inf=0, sup=2]$

\end{document}
Je n'ai pas le temps d'étoffer maintenant, je dois partir ...

A plus

kojak
Modérateur global
Modérateur global
Messages : 10383
Inscription : samedi 18 novembre 2006, 19:50

Message par kojak »

@rebouxo ; Au fait, ta macro, elle prendra en compte de faire des "beaux" crochets quand tu as une fraction avec

Code : Tout sélectionner

\dfrac{}{}
soit dans les 2 bornes, soit dans une seule :roll:
Pas d'aide par MP.

rebouxo
Modérateur global
Modérateur global
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre

Message par rebouxo »

kojak a écrit :@rebouxo ; Au fait, ta macro, elle prendra en compte de faire des "beaux" crochets quand tu as une fraction avec

Code : Tout sélectionner

\dfrac{}{}
soit dans les 2 bornes, soit dans une seule :roll:
Beeeen évideeeeement....
Olivier

P.Fradin

Message par P.Fradin »

Bon apparemment, mon petit exemple n'a pas l'ai d'intéresser l'OP, mais peut-être que cela en intéressera d'autres, j'ai étoffé un peu cet exemple en:

Code : Tout sélectionner

\documentclass[11pt,frenchb]{article}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{amssymb,amsmath,amsfonts}
\usepackage[margin=1cm]{geometry}
\usepackage{xkeyval,babel}

\makeatletter
\def\@leftdelim{\left[}%
\def\@rightdelim{\right]}%
\def\@binf{}%
\def\@bsup{}%
\def\@sep{;}%

\define@key[Intervalle]{fam}{inf}[0]{%
\def\@binf{#1}%
}%

\define@key[Intervalle]{fam}{sup}[1]{%
\def\@bsup{#1}%
}%

\define@key[Intervalle]{fam}{sep}[;]{%
\def\@sep{#1}%
}%

\define@key[Intervalle]{fam}{openA}[none]{%
\def\@leftdelim{\left]}%
}%

\define@key[Intervalle]{fam}{closeA}[none]{%
\def\@leftdelim{\left[}%
}%

\define@key[Intervalle]{fam}{openB}[none]{%
\def\@rightdelim{\right[}%
}%

\define@key[Intervalle]{fam}{closeB}[none]{%
\def\@rightdelim{\right]}%
}%

\define@key[Intervalle]{fam}{open}[none]{%
\def\@leftdelim{\left]}%
\def\@rightdelim{\right[}%
}%

\define@key[Intervalle]{fam}{close}[none]{%
\def\@leftdelim{\left[}%
\def\@rightdelim{\right]}%
}%


\newcommand{\setintervalle}[2]{%
\expandafter\def\csname intervalle#1\endcsname{%
\setkeys[Intervalle]{fam}{#2}%
\@leftdelim{\@binf\@sep\@bsup}\@rightdelim}
}
\makeatother

\begin{document}

\setintervalle{A}{openA, closeB, inf=-\sqrt{\frac32}, sup=\pi^{1/3}, sep=\mathop{:}}

\setintervalle{B}{open, inf=-\infty, sup=\int_0^1f(t)\,dt, sep=\mathop{;}}
 
Voici un intervalle ouvert à gauche: $\intervalleA$, alors que le suivant est ouvert:

\[\intervalleB\]

\end{document}
Plutôt que de numérater les styles d'intervalles en 1, 2 ..., j'ai utilisé une lettre ce qui permet de construire automatiquement les macros intervalleA, intervalleB, etc...

Voilà, à plus.

[Edit: j'ai enlevé une clé qui n'était pas utilsée]
Dernière modification par P.Fradin le mardi 26 juin 2007, 20:27, modifié 1 fois.

rebouxo
Modérateur global
Modérateur global
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre

Message par rebouxo »

Non, pas du tout j'ai juste eu pas le temps pour regarder ton code et le comprendre. Parce que j'aimerais bien comprendre ce qui est fais. Mais la soirée ne fais que commencer :twisted:

Pour les noms, je m'étais inspirer de pst-eucl, mais ce n'est peut-être pas une bonne idée. Le système proposé par Tryphon n'était pas mal : o pour open (ou ouvert) et c pour close, plutôt que des chiffres.

Bon, j'essaye de regarder cela.
Olivier

rebouxo
Modérateur global
Modérateur global
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre

Message par rebouxo »

Bon, je regarde et j'ai déjà des questions à la 3e ligne, ou presque.

Code : Tout sélectionner

\def\@leftdelim{\left[}%
\def\@rightdelim{\right]}%
Pourquoi cela et pourquoi

Code : Tout sélectionner

\define@key[Intervalle]{fam}{openB}[none]{%
\def\@rightdelim{\right[}%
}%
On ne peut pas utiliser la première définition, on pourrait donc les supprimer, right ?

Olivier

P.Fradin

Message par P.Fradin »

rebouxo a écrit :Bon, je regarde et j'ai déjà des questions à la 3e ligne, ou presque.

Code : Tout sélectionner

\def\@leftdelim{\left[}%
\def\@rightdelim{\right]}%
Pourquoi cela et pourquoi

Code : Tout sélectionner

\define@key[Intervalle]{fam}{openB}[none]{%
\def\@rightdelim{\right[}%
}%
On ne peut pas utiliser la première définition, on pourrait donc les supprimer, right ?

Olivier
Disons que les premières définitions sont des définitions par défaut (elles correspondent à closeA et closeB), on peut tout à fait les supprimer mais tu prends un risque: si une d'elles n'est pas définie au moment de la compilation parce que l'utilisateur n'utilise pas l'option correspondante, il y aura un plantage. (undefined control...)

Le truc c'est que la macro de construction fait toujours la même chose:

1) réglages en fonction des options {c'est \setkeys...)
2) affichage: \@leftdelim{\@binf\sep\@bsup}\@rightdelim

les options permettent de redéfinir les macros qui servent à l'affichage, par exemple quand \setkeys "rencontre" l'option openB, elle exécute le code associé par \define@keys, c'est à dire elle redéfinit la macro \@rightdelim en \right[, quand elle rencontre inf=12 elle exécute le code associé au \define@key correspondant, c'est à dire elle rédéfinit la macro \@binf avec la valeur 12 à la place de #1.

rebouxo
Modérateur global
Modérateur global
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre

Message par rebouxo »

P. Fradin a écrit :affichage: \@leftdelim{\@binf\sep\@bsup}\@rightdelim
ha je vais me coucher moins c.. ce soir, je le sens.
En faite la macro est assez simple à faire dans ce cas, parce qu'il suffit d'écrire la liste.
Pourquoi as-tu mis des accolades après \@leftdelim ? A priori cette macro n'a pas d'argument (et n'en a pas besoin, il me semble).

Autre question : doit-on faire attention aux noms des macros internes ? Y a-t-il un risque qu'elles interfèrent avec des macros déjà définies ? ou bien \makeatother\makeatletter se comporte comme un groupe ?

Olivier

P.Fradin

Message par P.Fradin »

rebouxo a écrit :
P. Fradin a écrit :affichage: \@leftdelim{\@binf\sep\@bsup}\@rightdelim
Pourquoi as-tu mis des accolades après \@leftdelim ? A priori cette macro n'a pas d'argument (et n'en a pas besoin, il me semble.
Olivier
C'est pour faire un groupe, de manière à ce que les deux crochets aient la même taille, mais à bien y réfléchir c'est inutile en effet...

rebouxo
Modérateur global
Modérateur global
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre

Message par rebouxo »

J'ai des petites questions :
1. pourquoi ne peut-on pas rajouter des accolades en rouges ?
\newcommand{\setintervalle}[2]{%
\expandafter\def\csname intervalle{#1}\endcsname{%
\setkeys[Intervalle]{fam}{#2}%
\@leftdelim{\@binf\@sep\@bsup}\@rightdelim}
}
2a. je suis pénible, mais et si on veut une formulation \intervalle[option]{nom}
2b. Et si, on mettait une lettre facultative ? Au hasard I ?
3. \expandafter je vois à peu près ce que cela veut dire, mais les \csname ?

Sinon, c'est super. Bon, il me faudrait une autre idée pour m'entraîner.

Olivier