IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation (La)TeX avancée Discussion :

Commande définissant des commandes


Sujet :

Programmation (La)TeX avancée

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juillet 2007
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 45
    Points : 29
    Points
    29
    Par défaut Commande définissant des commandes
    Pour éviter de déclarer toute une série de données imbriquées comme par exemple (sans aucun intérêt, mais simple, donc proposé pour cas d'école):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	\def\NesteRiv{Neste}
    	\def\NesteRivLg{\NesteRiv: 73,2~km}
    	etc.
    	\def\HersRiv{Hers-mort}
    	\def\HersRivLg{\HersRiv: 90~km}
    	etc.
    j'ai essayé de créer une macro de macro:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	\newcommand{\macmdRiviere}[3]{%
    	  \def{\#1Riv}{#1 #2}
    	  \def{\#1RivLg}{\#1Riv: #3~km}
    	  }
    que j'utiliserais comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	\macmdRiviere{Neste}{Neste}{73,2}
    	\macmdRiviere{Hers}{Hers-mort}{90}
    Mais latex n'a pas l'air de le faire comme j'ai cru qu'il le ferait quand je l'ai écrit, et je ne vois pas comment faire. Le code génère des erreurs. Voici ce que dit le .log:
    ! Missing control sequence inserted.
    <inserted text>
    \inaccessible
    l.1 \macmdRiviere{Neste}{Neste}{73,2}

    Please don't say `\def cs{...}', say `\def\cs{...}'.
    I've inserted an inaccessible control sequence so that your
    definition will be completed without mixing me up too badly.
    You can recover graciously from this error, if you're
    careful; see exercise 27.2 in The TeXbook.
    Si je modifie la definition de \macmdRiviere comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	\newcommand{\macmdRiviere}[3]{%
    	  \newcommand{\#1Riv}{#1 #2}
    	  \newcommand{\#1RivLg}{\#1Riv: #3~km}
    	  }
    Là encore, des erreurs, mais différentes:
    ! LaTeX Error: Command \# already defined.
    Or name \end... illegal, see p.192 of the manual.

    See the LaTeX manual or LaTeX Companion for explanation.
    Type H <return> for immediate help.
    ...

    l.1 \macmdRiviere{Neste}{Neste}{73,2}

    Your command was ignored.
    Type I <command> <return> to replace it with another command,
    or <return> to continue without it.

    ! Missing number, treated as zero.
    <to be read again>
    R
    l.1 \macmdRiviere{Neste}{Neste}{73,2}

    A number should have been here; I inserted `0'.
    (If you can't figure out why I needed to see a number,
    look up `weird error' in the index to The TeXbook.)

    ! You already have nine parameters.
    \reserved@a ...\def \expandafter \#\reserved@b #10
    R{
    l.1 \macmdRiviere{Neste}{Neste}{73,2}

    I'm going to ignore the # sign you just used.
    Que faire pour que ça fonctionne? Est-il possible de le faire?
    Merci d'avance.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 123
    Points : 142
    Points
    142
    Par défaut
    Déja tu va avoir un petit souci pour faire ce que tu veux...

    Lorsque TeX lis un document .tex, des qu'il tombe sur un backslash, il regarde ce qu'il y a directement derrière pour savoir quelle commande c'est...

    S'il n'y a qu'un seul caractère, ça peut etre n'importe quoi...

    Mais s'il ya plusieurs caractères du type texte, il s'arrete des qu'il trouve un des caractères suivants (il doit y en avoir d'autre):

    -un chiffre
    -un espace
    -un symbole (# $ * etc...)

    Le problème est qu'au lieu de remplacer ton #1 par le paramètre que tu lui passe (Neste ou Hers-mort), il interprete directement la commande \# et qui existe déja...

    Alors ça c'était pour le cas du renewcommand, pour le def, je ne comprend pas très bien le message d'erreur, mais ça vaut peut etre le coup d'aller jeter un coup d'oeil au TeXBook à la partie 27.2 comme il te le conseille...

Discussions similaires

  1. Réponses: 8
    Dernier message: 19/12/2013, 08h18
  2. Transmettre des commandes à un process lancé par ksh
    Par jojolepabo dans le forum Linux
    Réponses: 3
    Dernier message: 19/10/2005, 16h05
  3. Réponses: 3
    Dernier message: 24/05/2004, 16h20
  4. Interception des commandes in et out
    Par KDD dans le forum x86 16-bits
    Réponses: 13
    Dernier message: 18/12/2002, 16h55
  5. Réponses: 3
    Dernier message: 02/09/2002, 18h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo