Sur ce fil du site tex.stackexchange, intitulé Arguments of custom commands as comma separated list?, on trouve différentes propositions pour écrire une macro dont les arguments sont séparés par des virgules.

Désireux de m'en servir pour taper les intervalles de façon plus générique, j'ai essayé d'adapter le code :

Ouvrir dans l'éditeur
\documentclass{article}
\usepackage{amsmath}
\makeatletter

\def\my@intervalle #1,#2\@eolst{%
  \ifx\relax#2\relax
    #1
  \else
    \my@intervalle #2\@eolst%
\fi}

\newcommand{\interff}[1]{%
  \left[
    \my@intervalle #1, \relax\noexpand\@eolst%
  \right]
}
\newcommand{\interffold}[2]{\left[#1~;~#2\right]}
\makeatother
\begin{document}

$\interff{1,2}$
$\interffold{1,2}$

\end{document}

J'obtiens le message suivant lors de la compilation :

Ouvrir dans l'éditeur
Runaway argument?
  \relax \noexpand \@eolst \fi \fi \right ] $ 
  ! Paragraph ended before \my@intervalle was complete.
  <to be read again> 
                  \par l.38 
 ? 
 ! Missing $ inserted.
 <inserted text> 
            $ l.38 
 ? 
 ! Missing \right. inserted.
 <inserted text> 
            \right . l.38 
 ?

Est-ce que quelqu'un peut m'aider à obtenir le résultat souhaité ?

Posée 15 Nov '15, 18:04

vincentxavier's gravatar image

vincentxavier
3315
Taux d'acceptation : 0%

Modifiée 15 Nov '15, 21:08

Pathe's gravatar image

Pathe ♦♦
7.4k28196245


Le message d'erreur est dû à l'espace qui est devant le \relax dans l'appel à \my@intervalle

La macro \my@intervalle est récursive (j'en profite pour faire remarquer que la récursivité n'est pas terminale, mais on s'en fiche un peu) et donc, lorsqu'elle est appelée avec via \interff{1,2}, elle reçoit comme argument #1 : 1 et comme argument #2 : 2, \relax\noexpand. Pourquoi avoir mis ce \noexpand dans l'appel \interff, mystère.

Bon, comme l'argument #2 ne commence pas par \relax, elle prend la branche \else et s'appelle-elle même avec son argument #2 c'est-à-dire \my@intervalle 2, \relax\noexpand\@eolst.

Son premier argument #1 est alors 2 et son 2e argument est \relax\noexpand. Rebelote, comme #2 ne commence pas par \relax mais par un espace (c'est lui la cause du plantage !), elle s'appelle à nouveau elle-même avec \my@intervalle \relax\noexpand\@eolst.

Et là, c'est le crash puisqu'il n'y a plus de virgule pour satisfaire l'argument délimité.

Je suggère et j'utilise, pour une saisie quasi-naturelle des intervalles la macro \I ainsi définie :

Ouvrir dans l'éditeur
\documentclass{article}
\usepackage{amsmath}
\usepackage[frenchb]{babel}
\newcommand\mathactive[1]{\mathcode`#1"8000 \begingroup \lccode`~`#1 \lowercase{\endgroup\def~}}
\newcommand\I{%
    \begingroup
        \mathactive\;{\mathpunct{}\mathpunct{\mathchar`\;}}%
        \mathactive\[{\right\delimiter\delcode`\[ \endgroup}%
        \mathactive\]{\right\delimiter\delcode`\] \endgroup}%
        \left\delimiter\delcode`}
\begin{document}
L'intervalle $\I[\dfrac12;3[$ et $\I]-1;+\infty[$.
\end{document}
Lien permanent

Publiée 15 Nov '15, 18:41

unbonpetit's gravatar image

unbonpetit ♦♦
1.8k18
Taux d'acceptation : 68%

Modifiée 15 Nov '15, 22:14

Ça correspond à l'intuition que j'avais sur cette macro, mais pas vu que c'était l'espace surnuméraire qui causait le souci. Je note la macro proposée qui répond également à mon problème, modulo le souci d'ouverture/fermeture des [] qui va poser souci dans le document .tex final.

(15 Nov '15, 23:05) vincentxavier vincentxavier's gravatar image

Il faudrait convertir cette réponse en commentaire et en expurger toute forme de politesse (le « merci »).

(15 Nov '15, 23:13) unbonpetit ♦♦ unbonpetit's gravatar image

@vincentxavier Attention ! Cette réponse était un commentaire plutôt qu'une réponse et a été convertie comme tel.

(15 Nov '15, 23:13) denis ♦♦ denis's gravatar image

@vincentxavier Les formules de politesse et les signatures sont à éviter : celle(s) de votre contribution a (ont) été supprimée(s).

(16 Nov '15, 10:06) denis ♦♦ denis's gravatar image
Votre réponse
(dés)activer l'aperçu

Suivre cette question

Par courriel :

Une fois que vous serez enregistré, vous pourrez souscrire à n'importe quelle mise à jour ici

Par flux RSS :

Réponses

Réponses et commentaires

Bases de Markdown

  • *italique* ou _italique_
  • **gras** ou __gras__
  • Lien ::[texte](http://url.com/ "Titre ")
  • Image : ?![alt texte](/path/img.jpg "Titre ")
  • Liste numérotée : 1. Foo 2. Bar
  • Pour ajouter un passage à la ligne, ajoutez deux espaces à l'endroit où vous souhaitez que la ligne commence.
  • Les balises HTML de base sont également prises en charge.