P'tite macro

Tout ce qui concerne l'utilisation ou l'installation de LaTeX.

Modérateur: gdm_tex

Règles du forum
Merci d'éviter le style SMS dans vos messages et de penser à utiliser la fonction Recherche avant de poster un message. Pour joindre des fichiers à vos messages, consulter ce sujet.
> Penser à utiliser les balises Code pour poster du code.

P'tite macro

Messagepar rebouxo » Lundi 25 Juin 2007, 19:49

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.
rebouxo
Modérateur
 
Messages: 6901
Inscription: Mercredi 15 Février 2006, 13:18
Localisation: le havre
Statut actuel: Actif et salarié | Enseignant

Publicité

Re: P'tite macro

Messagepar kojak » Lundi 25 Juin 2007, 19:56

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
kojak
Modérateur
 
Messages: 10389
Inscription: Samedi 18 Novembre 2006, 19:50
Statut actuel: Actif et salarié | Enseignant

Re: P'tite macro

Messagepar rebouxo » Lundi 25 Juin 2007, 20:16

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
rebouxo
Modérateur
 
Messages: 6901
Inscription: Mercredi 15 Février 2006, 13:18
Localisation: le havre
Statut actuel: Actif et salarié | Enseignant

Re: P'tite macro

Messagepar toufan » Lundi 25 Juin 2007, 21:52

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
toufan
Kilo-utilisateur
 
Messages: 139
Inscription: Mercredi 04 Janvier 2006, 18:09
Localisation: Paris

Messagepar Tryphon » Lundi 25 Juin 2007, 22:06

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 !
Tryphon
Péta-utilisateur
 
Messages: 1840
Inscription: Mercredi 01 Juin 2005, 17:39
Localisation: Un peu plus à l'Ouest
Statut actuel: Actif et salarié | Enseignant

Messagepar rebouxo » Lundi 25 Juin 2007, 22:56

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
 
Messages: 6901
Inscription: Mercredi 15 Février 2006, 13:18
Localisation: le havre
Statut actuel: Actif et salarié | Enseignant

Messagepar rebouxo » Lundi 25 Juin 2007, 23:20

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
 
Messages: 6901
Inscription: Mercredi 15 Février 2006, 13:18
Localisation: le havre
Statut actuel: Actif et salarié | Enseignant

Messagepar rebouxo » Mardi 26 Juin 2007, 07:44

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
rebouxo
Modérateur
 
Messages: 6901
Inscription: Mercredi 15 Février 2006, 13:18
Localisation: le havre
Statut actuel: Actif et salarié | Enseignant

Messagepar Tryphon » Mardi 26 Juin 2007, 08:44

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 !
Tryphon
Péta-utilisateur
 
Messages: 1840
Inscription: Mercredi 01 Juin 2005, 17:39
Localisation: Un peu plus à l'Ouest
Statut actuel: Actif et salarié | Enseignant

Messagepar rebouxo » Mardi 26 Juin 2007, 09:32

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
rebouxo
Modérateur
 
Messages: 6901
Inscription: Mercredi 15 Février 2006, 13:18
Localisation: le havre
Statut actuel: Actif et salarié | Enseignant

Messagepar P.Fradin » Mardi 26 Juin 2007, 11:22

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
P.Fradin
 

Messagepar kojak » Mardi 26 Juin 2007, 11:41

@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
kojak
Modérateur
 
Messages: 10389
Inscription: Samedi 18 Novembre 2006, 19:50
Statut actuel: Actif et salarié | Enseignant

Messagepar rebouxo » Mardi 26 Juin 2007, 11:50

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
rebouxo
Modérateur
 
Messages: 6901
Inscription: Mercredi 15 Février 2006, 13:18
Localisation: le havre
Statut actuel: Actif et salarié | Enseignant

Messagepar P.Fradin » Mardi 26 Juin 2007, 18:51

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 édition par P.Fradin le Mardi 26 Juin 2007, 19:27, édité 1 fois.
P.Fradin
 

Messagepar rebouxo » Mardi 26 Juin 2007, 18:58

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
 
Messages: 6901
Inscription: Mercredi 15 Février 2006, 13:18
Localisation: le havre
Statut actuel: Actif et salarié | Enseignant

Messagepar rebouxo » Mardi 26 Juin 2007, 21:22

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
rebouxo
Modérateur
 
Messages: 6901
Inscription: Mercredi 15 Février 2006, 13:18
Localisation: le havre
Statut actuel: Actif et salarié | Enseignant

Messagepar P.Fradin » Mardi 26 Juin 2007, 21:44

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.
P.Fradin
 

Messagepar rebouxo » Mardi 26 Juin 2007, 22:38

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
rebouxo
Modérateur
 
Messages: 6901
Inscription: Mercredi 15 Février 2006, 13:18
Localisation: le havre
Statut actuel: Actif et salarié | Enseignant

Messagepar P.Fradin » Mardi 26 Juin 2007, 22:45

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...
P.Fradin
 

Messagepar rebouxo » Mardi 26 Juin 2007, 23:19

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
rebouxo
Modérateur
 
Messages: 6901
Inscription: Mercredi 15 Février 2006, 13:18
Localisation: le havre
Statut actuel: Actif et salarié | Enseignant

Suivante

Retourner vers LaTeX

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: Baidu [Spider], Google [Bot], Google Adsense [Bot], Proximic [Spider] et 29 invités