Dans le code suivant, si j'insère une espace avant ou après le nom de l'environnement center, ce dernier n'est plus reconnu.

Ouvrir dans l'éditeur Overleaf
\documentclass[11pt]{article}

\begin{document}
\begin{center }
! LaTeX Error: Environment center undefined.

\LaTeX est-il logique ?

\LaTeX{}est-il rationnel ?

 Est-ce que \LaTeX{} est de l'alchimie ?
\end{center }

\end{document}

Or, on sait que les espaces sont supprimés après les commandes. Dans le code ci-dessus, en omettant les accolades après la commande \LaTeX, les espaces suivants sont absorbés. C'est une règle de TeX.

On sait qu'avec TeX :

  • l'espace pour TeX est un caractère ayant un code de catégorie égal à 10,
  • les lettres qui composent les noms des commandes ont un code de catégorie égal à 11,
  • l'accolade ouvrante a un code de catégorie égal à 1
  • et l'accolade fermante a un code de catégorie égal à 2.

Pour TeX une commande, appelée séquence de contrôle, est :

  • soit un mot de contrôle commençant par un caractère ayant un code de catégorie 0 (l'antislash ou contre-oblique) et composé de lettres. Il se termine alors avec le premier caractère qui n'est pas une lettre (qui a un code de catégorie différent de 11) ;
  • soit un symbole de contrôle commençant de façon identique par l'antislash suivi d'un caractère qui n'est pas une lettre.

Ainsi, puisque dans un environnement LaTeX les espaces ne sont pas « mangés » par TeX, j'en déduis qu'un environnement peut avoir un nom composé de plusieurs mots comme par exemple :

Ouvrir dans l'éditeur Overleaf
\begin{bidule truc} ... \end{bidule truc}

Le code suivant l'illustre :

Ouvrir dans l'éditeur Overleaf
\documentclass[11pt]{article}

\newenvironment{bidule truc}{%
\itshape
}{%
  % Rien
}
\begin{document}

\begin{bidule   truc}
autant d'espace entre bidule et truc sans avoir une seule erreur !

Mais après ou avant le nom : erreur !
\end{bidule         truc}

\end{document}

Edit ce même jour à 11 h 00, ajout d'un deuxième exemple montrant que l'on peut définir un environnement dont le nom commence par une espace (ou par plusieurs) :

Ouvrir dans l'éditeur Overleaf
\documentclass[11pt]{article}

\newenvironment{   bidule truc}{% 3 espaces avant le premier mot
  \itshape
}{%
  % Rien
}
\begin{document}

\begin{ bidule   truc}% 1 seul espace avant le premier mot sans erreur !
autant d'espace avant bidule sans avoir une seule erreur !

Mais apr\`es le nom : erreur !
\end{bidule         truc}% erreur, il manque le premier espace

\end{document}

Et j'en conclus donc que le nom des environnements LaTeX n'obéit pas aux même règles que le nom des commandes TeX.

  • quelles sont les règles auxquelles sont soumis les noms d'environnement de LaTeX ?
  • autrement dit, quels sont les caractères autorisés dans le nom des environnements LaTeX ?

Posée 23 Aoû '17, 09:17

Andr%C3%A9C's gravatar image

AndréC
611224
Taux d'acceptation : 25%

Modifiée 26 Aoû '17, 02:57

Pathe's gravatar image

Pathe ♦♦
5.4k158152

TeX mange les espace dans la sortie et pas dans l'entrée.

(23 Aoû '17, 12:57) touhami touhami's gravatar image

@touhami, pas uniquement, dans l'exemple de l'environnement bidule truc ci-dessus, lorsque j'entre \begin{bidule...truc} où les trois points sont des espaces, en entrée, il y a bien 3 espaces.

Ils sont bien mangés puisque reconnu comme étant le nom correct de l'environnement !

Édit 11h : ajout d'un deuxième exemple dans la question

(23 Aoû '17, 13:16) AndréC Andr%C3%A9C's gravatar image

@AndréC ce que je veux dire est que l'exemple de \LaTeX bla bla est autre chose.

(23 Aoû '17, 13:27) touhami touhami's gravatar image

des espaces consécutives sont considérées comme une.

(23 Aoû '17, 13:30) touhami touhami's gravatar image
1

Voici l'idée derrière un environnement : \newenvironment{ foo bar } est équivalente (en quelque sorte) à \expandafter\newcommand\csname foo bar \endcsname et \begin{ foo bar } équivalente à \csname foo bar \endcsname bla bla. Voir par exemple

\documentclass[11pt]{article}

\begin{document}

\expandafter\newcommand\csname foo bar \endcsname{bon jour}

\csname foo bar\endcsname bla bla

\end{document}

(23 Aoû '17, 13:39) touhami touhami's gravatar image

@touhami, Pouvez-vous expliquer les commandes \expandafter , \csname et \endcsname ?

(23 Aoû '17, 13:41) AndréC Andr%C3%A9C's gravatar image

@AndréC Voulez vous poser un nouvelle question, ou dois je ajouter une petite réponse?

(24 Aoû '17, 12:43) touhami touhami's gravatar image

Le mieux il me semble est de poser une nouvelle question, car elle n'a rien à voir avec la question originelle. @touhami ça vous laissera plus de marge pour votre réponse que dans un commentaire ;)

(24 Aoû '17, 12:51) Nikopol Nikopol's gravatar image

@touhami, ce qui m'intéresse est d'avoir une réponse qui s'adresse au maximum de personnes et essentiellement à ceux qui débutent l'apprentissage de la programmation TeX et LaTeX pour lesquels il n'y a aucune évidence et où tout doit être expliqué le plus simplement possible.

Mais je n'exige rien car les réponses pédagogiques (les plus faciles à comprendre) sont les plus difficiles à écrire.

(24 Aoû '17, 15:26) AndréC Andr%C3%A9C's gravatar image

@touhami effectivement c'est amusant comme exemple mais pour le premier je dirais logique puisque \empty ne renvoie pas une chaine de caractères puisque vide, d'où l'erreur.

(24 Aoû '17, 21:53) Nikopol Nikopol's gravatar image
1

@AndréC, je ne vois pas ce que vous voulez dire par "TeX et LaTeX ne gère pas les espaces de la même façon". \csname est une primitive de TeX. A votre question initiale une réponse à été donnée (que vous devriez valider). Maintenant si vous voulez une explication à \csname poser une nouvelle question car ça ne correspond pas à la question originelle. Où mieux lisez le Texbook, vous semblez vouloir vous intéresser aux rouages de TeX, c'est donc à mon avis indispensable.

(24 Aoû '17, 23:42) Nikopol Nikopol's gravatar image
Affichage de 5 parmi 11 Afficher 6 commentaire(s) en plus

Pour définir le nom d'un environnement, on peux utiliser pratiquement tous les caracteres que l'on souhaite (j'y reviendrais) y compris l'espace. dans l'exemple \begin{center } vous obtenez une erreur ce qui est parfaitement logique puisque l'environnement center est nommé sans le token espace.

Votre deuxième exemple :

Ouvrir dans l'éditeur Overleaf
\documentclass[11pt]{article}

    \newenvironment{bidule truc}{%
    \itshape
    }{%
      % Rien
    }
    \begin{document}

    \begin{bidule   truc}
    autant d'espace entre bidule et truc sans avoir une seule erreur !

    Mais apr\`es ou avant le nom : erreur !
    \end{bidule         truc}

    \end{document}

vous définissez le nom avec un espace entre bidule et truc. pour bidule....truc pas de soucis avec ça, TeX va avaler les espaces en trop comme à son habitude. Mais pour la même raison que précédemment vous ne pouvez pas mettre d'espace avant ou après car cela ne correspond pas à la définition que vous en avez faite au départ. Si pour une raison quelconque il vous faut plusieurs espaces successifs dans le nom de l'environnement, rajoutez \expandafter\obeyspaces avant la définition de l'environnement.

Ouvrir dans l'éditeur Overleaf
quelles sont les règles auxquelles sont soumis les noms d'environnement de LaTeX ?
autrement dit, quels sont les caractères autorisés dans le nom des environnements LaTeX ?

Comme l'a dit @touhami les noms des environnements sont définis à coup de \expandafter\csname...\endcsname (voir dans le fichier latex.ltx de votre distribution.) Ainsi pratiquement tous les caractères (y compris les chiffres) sont autorisés dans le nom d'un environnement excepté les restrictions suivantes:

  • #, on comprend aisément pourquoi;
  • \ est aussi accepté à condition qu'il soit suivi d'une macro définie et ayant pour texte de remplacement une chaine de caractères (voir exemple);
  • les caractères de ponctuation tel que ; sont acceptés à condition de na pas charger babel qui les rend actifs;
  • { l'est aussi à condition que qu'elle soit accompagnée de son homologue fermante;
  • % n'est pas accepté puisqu'il met en commentaire tous ce qu'il y a derrière lui. Il faudrait lui changer son catcode (\catcode%=11`) mais ce n'est pas conseillé;
  • le tilde n'est pas accepté non plus, en effet il est redéfini par LaTeX (\def~{\nobreakspace{}}). Ce n'est donc plus un caractère mais une macro qui n'a pas une chaine de caractères comme texte de remplacement.

Voici un exemple :

Ouvrir dans l'éditeur Overleaf
\documentclass{article}
\def\truc{bidule}
\newenvironment{&@^_z{}\truc}{\bf}{}

\newenvironment{^^61^^62^^63}{\itshape}{}
\begin{document}
\begin{&@^_z{}\truc}
bidule
\end{&@^_z{}\truc}

\begin{&@^_z{}bidule}
en remplacant \verb+\truc+\ par bidule
\end{&@^_z{}bidule}

\begin{abc}
une autre facon
\end{abc}
\end{document}

Et j'en conclus donc que le nom des environnements LaTeX n'obéit pas aux même règles que le nom des commandes TeX.

Pour les commandes, c'est un peu plus compliqué, regardez ce code.

Ouvrir dans l'éditeur Overleaf
\documentclass{article}
\def\ toto#1{\it#1}
\begin{document}
%\show
\ toto{tutu}
\end{document}

et le résultat de \show:

Ouvrir dans l'éditeur Overleaf
> \ =macro:                                                                            toto#1->\it #1.

On vient de définir c'est à dire la macro "espace" qui prend un argument qui sera développé si il y a "toto" devant. Même si à priori cette commande à l'air de "fonctionner", elle pose des problèmes :

  • on peut en définir qu'une car sinon on redéfini différemment (donc TeX va couïner, voir plus);
  • ne peux plus être utilisé dans le texte. Par exemple \LaTeX\ blabla ne fonctionnerait plus.

Autre exemple :

Ouvrir dans l'éditeur Overleaf
\documentclass{article}
\def\ta ta#1{\bf#1}
\begin{document}
%\show
\ta ta{titi}
\end{document}

dans ce cas on définit une macro \ta qui prend un argument qui ne sera développé que si "ta" se trouve devant lui. Je ne vois pas, à priori, de restriction, mais je ne vois pas l'intérêt non plus.Pour l'espace en dernière position, aucun problème, TeX n'en tient pas compte.

Lien permanent

Publiée 23 Aoû '17, 14:15

Nikopol's gravatar image

Nikopol
91513
Taux d'acceptation : 42%

Modifiée 24 Aoû '17, 18:04

1) \ est aussi accepté à condition qu'il soit suivi d'une macro qui se développe en caractères 2) { n'a pas besoin d'être accompagnée de } (et vice versa) sauf s'il entre dans la syntaxe d'une commande 3) % n'est pas autorisé (mais peut-être tapez !) et ~ aussi n'est pas autorisé.

(23 Aoû '17, 21:02) touhami touhami's gravatar image

pour le 1 effectivement j'aurais du préciser, même si je trouve ça évident. pour le 2 je ne suis pas d'accord \documentclass{article} \newenvironment{{}toto}{\bf}{} \begin{document} \begin{{}toto} bidule \end{{}toto} \end{document} compile alors que \documentclass{article} \newenvironment{}toto}{\bf}{} \begin{document} \begin{}toto} bidule \end{}toto} \end{document} renvoie une erreur(forcement)

3) oui j'ai pas testé % ça ne passe pas, il faudrait changer son catcode mais pas grand intérêt. Le tilde je l'ai vu après mais je ne l'explique pas. Pas eu le temps d'allez voir sa définition.

(23 Aoû '17, 21:52) Nikopol Nikopol's gravatar image
1

Désolé, c'est ma faute, j'ai considéré le cas général de \csname ...\endcsname alors qu'il s'agit des noms des environnements.

(24 Aoû '17, 00:04) touhami touhami's gravatar image

Pas de soucis, on commet tous des erreurs, je n'ai pas poussé mes tests assez loin comme le % ou ~. Donc, j’éditerai ma question en fonction de vos commentaires.

(24 Aoû '17, 00:27) Nikopol Nikopol's gravatar image

Le tilde est redéfini par LaTeX : \def~{\nobreakspace{}} (l1302 latex.ltx) Ce n'est donc plus un caractère mais une macro.

(24 Aoû '17, 13:30) Nikopol Nikopol's gravatar image

Séquences de contrôles aka commandes

Une commande (ou séquence de contrôle) peut prendre deux formes

  • \cmd : caractère d'échappement \ + nom de la commande cmd

  • \csname cmd\endcsname : commande \csname + nome de la commande cmd

Dans la première forme le nom de la commande (i.e. cmd) peut être, soit 1) une chaîne des caractères lettres (de code de catégorie 11). Ex. \usepackage, \tableofcontents, \thepage, soit 2) une seule caractère non lettre. Ex. \;, \%, \\.

Dans la deuxième forme le nom de la commande est une chaîne de caractères quelconques, à quelques exceptions qu'on verra plus tard. Ex. \csname thepage\endcsname, \csname ^\endcsname

\csname ...\endcsname

Cette commande est en quelque sorte la fonction réciproque de \string. En effet \string\cmd transforme la commande \cmd en chaîne des caractères \, c, m et d, et \csname cmd\endcsname transforme la chaîne des caractères c, m et d en une commande \cmd.

Cette commande (primitive) est là pour créer et utiliser des commandes qui ne sont pas facilement accessibles par l'utilisateur, par exemple la gestion des compteurs : avec la commande \newcounter{ctr} LaTeX va créer un compteur \c@ctr et en même temps définir la commande \thectr qui permet l'affichage de la valeur de ce compteur. Un deuxième exemple est le système des références croisées. En effet, avec la commande \label{foo} LaTeX va définir une commande \r@foo où il stocke le numéro de l'objet et le numéro de la page.

Lorsque TeX rencontre \csname il développe au maximum le texte entre \csname et \endcsname correspondante. À l'issue de cet opération, si le résultat est une chaîne des caractères alors \csname ...\endcsname est comme une commande \[chaîne des caractères], si le résultat contient des primitives alors, TeX affiche une message d'erreur.

Remarque Il est important de savoir que lorsque \csname ...\endcsname se développe en une commande \[chaîne des caractères] et si la commande \[chaîne des caractères] n'est pas définie TeX définira \csname ...\endcsname et \[chaîne des caractères] comme \relax.

Remarques

  • Tout le texte qui suit % sur le même ligne est ignoré, donc \csname avant % apres \endcsname renvoie une message d'erreur, alors que \csname avant%... apres\endcsname =\csname avantapres\endcsname est valide.

  • les caractères de code de catégorie 15 ne sont pas autorisées.

  • le caractère ~ est active donc il se traite comme une commande. Or (cette commande) ne se développe pas en caractère donc ne peut pas être utilisé, toutefois on peut lui ajouter le préfixe \string.

Exemples

  • \csname abc d\thepage\endcsname : ici TeX développe abc d\thepage en abc d[n][n] est le numéro de la page. On peut remarquer que c'est la même chose que \csname abc d\thepage\endcsname ou \csname abc d[n]\endcsname

  • \csname table\empty of\empty contents\endcsname : table\empty of\empty contents se développe en table[]of[]contents--->tableofcontents donc \csname table\empty of\empty contents\endcsname = \csname tableofcontents\endcsname = \tableofcontents (les espace après la commande \empty sont absorbées.

  • \csname the% texnique.fr 2017/08/25 page\endcsname : le te texte the% texnique.fr 2017/08/25 page est développé par TeX en thepage donc \csname the% texnique.fr 2017/08/25 page\endcsname = \csname thepage\endcsname = \thepage.

ECM 1

Ouvrir dans l'éditeur Overleaf
\documentclass{article}

\newcommand{\foo}{\textbf{bla bla}}
\newcommand{\F}{f}
\newcommand{\f}{\F}
\renewcommand{\o}{o}

\begin{document}
\foo=\csname \F \o  o\endcsname=\csname \f \o  o\endcsname
\end{document}

ici \f se développe en \F puis en f donc \F \o o et \f \o o sont développées en foo.

ECM 2

Ouvrir dans l'éditeur Overleaf
\documentclass{article}
\newcommand{\foo}{bla bla}
\newcommand{\f}{foo\empty}
\newcommand{\F}{foo\relax}

\begin{document}
\f=\F

\foo=\csname foo\endcsname=\csname \f\endcsname

mais % décommenter la ligne suivante
%\csname f\F\endcsname
\end{document}

ici \F se développe en foo\relax et \relax n'est pas développable donc le résultat final de développement n'est pas une chaîne des caractères, d'où le message d'erreur.

Définitions

Pour définir une commande sous la deuxième forme, i.e. avec une chaîne des caractères non lettres on peut par exemple utiliser

  • \expandafter\newcommand\csname cmd\endcsname{texte de remplacement} pour définir une commande à la manière de LaTeX \newcommand{\foo}{texte de remplacement} ou

  • \expandafter\def\csname cmd\endcsname{texte de remplacement} pour définir une commande à la manière de TeX \def\foo{texte de remplacement} ou

  • \expandafter\let\csname cmd\endcsname\autrecmd pour définir une commande à la manière de TeX en lui donnant le sens d'une commande déjà définie \let\foo\autrecmd

Remarque LaTeX a défini Les commandes suivantes :

  • \def\@namedef#1{\expandafter\def\csname #1\endcsname} donc on peut taper \makeatletter \@namedef{foo <bla&}{texte de remplacement}\makeatother pour définir une commande (\foo <bla&).

  • \def\@nameuse#1{\csname #1\endcsname} il suffit donc de taper \makeatletter \@nameuse{foo <bla&}\makeatother pour utiliser la commande (\foo <bla&).

\expandafter

\expandafter est une primitive de TeX. Lorsque TeX rencontre \expandafter\cmd1\cmd2 il commence par développer \cmd2 puis recommence en mettant \cmd1 avant le (ou au début de) développement de \cmd2. i.e. \expandafter\cmd1\cmd2 = \cmd1[le développement de \cmd2].

Exemple

Ouvrir dans l'éditeur Overleaf
\documentclass{article}
\newcommand{\foo}{foo}

\begin{document}
\textbf\foo=\textbf{\foo}=\textbf{foo}

\expandafter\textbf\foo = \textbf foo
\end{document}

Les environnements de LaTeX

  • \newenvironment{foo}{bon jour}{au revoir} est en quelque sorte équivalente à

\expandafter\newcommand\csname foo\endcsname{bon jour} et \expandafter\newcommand\csname endfoo\endcsname{au revoir}

  • \begin{foo} est équivalente à \begingroup\csname foo\endcsname

  • \end{foo} est équivalente à \csname endfoo\endcsname\endgroup

(ici l'équivalence est au sens de la fonction indispensable)

Les règles appliquées aux noms des environnements sont celles de la deuxième type des commandes plus quelques exceptions supplémentaires.

Lien permanent

Publiée 25 Aoû '17, 21:47

touhami's gravatar image

touhami
6.1k27
Taux d'acceptation : 56%

Modifiée 26 Aoû '17, 13:18

@touhami, beau travail. Je pense que cette réponse mériterais une question spécifique, elle répond à une demande ultérieure du PO mais ne correspond pas à la question originelle. Il faudrait ouvrir une question et que vous copiez votre réponse. Si vous êtes d'accord, je peux poser la question et vous laissez répondre.

(25 Aoû '17, 22:42) Nikopol Nikopol's gravatar image

@Nikopol merci, ce serait mieux si c'est @AndréC qui pose la question.

(26 Aoû '17, 11:32) touhami touhami'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.

Mots-clés de la question :

×23
×4
×4
×4

Question posée : 23 Aoû '17, 09:17

Question vue : 2,812 fois

Dernière mise à jour : 26 Aoû '17, 13:18