x non R y — Les-mathematiques.net The most powerful custom community solution in the world

x non R y

Bonjour à tous,

J'ai une relation binaire $R$ sur un ensemble $X$, et deux éléments $x,y \in X$.
Je veux écrire que $x$ n'est pas en relation avec $y$.
Quand je fais x \not R y ça donne un truc moche :
$$x \not R y$$

Y a-t-il une autre façon de faire ?

Evidemment, je pourrais aussi écrire $\neg(xRy)$, mais j'aime bien savoir.

Merci d'avance

Martial

Réponses

  • C'est bizarre, ce truc n'est pas si moche que ça, ici. Chez moi la barre oblique est pour ainsi dire à gauche du $R$, et c'est vraiment moche.

    Donc je maintiens quand même ma question : y a-t-il une autre syntaxe possible ?
  • Moi je vois la barre des à droite du R.
    J’imagine que l’on souhaite qu’elle soit par dessus ?
    Comme pour « n’est pas égal » ou pour « n’appartient pas » ?

    Édit : coquille grotesque
  • Bonjour Martial,

    Tu as drôlement bien fait de poser la question !

    1) Le rendu ici est différent car le forum n'utilise pas le logiciel LaTeX, seulement une syntaxe ressemblante pour les expressions mathématiques.

    2) Les symboles mathématiques n'ont pas le même espacement autour suivant leur fonction que, dans de nombreux cas, seul l'auteur du document connaît. Par exemple, le $R$ de la relation $PV = nRT$ (pour les gaz parfaits) est très bien comme ça : c'est une simple constante. Pour les variables, les constantes, les chiffres, la classe \mathord (i.e., symbole ordinaire) est en général assignée par défaut, donc il n'y a rien de particulier à faire. Mais à cause de ça, si tu écris « x \mathcal{R} y » alors que $\mathcal{R}$ est censé être une relation binaire, ce n'est pas bon (les trois symboles sont collés les uns aux autres). Il faut écrire quelque chose comme « x \mathrel{\mathcal{R}} y » pour que l'espacement autour du $\mathcal{R}$ soit correct. Mieux : encapsuler ça dans une macro (voir ci-dessous).

    Une relation binaire doit être mise dans \mathrel pour donner le bon espacement. Pour un opérateur binaire comme $+$ ou $\times$, c'est \mathbin qu'il faut, etc. Les 8 classes de symboles possibles sont indiquées dans le TeXbook (voir le tableau en bas de ce message). En plus de \mathord, \mathbin et \mathrel, on peut utiliser \mathop, \mathopen, \mathclose, \mathpunct et \mathinner pour changer la classe d'un symbole ou d'une sous-formule.

    Afin de barrer ton $\mathcal{R}$ tout en gardant le bon espacement, je propose de plagier la définition de \notin et d'encapsuler  :
    \documentclass{article}
    
    \makeatletter
    \newcommand*{\isRelR}[2]{%
      {#1}\mathrel{\mathcal{R}}{#2}%
    }
    \newcommand*{\isNotRelR}[2]{%
      {#1}\mathrel{\mathpalette\c@ncel{\mathcal{R}}}{#2}%
    }
    \makeatother
    
    \begin{document}
    $(\isRelR{x}{y}) \lor (\isNotRelR{x}{y})$
    \end{document}
    
    121916
  • Merci Brian,

    Mais si je veux un $R$ normal au lieu de $\mathcal{R}$ il me suffit de remplacer $\mathcal{R}$ par $R$ dans ce que tu me proposes, ou c'est plus compliqué que ça ?
  • Bonjour,
    Oh bah il te suffit de tester, non ? Je pense que ça devrait fonctionner.
  • Oui, tu remplaces juste \mathcal{R} par R ; il n'y a aucun piège de ce côté-là.
  • Merci. Je viens de tester, ça marche nickel dans les 2 cas.
  • Bien. (:D

    Voici une façon de faire un petit peu meilleure :
    \documentclass{article}
    % \usepackage{xparse} % seulement nécessaire si LaTeX plus vieux que 2020-10-01
    
    \makeatletter
    \NewDocumentCommand{\isRelR}{mm}{%
      {#1}\mathrel{\mathcal{R}}{#2}%
    }
    \NewDocumentCommand{\isNotRelR}{mm}{%
      {#1}\mathrel{\mathpalette\c@ncel{\mathcal{R}}}{#2}%
    }
    \makeatother
    
    \begin{document}
    
    $(\isRelR{x}{y}) \lor (\isNotRelR{x}{y})$
    
    \end{document}
    
    La différence, c'est l'utilisation de \NewDocumentCommand à la place de \newcommand ou \newcommand*. D'une part, c'est plus puissant si on veut prendre des arguments optionnels, “splitter” autour d'un caractère particulier, etc. Mais surtout, \NewDocumentCommand définit nos macros avec la primitive TeX \protected. C'est un peu technique, mais cela a pour conséquence que les macros ainsi définies auront moins de chances de poser problème si elles sont utilisées dans un argument comme celui
    de \chapter, \section, etc. (en fait, \protected@write, \protected@edef, \protected@xdef, \write, \edef, \xdef, \message...), commandes qui développent d'emblée tout ce qui est développable et non « protégé ».

    C'est une bonne habitude à prendre. En gros, toute macro utilisateur qui n'est pas destinée à produire un résultat uniquement par développement, via un code de ce genre :
    \edef\resultat{...\machin{arg1}{arg2}...{argn}...}
    
    (ni à être développée dans un \typeout, un \write...) devrait a priori être « protégée ».

    Remarque technique : \notin utilise un mécanisme similaire (\DeclareRobustCommand) que j'avais oublié de plagier dans mon premier message. La primitive \protected utilisée par \NewDocumentCommand est plus moderne. Elle nécessite les extensions e-TeX — qui sont omniprésentes aujourd'hui — mais protège la macro définie dans plus de situations que \DeclareRobustCommand ne le fait (cette dernière protège dans \protected@write, \protected@edef et \protected@xdef mais pas dans \edef ou dans \write, par exemple).

    Si tu ne comprends rien à ce qui précède, ne t'inquiète pas. Dis-toi juste que \NewDocumentCommand, c'est vachement bien et tu peux l'utiliser à la place de \newcommand. Au lieu d'indiquer le nombre d'arguments et au plus un argument optionnel, tu mets un 'm' pour chaque argument obligatoire (m pour mandatory) et un 'o' ou 'O{valeur par défaut}' pour chaque argument optionnel. Il y a plein d'autres possibilités ; faire 'texdoc xparse' pour la documentation.

    Pour les curieux qui voudraient voir la différence entre les deux approches, on peut utiliser par exemple :
    \makeatletter
    \typeout{Hello: \isNotRelR{x}{y}.}
    \protected@edef\foo{\isNotRelR{x}{y}}
    \show\foo
    \makeatother
    
  • Tu m'impressionnes drôlement Brian !

    Merci à Martial pour la question intéressante et à Brian de nous faire profiter de ses compétences franchement spectaculaires !
  • Merci omega, c'est gentil. Il n'y a pas de vraiment de secret : il faut lire de la bonne documentation et pratiquer suffisamment... comme l'ont sans doute fait les nombreuses personnes de ce forum brillantes sur plein de sujets en maths où moi, je suis une bille. 8-)
  • Je suis bien d'accord avec toi, Brian. Hélas ce qu'il faut préciser c'est que ces 2 conditions (beaucoup lire et beaucoup pratiquer) sont nécessaires mais non suffisantes. Je prends pour exemple mon cas particulier : j'ai lu des tonnes de livres et de papiers sur la théorie des ensembles, et je suis loin de maîtriser le sujet.

    Bon, d'accord, je suis moins une bille en TDE qu'en latex, fort heureusement. Quoique j'ai quand même fait des progrès. Tu t'en souviens peut-être, mon 1er post : "Ma nullité transcendantale en latex" doit dater d'un peu moins d'un an. A l'époque je savais à peine écrire $\forall n \in \omega$...
  • Un titre comme ça... j'ose dire qu'on s'en souvient tous, Martial. :-D
  • Merci Brian, ça fait chaud au coeur...
  • C'était un titre accrocheur, mais je ne crois pas que le film était à la hauteur. :-)
Connectez-vous ou Inscrivez-vous pour répondre.
Success message!