Pourquoi \ renewcommand erreur si la commande n'existe pas?
J'utilise le même préambule dans plusieurs projets. L'ensemble des commandes déjà définies est différent selon les environnements. Dans un projet, \epsest déjà défini, alors que dans un autre, ce n'est pas le cas. Je souhaite définir \epscomme \varepsilon.
Le manuel de référence non officiel de Latex2e dit:
Si vous essayez de définir une commande et que le nom a déjà été utilisé, vous obtenez quelque chose comme
<error>. Si vous essayez de redéfinir une commande et que le nom n'a pas encore été utilisé, vous obtenez quelque chose comme<different error>.
Par conséquent, aucun des deux ne peut être utilisé dans ma situation. Je peux contourner le problème comme ceci:
\ifdefined\eps
\renewcommand{\eps}{\varepsilon}
\else
\newcommand{\eps}{\varepsilon}
\fi
mais c'est assez maladroit. Je ne comprends pas pourquoi \renewcommanddevrait se plaindre si la commande n'existe pas déjà. Dans tous les cas, nous fournissons la définition souhaitée de la commande.
Réponses
Il est difficile de répondre aux questions «Pourquoi». Dans ce cas, la réponse est "Parce que Leslie Lamport a choisi cette définition au début des années 80".
Cependant, si vous \renewcommandagissez comme vous le suggérez, cela équivaudrait à \newcommandne pas vérifier la commande définie du tout. Cela annulerait une grande partie de la raison pour \newcommandlaquelle cela est de protéger l'utilisateur contre la redéfinition accidentelle des composants internes en latex et la rupture du système.
Comme Steven le commente sous votre question, le comportement serait alors comme la primitive TeX \defqui définit toujours (ou redéfinit) la commande fournie. Même maintenant, vous voyez souvent des utilisateurs utiliser \defdans des documents latex et écraser des commandes internes.
L'idée est que vous utilisez \newcommandet soyez averti si quelque chose est sur le point de mal tourner, et seulement si vous savez que c'est correct de le faire, utilisez \renewcommandpour les redéfinitions.
Vous pouvez définir votre commande plus simplement comme
\def\zzcommand#1{\let#1\undefined\newcommand#1}
qui définit d'abord la commande pour qu'elle \newcommandréussisse toujours, mais ensuite essayez
\zzcommand\box{\fbox{X}}
par exemple.
Si dans l'un des environnements \epsa déjà été défini pour donner l'une des formes d'epsilon, il vous suffit de faire
\providecommand{\eps}{\varepsilon}
\renewcommand{\epsilon}{\varepsilon}
et l'utilisation de \epsproduira \varepsilondans les deux environnements.
Si \epsest défini pour faire autre chose, alors vous êtes condamné.
Pourquoi \renewcommandrechigne- t-il s'il est alimenté par une commande non définie? Car \renewcommanddoit être utilisé avec précaution et en sachant ce que l'on fait.
Ceci est un exemple simple de la réponse de Leo Liu ici .
\providecommandne redéfinit la commande que \foosi cette commande n'a pas été préalablement définie.
Si \newcommanddéfinit \foo, alors \providecommandsera silencieux.
Avec \providecommand, il existera toujours un \foodevenir à mehtravers \renewcommand.
Je ne sais pas si c'est la réponse la plus élégante, mais elle est très simple et claire.
\documentclass{article}
% (un)comment to change \providecommand behavior
\newcommand{\foo}{foo}
% if {\foo} not defined, then {\foo} is ``bla''
\providecommand{\foo}{bla}
% {\foo} will always become ``meh''
\renewcommand{\foo}{meh}
\begin{document}
{\foo}
\end{document}