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
61121124
Taux d'acceptation : 25%

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

Pathe's gravatar image

Pathe ♦♦
7.5k42204251

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 8 Afficher 3 commentaire(s) en plus

  • quelles sont les règles auxquelles sont soumis les noms d'environnement de LaTeX  ?

Les règles sont les mêmes. Par exemple, deux espaces consécutifs ou plus sont considérés comme un seul espace.

ECM

Ouvrir dans l'éditeur Overleaf
\documentclass[french]{article}         
\usepackage{lmodern}                
\usepackage[T1]{fontenc}                                
\usepackage{babel}

\newenvironment{ foo bar }{\bfseries}{\vspace{1cm}\hrule\vspace{1cm}}

\begin{document}
Exemple 1
\begin{ foo bar }
Foo bar texte 
\end{ foo bar }

Exemple 2
\begin{    foo bar }
Foo bar texte 
\end{ foo bar }

Exemple 3
\begin{   foo   bar }
Foo bar texte 
\end{ foo bar    }

Exemple 4
\begin{ foo    bar    }
Foo bar texte 
\end{   foo bar }
\end{document}
  • quels sont les caractères autorisés dans le nom des environnements LaTeX  ?

C'est difficile de donner une réponse complète. En effet, les environnements LaTeX utilisent, derrière la scène, la primitive \csname \endcsname, donc on peut utiliser une large classe des caractères, mais ça n'arrête pas là, il y a d'autres facteurs.

Lien permanent

Publiée 10 Aoû '19, 14:35

touhami's gravatar image

touhami
9.7k410
Taux d'acceptation : 51%

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
1.0k614
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
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.