Macro pour intégrale récalcitrante

Tout ce qui concerne le langage TeX/LaTeX et ses variantes. Ce langage est utilisable sur le forum via les balises tex.
[participation réservée aux membres inscrits]
Règles du forum
Merci de soigner la rédaction de vos messages et de consulter ce sujet avant de poster. Pensez également à utiliser la fonction recherche du forum.
missPi
Utilisateur confirmé
Utilisateur confirmé
Messages : 23
Inscription : jeudi 16 juin 2022, 12:32
Statut actuel : Enseignant

[Résolu] Macro pour intégrale récalcitrante

Message non lu par missPi »

Bonjour ! Encore une erreur étrange et bizarre que je ne m'explique pas... Je tape une leçon d'intégration, et j'ai créé une macro pour aller plus vite.

Code : Tout sélectionner

\documentclass{article}
\usepackage[utf8]{inputenc}
\listfiles
\newcommand{\integ[4]}{\int_{#1}^{#2} #3\, \mathrm{d}#4} %intégrale de ... à ... fonction
\begin{document}
\[
f(x)=\integ{-1}{x}{g(t)}{t}
\]

\[
f(x)=\int_{-1}^{x} g(t)\, \mathrm{d}t
\]
\end{document}
Je devrais donc récupérer l'intégrale encore -1 et x de g(t)dt.
Mais... allez savoir pourquoi, ça me place systématiquement un 0 sur la borne inférieure...
J'ai ajouté la syntaxe sans macro en dessous et tout fonctionne bien. Avez-vous le même soucis ?
Ci-joint le fichier engendré par le code ci-dessus.
Pièces jointes
capture.jpg
capture.jpg (4.52 Kio) Consulté 537 fois
Dernière modification par missPi le jeudi 23 juin 2022, 14:49, modifié 1 fois.
un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 965
Inscription : vendredi 12 juin 2009, 22:35
Statut actuel : Enseignant
Localisation : Chambéry

Re: Macro pour intégrale récalcitrante

Message non lu par un bon petit »

Accolades mal placées. Sans compter l'argument #4 qui n'a rien à faire avec cette macro.

Code : Tout sélectionner

\newcommand*\integ[3]{\int_{#1}^{#2} #3\, \mathrm{d}}
Il faudrait arrêter de mettre des accolades après un \newcommand. C'est inutile, c'est moche, ça alourdit le code mais surtout, ce n'est pas cohérent avec la primitive \def de TeX qui n'en veut pas : \def\foo{bar} est correct, mais \def{\foo}{bar} est incorrect !
Programmer en TeX, TeXpérimental
missPi
Utilisateur confirmé
Utilisateur confirmé
Messages : 23
Inscription : jeudi 16 juin 2022, 12:32
Statut actuel : Enseignant

Re: Macro pour intégrale récalcitrante

Message non lu par missPi »

En effet c'était ça. En fait, toutes mes macros ont une accolade... je pensais que c'était obligatoire !
Et sisi l'argument 4 est nécessaire, c'est pour donner la variable d'intégration.
merci !
MB
Administrateur
Administrateur
Messages : 7845
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: Macro pour intégrale récalcitrante

Message non lu par MB »

En conservant les accolades, il faut en sortir le [4].

Code : Tout sélectionner

\newcommand{\integ}[4]{\int_{#1}^{#2} #3\, \mathrm{d}#4}
MB. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
projetmbc
Utilisateur chevronné
Utilisateur chevronné
Messages : 2106
Inscription : samedi 29 décembre 2007, 00:58

Re: Macro pour intégrale récalcitrante

Message non lu par projetmbc »

Bonjour.

Une réponse constructive consisterait à expliquer le comportement obtenu avec la mauvaise syntaxe. Non ?
missPi a écrit : jeudi 23 juin 2022, 14:49 En effet c'était ça. En fait, toutes mes macros ont une accolade... je pensais que c'était obligatoire !
Et sisi l'argument 4 est nécessaire, c'est pour donner la variable d'intégration.
D'un point de vue sémantique, oui, mais pour (La)TeX, peu importe avec la syntaxe employée pour utiliser la macro.
missPi
Utilisateur confirmé
Utilisateur confirmé
Messages : 23
Inscription : jeudi 16 juin 2022, 12:32
Statut actuel : Enseignant

Re: Macro pour intégrale récalcitrante

Message non lu par missPi »

MB a écrit : jeudi 23 juin 2022, 14:57 En conservant les accolades, il faut en sortir le [4].

Code : Tout sélectionner

\newcommand{\integ}[4]{\int_{#1}^{#2} #3\, \mathrm{d}#4}
Aaahhh voilà pourquoi les autres fonctionnaient... c'est fou, comme on a beau regarder regarder et ne pas voir ! gracias :)
gigiair
Utilisateur chevronné
Utilisateur chevronné
Messages : 2742
Inscription : samedi 08 juillet 2006, 20:56
Localisation : Saint Bonnet Elvert

Re: Macro pour intégrale récalcitrante

Message non lu par gigiair »

missPi a écrit : jeudi 23 juin 2022, 14:49 En effet c'était ça. En fait, toutes mes macros ont une accolade... je pensais que c'était obligatoire !
Ce n'est pas obligatoire, mais pour conformer \newcommand à la syntaxe de la plupart des macros LaTeX, l'argument est entre accolades.
Simplement l'argument est \integ , pas \integ[4].
Il n'est peut-être pas utile de placer \integ entre accolades, mais pratiquement tout le monde le fait. AUCTeX et TeXStudio proposent la syntaxe \newcommand{cmd}[args]{def} et je suis près à parier que tla majorité des systèmes d'aide à la rédaction du code font ainsi.

Le code n'est pas fait que pour le compilateur, il est aussi fait pour l'humain qui le lit et je trouve que placer le nom de la commande entre accolade permet de comprendre sans ambiguïté le nom de la commande (et lui seul) que l'on se propose de définir.
JJR.
LaTeXien migrateur.
un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 965
Inscription : vendredi 12 juin 2009, 22:35
Statut actuel : Enseignant
Localisation : Chambéry

Re: Macro pour intégrale récalcitrante

Message non lu par un bon petit »

missPi a écrit : jeudi 23 juin 2022, 14:49 Et sisi l'argument 4 est nécessaire, c'est pour donner la variable d'intégration.
Je maintiens ce que je dis : votre macro ne fait rien de son argument #4, donc, il convient de ne pas le faire lire par la macro
Ces 2 macros se comportent exactement de la même façon :

Code : Tout sélectionner

\newcommand*\integ[3]{\int_{#1}^{#2} #3\, \mathrm{d}}
et

Code : Tout sélectionner

\newcommand*\integ[4]{\int_{#1}^{#2} #3\, \mathrm{d}#4}
Par ailleurs, il convient d'utiliser la version étoilée de \newcommand ici !
gigiair a écrit : jeudi 23 juin 2022, 19:14 Ce n'est pas obligatoire, mais pour conformer \newcommand à la syntaxe de la plupart des macros LaTeX, l'argument est entre accolades.
Vous semblez ignorer ce qu'est un argument. Ce n'est d'ailleurs pas si évident...
Par pure curiosité, vous pourriez m'indiquer une macro de LaTeX qui prend un argument qui n'est pas entre accolades ?
gigiair a écrit : jeudi 23 juin 2022, 19:14 Il n'est peut-être pas utile de placer \integ entre accolades, mais pratiquement tout le monde le fait.
Tout à fait, car la plupart des gens ne comprennent rien à ce qu'ils font ni ce qui se joue en coulisse ni des règles les plus élémentaires de TeX (notamment celle qui stipule qu'un argument constitué d'un seul token -- comme une macro, tiens ! -- n'a nul besoin de se trouver entre accolades).

Les gens qui comprennent ce qu'ils font (et il y en a bien plus que ce que vous croyez) ne mettent pas d'accolades autour des macros définies par \newcommand ou ses acolytes (\renewcommand, \NewDocumentCommand, \DeclareRobustCommand, etc, etc.)
Si vous n'êtes pas convaincu, Jean Jacques, allez donc regarder le code du noyau LaTeX, ou n'importe quel fichier de classe, par exemple article.cls ! Et dites moi si les macros qui sont définies par les macros de LaTeX sont mises entre accolades...

Après, avancer comme argument (tiens, c'est marrant ça) que certains éditeurs ou même, emacs que vous idôlatrez font comme ceci ou comme cela et que donc, c'est de cette façon qu'il faut faire est une pure hérésie à laquelle vous devriez réfléchir.

Je maintiens donc ce que je dis : même si cela est possible, il ne faut pas mettre d'accolades autour de la macro que l'on définit par des macros de LaTeX (\newcommand et acolytes). Par légèreté du code, lisibilité et cohérence avec les primitives de TeX.
Programmer en TeX, TeXpérimental
missPi
Utilisateur confirmé
Utilisateur confirmé
Messages : 23
Inscription : jeudi 16 juin 2022, 12:32
Statut actuel : Enseignant

Re: Macro pour intégrale récalcitrante

Message non lu par missPi »

un bon petit a écrit : jeudi 23 juin 2022, 20:50
Je maintiens ce que je dis : votre macro ne fait rien de son argument #4, donc, il convient de ne pas le faire lire par la macro
Ces 2 macros se comportent exactement de la même façon :

Code : Tout sélectionner

\newcommand*\integ[3]{\int_{#1}^{#2} #3\, \mathrm{d}}
et

Code : Tout sélectionner

\newcommand*\integ[4]{\int_{#1}^{#2} #3\, \mathrm{d}#4}
non, avec la ligne

Code : Tout sélectionner

\newcommand*\integ[3]{\int_{#1}^{#2} #3\, \mathrm{d}}
j'aurai mon intégrale de f(x)d ce qui ne veut rien dire
alors que avec la ligne

Code : Tout sélectionner

\newcommand*\integ[4]{\int_{#1}^{#2} #3\, \mathrm{d}#4}
j'aurai mon intégrale de f(x)dx ce qui est correct.
MB
Administrateur
Administrateur
Messages : 7845
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: Macro pour intégrale récalcitrante

Message non lu par MB »

Il suffirait de saisir \integ{0}{1}{f(x)}x pour obtenir le résultat souhaité, même avec la version à trois arguments.
MB. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
projetmbc
Utilisateur chevronné
Utilisateur chevronné
Messages : 2106
Inscription : samedi 29 décembre 2007, 00:58

Re: Macro pour intégrale récalcitrante

Message non lu par projetmbc »

Ne pas mettre non plus à la poubelle la notion de signature d'une macro...