Problème avec une nouvelle commande

Oct 28 2020

Depuis que je prends un cours d'algèbre linéaire, j'ai souvent besoin d'écrire M (mxn, K) et je trouve ça ennuyeux.

J'ai essayé de définir une commande: \newcommand{\M}[3]{M(#1 \times #2, #3)}mais cela donne une sortie étrange:

Hoe puis-je résoudre ce problème? Merci d'avance

Réponses

9 egreg Oct 28 2020 at 16:04

Si vous définissez

\newcommand{\M}[3]{M(#1 \times #2, #3)}

alors la syntaxe d'entrée doit être

\M{2}{2}{\mathbb{R}}

et pas

\M{2,2,\mathbb{R}}

qui reproduit en effet l'étrange sortie et, éventuellement, certains messages d'erreur.

Exemple:

\documentclass{article}
\usepackage{amsmath,amssymb}

\newcommand{\RR}{\mathbb{R}} % the reals

\newcommand{\M}[3]{M(#1\times #2,#3)}

\begin{document}

Good syntax \verb|\M{2}{2}{\RR}| yields $A\in\M{2}{2}{\RR}$

Bad syntax \verb|\M{2,2,\RR}| yields $A\in\M{2,2,\RR}$

\end{document}

Pouvez-vous faire fonctionner la syntaxe, certes plus simple? Oui.

\documentclass{article}
\usepackage{amsmath,amssymb}
%\usepackage{xparse}% not needed for LaTeX 2020-10-01 or later

\newcommand{\RR}{\mathbb{R}} % the reals

\NewDocumentCommand{\M}{>{\SplitArgument{2}{,}}m}{\MLONG#1}
\NewDocumentCommand{\MLONG}{mmm}{M(#1\times #2,#3)}

\begin{document}

Good new syntax \verb|\M{2,2,\RR}| yields $A\in\M{2,2,\RR}$

\end{document}

Où est le secret? Le préprocesseur \SplitArgument{2}{,}dit à LaTeX de lire l'argument, qui doit contenir deux virgules, et de passer #1comme

{<a>}{<b>}{<c>}

quand l'argument est <a>,<b>,<c>. Nous pouvons donc alimenter l'argument transformé à \MLONGcelui qui lit trois arguments standard.

3 Denis Oct 28 2020 at 15:52

Comme l'a dit Campa, vous devez toujours fournir un MWE

Pour le moment, jetez un œil à

\documentclass[12pt]{article}
    \usepackage[a4paper]{geometry}
    \usepackage{mathtools,amsfonts}
\newcommand{\M}[3]{\ensuremath{M(#1 \times #2, #3)}}
\begin{document}
\M{1}{2}{\mathbb{R}}
\end{document} 

donnant

comme prévu.

NickMatteo Oct 29 2020 at 08:33

Comme les autres réponses identifiées, le problème était que vous deviez écrire \M{2}{2}{R}pour utiliser votre macro dans le document.

Il est compréhensible que vous souhaitiez éviter de l'écrire de cette façon, car les accolades sont difficiles à taper. egreg a montré un moyen de réduire (mais pas d'éliminer) les accolades avec LaTeX moderne.

Si vous souhaitez utiliser une syntaxe similaire à celle que vous avez écrite dans le texte de votre question, une autre approche est l'ancienne définition de style TeX

\def\M(#1x#2,#3){M(#1 \times #2, \mathbb{#3})}

Ensuite, vous pouvez écrire \M(2x2,R)dans votre document.