P'tite macro

Tout ce qui concerne le langage TeX/LaTeX et ses variantes. Ce langage est utilisable sur le forum via les balises tex.
[participation réservée aux utilisateurs inscrits]
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 honoraire
Modérateur honoraire
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre
Contact :

P'tite macro

Message non lu 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 général
Modérateur général
Messages : 10450
Inscription : samedi 18 novembre 2006, 19:50

Re: P'tite macro

Message non lu 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 honoraire
Modérateur honoraire
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre
Contact :

Re: P'tite macro

Message non lu 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

Re: P'tite macro

Message non lu 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
Tryphon
Modérateur honoraire
Modérateur honoraire
Messages : 1839
Inscription : mercredi 01 juin 2005, 18:39
Localisation : Un peu plus à l'Ouest

Message non lu 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 honoraire
Modérateur honoraire
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre
Contact :

Message non lu 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 honoraire
Modérateur honoraire
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre
Contact :

Message non lu 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 honoraire
Modérateur honoraire
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre
Contact :

Message non lu 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
Modérateur honoraire
Modérateur honoraire
Messages : 1839
Inscription : mercredi 01 juin 2005, 18:39
Localisation : Un peu plus à l'Ouest

Message non lu 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 honoraire
Modérateur honoraire
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre
Contact :

Message non lu 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 non lu 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 général
Modérateur général
Messages : 10450
Inscription : samedi 18 novembre 2006, 19:50

Message non lu 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 honoraire
Modérateur honoraire
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre
Contact :

Message non lu 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 non lu 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 honoraire
Modérateur honoraire
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre
Contact :

Message non lu 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 honoraire
Modérateur honoraire
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre
Contact :

Message non lu 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 non lu 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 honoraire
Modérateur honoraire
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre
Contact :

Message non lu 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 non lu 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 honoraire
Modérateur honoraire
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre
Contact :

Message non lu 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
Répondre
  • Sujets similaires
    Réponses
    Vues
    Dernier message