[Résolu] Changer l'argument optionnel

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.

[Résolu] Changer l'argument optionnel

Messagepar Deviling » Jeudi 27 Janvier 2011, 00:27

Bonsoir.

J'ai beau réfléchir, je n'arrive pas à trouver comment réaliser la chose suivante.

Par exemple, pour \begin{figure} \centering MACHIN \end{figure}, j'ai crée un raccourci que nous nommerons \Figure{MACHIN}.
Mais il y a un argument optionnel pour \begin{figure}, on peut mettre h, t, b, p, !h, !t, !b ou !p. Je souhaiterai donc crée plutôt un \Figure[...][MACHIN].
Cela, vous m'avez appris à le faire. Par contre, ce que je cherche désormais à obtenir c'est que :
\Figure[ici]{MACHIN} renvoit \begin{figure}[!h] \centering MACHIN \end{figure}
\Figure[haut]{MACHIN} renvoit \begin{figure}[!t] \centering MACHIN \end{figure}
\Figure[bas]{MACHIN} renvoit \begin{figure}[!b] \centering MACHIN \end{figure}
\Figure[page]{MACHIN} renvoit \begin{figure}[!p] \centering MACHIN \end{figure}


J'ai essayé
Code: Tout sélectionner
\newcommand{\Figure[ici]}[1]{\begin{figure}[!h] \centering #1 \end{figure}}

Mais cela n'a pas fonctionné, il ne reconnait pas \Figure[ici], seulement \Figure.
Est-ce compréhensible ? Est résolvable ?

Encore une fois, je cherche une méthode générale, applicable pour d'autres commandes.
Dernière édition par Deviling le Vendredi 28 Janvier 2011, 14:28, édité 1 fois.
Deviling
Hecto-utilisateur
 
Messages: 63
Inscription: Dimanche 23 Janvier 2011, 20:40
Statut actuel: Post-bac | Ecole d'ingénieur

Publicité

Re: Changer l'argument optionnel

Messagepar projetmbc » Jeudi 27 Janvier 2011, 11:47

Bonjour,
l'exemple suivant devrait t'aider :
Code: Tout sélectionner
\documentclass[a4paper]{article}
   \usepackage[utf8x]{inputenc}
   \usepackage{xifthen}  % Frendly commands for testing.

   \newcommand{\testArgumentValue}[1]{
      \ifthenelse{\equal{#1}{OUI}}{ %
         Vous avez tapé ''OUI'' %
      }{ %
         Vous avez tapé autre chose que ''OUI'', à savoir ''#1'' %
      }
   }

\begin{document}
   Appel avec OUI $\mapsto$ \testArgumentValue{OUI}.

   Appel avec BIDON $\mapsto$ \testArgumentValue{BIDON}.
\end{document}

N'étant pas un expert, il peut exister une solution plus simple ou plus efficace.
projetmbc
Péta-utilisateur
 
Messages: 1897
Inscription: Samedi 29 Décembre 2007, 00:58
Statut actuel: Actif et salarié | Enseignant

Re: Changer l'argument optionnel

Messagepar un bon petit » Jeudi 27 Janvier 2011, 17:25

On peut s'amuser à écrire une macro qui teste l'égalité d'un argument par rapport à plusieurs alternatives :
Code: Tout sélectionner
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\makeatletter
\def\casestrelse{\casestrelse}
\newcommand\casestr[1]{\def\temp@a{#1}\casestr@i}
\newcommand\casestr@i[1]{%
   \def\temp@b{#1}%
   \csname\ifx\temp@b\casestrelse @firstofone\else casestr@ii\fi\endcsname}
\newcommand\casestr@ii[1]{%
   \csname @\ifx\temp@a\temp@b first\else second\fi oftwo\endcsname
   {\case@gobbletoend{#1}}\casestr@i}
\long\def\case@gobbletoend#1#2\casestrelse#3{#1}
\makeatother

\newcommand\testarg[1]{%
   \casestr{#1}
      {Bonjour}   {Bonjour à vous}
      {Au revoir} {Vous avez entré ``Au revoir''}
      {fin}       {Fin de la discussion}
   \casestrelse
      {Code alternatif}%
}

\begin{document}
\testarg{Bonjour}

\testarg{fin}

\testarg{autre chose}
\end{document}

Bien que je ne l'ai pas testé, on doit pouvoir écrire une macro dans ce genre :
Code: Tout sélectionner
\newcommand\inserefigure[2][]{%
   \casestr{#1}
      {ici}{\begin{figure}[!h]}
      {haut}{\begin{figure}[!t]}
      {bas}{\begin{figure}[!b]}
      {page}{\begin{figure}[!p]}
   \casestrelse
      {\begin{figure}}%
   \centering#2\end{figure}}
un bon petit
Giga-utilisateur
 
Messages: 752
Inscription: Vendredi 12 Juin 2009, 21:35
Localisation: Chambéry
Statut actuel: Actif et salarié | Enseignant

Re: Changer l'argument optionnel

Messagepar projetmbc » Jeudi 27 Janvier 2011, 18:00

Bonjour,
très sympa cette fonctionnalité. Tu devrais proposer ceci à l'auteur de xifthen sauf si cela est déjà proposé par un autre package.

PS : je te poserais des questions sur ce code en plus de celles sur l'autre sur l'argument vide (pas avant la semaine prochaine car les copies s'empilent...).
projetmbc
Péta-utilisateur
 
Messages: 1897
Inscription: Samedi 29 Décembre 2007, 00:58
Statut actuel: Actif et salarié | Enseignant

Re: Changer l'argument optionnel

Messagepar un bon petit » Jeudi 27 Janvier 2011, 18:32

projetmbc a écrit:Tu devrais proposer ceci à l'auteur de xifthen sauf si cela est déjà proposé par un autre package.

Je déteste ifthen :mrgreen: et donc xifthen. De plus xstring propose déjà ce genre de petits tests. Enfin, le code pour réaliser ce genre de chose n'est vraiment pas très texnique (quoique...) et certainement à la portée de l'auteur de ifthen
PS : je te poserais des questions sur ce code en plus de celles sur l'autre sur l'argument vide (pas avant la semaine prochaine car les copies s'empilent...).

Ok, mais les explications risquent d'être longues et difficiles à donner, surtout sur ce code...
un bon petit
Giga-utilisateur
 
Messages: 752
Inscription: Vendredi 12 Juin 2009, 21:35
Localisation: Chambéry
Statut actuel: Actif et salarié | Enseignant

Re: Changer l'argument optionnel

Messagepar Deviling » Jeudi 27 Janvier 2011, 19:43

un bon petit a écrit:On peut s'amuser à écrire une macro qui teste l'égalité d'un argument par rapport à plusieurs alternatives :
Code: Tout sélectionner
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\makeatletter
\def\casestrelse{\casestrelse}
\newcommand\casestr[1]{\def\temp@a{#1}\casestr@i}
\newcommand\casestr@i[1]{%
   \def\temp@b{#1}%
   \csname\ifx\temp@b\casestrelse @firstofone\else casestr@ii\fi\endcsname}
\newcommand\casestr@ii[1]{%
   \csname @\ifx\temp@a\temp@b first\else second\fi oftwo\endcsname
   {\case@gobbletoend{#1}}\casestr@i}
\long\def\case@gobbletoend#1#2\casestrelse#3{#1}
\makeatother

\newcommand\testarg[1]{%
   \casestr{#1}
      {Bonjour}   {Bonjour à vous}
      {Au revoir} {Vous avez entré ``Au revoir''}
      {fin}       {Fin de la discussion}
   \casestrelse
      {Code alternatif}%
}

\begin{document}
\testarg{Bonjour}

\testarg{fin}

\testarg{autre chose}
\end{document}

Bien que je ne l'ai pas testé, on doit pouvoir écrire une macro dans ce genre :
Code: Tout sélectionner
\newcommand\inserefigure[2][]{%
   \casestr{#1}
      {ici}{\begin{figure}[!h]}
      {haut}{\begin{figure}[!t]}
      {bas}{\begin{figure}[!b]}
      {page}{\begin{figure}[!p]}
   \casestrelse
      {\begin{figure}}%
   \centering#2\end{figure}}


Merci beaucoup, cela à l'air très intéressant.
Bon par contre, je comprends absolument rien à la macro :mrgreen:
Je le testerai prochainement.
Deviling
Hecto-utilisateur
 
Messages: 63
Inscription: Dimanche 23 Janvier 2011, 20:40
Statut actuel: Post-bac | Ecole d'ingénieur

Re: Changer l'argument optionnel

Messagepar projetmbc » Jeudi 27 Janvier 2011, 20:58

Bonsoir.
un bon petit a écrit:Je déteste ifthen :mrgreen: et donc xifthen. De plus xstring propose déjà ce genre de petits tests...

Voici donc un exemple analogue au tien en utilisant xstring, un package un peu chaud... :mrgreen:
Code: Tout sélectionner
\documentclass{article}
   \usepackage[utf8]{inputenc}
   \usepackage[T1]{fontenc}
   \usepackage{xstring}

   \newcommand\testarg[1]{
      \IfStrEqCase{#1}{
         {Bonjour}{
            Bonjour à vous
         }
         {Au revoir}{
            Vous avez entré ''Au revoir''
         }
         {fin}{
            Fin de la discussion
         }
         {Cool}{
            C'est vraiment trop cool !
         }% Commentaire à garder !
      }[
         Argument inconnu : ''#1''
      ]
   }

\begin{document}
   \testarg{Bonjour}
   \testarg{fin}
   \testarg{autre chose}
   \testarg{Cool}
\end{document}
projetmbc
Péta-utilisateur
 
Messages: 1897
Inscription: Samedi 29 Décembre 2007, 00:58
Statut actuel: Actif et salarié | Enseignant

Re: Changer l'argument optionnel

Messagepar Deviling » Vendredi 28 Janvier 2011, 12:40

un bon petit a écrit:On peut s'amuser à écrire une macro qui teste l'égalité d'un argument par rapport à plusieurs alternatives :
Code: Tout sélectionner
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\makeatletter
\def\casestrelse{\casestrelse}
\newcommand\casestr[1]{\def\temp@a{#1}\casestr@i}
\newcommand\casestr@i[1]{%
   \def\temp@b{#1}%
   \csname\ifx\temp@b\casestrelse @firstofone\else casestr@ii\fi\endcsname}
\newcommand\casestr@ii[1]{%
   \csname @\ifx\temp@a\temp@b first\else second\fi oftwo\endcsname
   {\case@gobbletoend{#1}}\casestr@i}
\long\def\case@gobbletoend#1#2\casestrelse#3{#1}
\makeatother


En fait, j'aimerais bien quelques explications sur cette macro.
Déjà je ne comprends pas ce que fait \def\casestrelse{\casestrelse}.
Ensuite, j'aurais voulu savoir quoi changer si je voulais qu'au lieu de \casestrelse et \casestr, il y est un autre nom.
(En évitant, \newcommand{\machin}{\casestrelse} qui ne m'apprend pas grand chose sur la commande)

Si j'ai compris la macro fait :
Définie \casestrelse (enfin, la définition est bizarre).
Définie \casestr en fonction de \casestr@i
Définie \casestr@i en fonction de \casestrelse et \casestr@ii
Définie \casestr@ii en fonction de \case@gobbletoend et \casestr@i
\long (???)
Définie \case@gobbletoend en fonction de \casestrelse

Enfin tout ça pour dire que je comprends rien à la macro et je n'aime pas ne pas comprendre.
Deviling
Hecto-utilisateur
 
Messages: 63
Inscription: Dimanche 23 Janvier 2011, 20:40
Statut actuel: Post-bac | Ecole d'ingénieur

Re: Changer l'argument optionnel

Messagepar un bon petit » Vendredi 28 Janvier 2011, 14:24

Deviling a écrit:Déjà je ne comprends pas ce que fait \def\casestrelse{\casestrelse}.

Cela donne à la macro \casestrelse le texte de remplacement "\casesrtelse".
Ensuite, j'aurais voulu savoir quoi changer si je voulais qu'au lieu de \casestrelse et \casestr, il y est un autre nom.

Remplacer toutes les occurrences de "casestrelse" par le nom choisi. Même chose pour "casestr".
Si j'ai compris la macro fait :
Tu n'as pas compris, j'ai d'ailleurs l'impression que tu ne sais pas programmer en TeX.

Sans entrer dans aucun point texniques, ce qui serait trop long, voici une brève explication. Mettons que le test s'écrive :
Code: Tout sélectionner
\strcase{chaine}
   {cas 1]{code 1}
   {cas 2}{code 2}
   ...
   {cas n}{code n}
\casestresle
   {code alternatif}

Alors, la macro \casestr lit <chaine> et passe la main à la boucle principale dont voici les étapes :
1. \casestr@i : lire le <cas suivant>. Si <cas suivant> est \casestrelse, c'est qu'on a passé tous les cas et qu'aucun n'a convenu et donc lire et exécuter l'argument qui suit, c'est-à-dire <code alternatif>. Sinon, aller en 2
2. \casestr@ii : lire <code suivant>. Comparer <cas suivant> lu précédemment avec <chaine>. S'il y a égalité, aller en 3. Sinon, aller en 1
3. \case@gobbletoend : lire tous les cas et codes jusqu'à la fin sans en tenir compte et exécuter <code suivant>.
Dernière édition par un bon petit le Vendredi 28 Janvier 2011, 14:29, édité 1 fois.
un bon petit
Giga-utilisateur
 
Messages: 752
Inscription: Vendredi 12 Juin 2009, 21:35
Localisation: Chambéry
Statut actuel: Actif et salarié | Enseignant

Re: Changer l'argument optionnel

Messagepar Deviling » Vendredi 28 Janvier 2011, 14:28

un bon petit a écrit:
Si j'ai compris la macro fait :
Tu n'as pas compris, j'ai d'ailleurs l'impression que tu ne sais pas programmer en TeX.

Sans entrer dans aucun point texniques, ce qui serait trop long, voici une brève explication. Mettons que le test s'écrive :
Code: Tout sélectionner
\strcase{chaine}
   {cas 1]{code 1}
   {cas 2}{code 2}
   ...
   {cas n}{code n}
\casestresle
   {code alternatif}

Alors, la macro \casestr lit <chaine> et passe la main à la boucle principale dont voici les étapes :
1. \casestr@i : lire le <cas suivant>. Si <cas suivant> est \casestrelse, c'est qu'on a passé tous les cas et qu'aucun n'a convenu et donc lire et exécuter l'argument qui suit, c'est-à-dire <cas alternatif>. Sinon, aller en 2
2. \casestr@ii : lire <code suivant>. Comparer <cas suivant> lu précédemment avec <chaine>. S'il y a égalité, aller en 3. Sinon, aller en 1
3. \case@gobbletoend : lire tous les cas et codes jusqu'à la fin sans en tenir compte et exécuter <code suivant>.


Merci beaucoup.
Effectivement je ne sais pas programmer en Tex.
Deviling
Hecto-utilisateur
 
Messages: 63
Inscription: Dimanche 23 Janvier 2011, 20:40
Statut actuel: Post-bac | Ecole d'ingénieur


Retourner vers LaTeX

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: Yandex [Bot] et 2 invités

cron