P'tite macro
-
- Modérateur honoraire
- Messages : 6962
- Inscription : mercredi 15 février 2006, 13:18
- Localisation : le havre
- Contact :
P'tite macro
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.
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.
Re: P'tite macro
T'en fais pas des cauchemars, j'espèrerebouxo a écrit :@Kojak, je pense à toi, je pense à toi.
[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.
-
- Modérateur honoraire
- Messages : 6962
- Inscription : mercredi 15 février 2006, 13:18
- Localisation : le havre
- Contact :
Re: P'tite macro
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).kojak a écrit : T'en fais pas des cauchemars, j'espère
Olivier
Re: P'tite macro
Bonsoir Olivier,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.
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}
J'espère que code va t'aider.
Bon courage
Toufan
-
- Modérateur honoraire
- Messages : 1839
- Inscription : mercredi 01 juin 2005, 18:39
- Localisation : Un peu plus à l'Ouest
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).
(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 !
La calculatrice, c'est comme Linux, c'est de la merde !
-
- Modérateur honoraire
- Messages : 6962
- Inscription : mercredi 15 février 2006, 13:18
- Localisation : le havre
- Contact :
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 :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...)
On ne masturbe pas mon fil, STP :DTryphon 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).
Je regarde le code de Toufan.
Olivier
-
- Modérateur honoraire
- Messages : 6962
- Inscription : mercredi 15 février 2006, 13:18
- Localisation : le havre
- Contact :
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 :
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
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
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
-
- Modérateur honoraire
- Messages : 6962
- Inscription : mercredi 15 février 2006, 13:18
- Localisation : le havre
- Contact :
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
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
-
- Modérateur honoraire
- Messages : 1839
- Inscription : mercredi 01 juin 2005, 18:39
- Localisation : Un peu plus à l'Ouest
Mieux encore : tu permets un numero.
Par exemple
Mieux encore mais mieux, si le id n'est pas précisé, c'est le 1 par défaut !
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.
Pas de questions en MP
La calculatrice, c'est comme Linux, c'est de la merde !
La calculatrice, c'est comme Linux, c'est de la merde !
-
- Modérateur honoraire
- Messages : 6962
- Inscription : mercredi 15 février 2006, 13:18
- Localisation : le havre
- Contact :
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.Tryphon a écrit :Mieux encore : tu permets un numero.
Par exempleMieux encore mais mieux, si le id n'est pas précisé, c'est le 1 par défaut !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.
Olivier
Bonjour,
juste pour donner une idée:
Je n'ai pas le temps d'étoffer maintenant, je dois partir ...
A plus
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}
A plus
@rebouxo ; Au fait, ta macro, elle prendra en compte de faire des "beaux" crochets quand tu as une fraction avec soit dans les 2 bornes, soit dans une seule
Code : Tout sélectionner
\dfrac{}{}
Pas d'aide par MP.
-
- Modérateur honoraire
- Messages : 6962
- Inscription : mercredi 15 février 2006, 13:18
- Localisation : le havre
- Contact :
Beeeen évideeeeement....kojak a écrit :@rebouxo ; Au fait, ta macro, elle prendra en compte de faire des "beaux" crochets quand tu as une fraction avecsoit dans les 2 bornes, soit dans une seuleCode : Tout sélectionner
\dfrac{}{}
Olivier
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:
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]
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}
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.
-
- Modérateur honoraire
- Messages : 6962
- Inscription : mercredi 15 février 2006, 13:18
- Localisation : le havre
- Contact :
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
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
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
-
- Modérateur honoraire
- Messages : 6962
- Inscription : mercredi 15 février 2006, 13:18
- Localisation : le havre
- Contact :
Bon, je regarde et j'ai déjà des questions à la 3e ligne, ou presque.
Pourquoi cela et pourquoi
On ne peut pas utiliser la première définition, on pourrait donc les supprimer, right ?
Olivier
Code : Tout sélectionner
\def\@leftdelim{\left[}%
\def\@rightdelim{\right]}%
Code : Tout sélectionner
\define@key[Intervalle]{fam}{openB}[none]{%
\def\@rightdelim{\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...)rebouxo a écrit :Bon, je regarde et j'ai déjà des questions à la 3e ligne, ou presque.Pourquoi cela et pourquoiCode : Tout sélectionner
\def\@leftdelim{\left[}% \def\@rightdelim{\right]}%
On ne peut pas utiliser la première définition, on pourrait donc les supprimer, right ?Code : Tout sélectionner
\define@key[Intervalle]{fam}{openB}[none]{% \def\@rightdelim{\right[}% }%
Olivier
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.
-
- Modérateur honoraire
- Messages : 6962
- Inscription : mercredi 15 février 2006, 13:18
- Localisation : le havre
- Contact :
ha je vais me coucher moins c.. ce soir, je le sens.P. Fradin a écrit :affichage: \@leftdelim{\@binf\sep\@bsup}\@rightdelim
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
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 a écrit :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.P. Fradin a écrit :affichage: \@leftdelim{\@binf\sep\@bsup}\@rightdelim
Olivier
-
- Modérateur honoraire
- Messages : 6962
- Inscription : mercredi 15 février 2006, 13:18
- Localisation : le havre
- Contact :
J'ai des petites questions :
1. pourquoi ne peut-on pas rajouter des accolades en rouges ?
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
1. pourquoi ne peut-on pas rajouter des accolades en rouges ?
2a. je suis pénible, mais et si on veut une formulation \intervalle[option]{nom}\newcommand{\setintervalle}[2]{%
\expandafter\def\csname intervalle{#1}\endcsname{%
\setkeys[Intervalle]{fam}{#2}%
\@leftdelim{\@binf\@sep\@bsup}\@rightdelim}
}
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
-
- Sujets similaires
- Réponses
- Vues
- Dernier message