Boîte autour d'un bloc verbatim

Tout ce qui concerne le langage LaTeX et ses variantes. Ce langage est supporté sur le forum via les balises tex.

Modérateur : gdm_tex

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.
pzorba75
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 201
Inscription : mardi 20 août 2013, 04:50
Localisation : Paris

[Résolu] Boîte autour d'un bloc verbatim

Message par pzorba75 »

Bonjour à tous,
je cherche à encadrer un bloc verbatim, j'ai essayé fbox{ } et j'ai une erreur de compilation, alors que sans bloc verbatim tout se passe bien.
Quelle est la méthode pour tracer un cadre autour d'un bloc verbatim en ajustant la largeur du cadre?
Je mets le bloc à encadrer :

Code : Tout sélectionner

\begin{verbatim}
                 Algorithme
Pour tout i entre 0 et k-2, on compare
L[i] et L[i+1] :
- si L[i]<)L[i+1], on ne fait rien
- si L[i]>L[i+1], on échange L[i]
  et L[i+1]
\end{verbatim}
Merci de l'aide apportée.
Pierre
Dernière modification par pzorba75 le mercredi 16 octobre 2019, 19:25, modifié 1 fois.
On se lasse de tout, excepté d'apprendre.
Virgile

evariste_G
Utilisateur chevronné
Utilisateur chevronné
Messages : 1448
Inscription : vendredi 19 décembre 2008, 19:13
Localisation : Bordeaux

Re: Boîte autour d'un bloc verbatim

Message par evariste_G »

Une recherche sur ton moteur préféré peut te conduire à l'environnement boxedverbatim:

Code : Tout sélectionner

\documentclass{article}
\usepackage{moreverb}
\begin{document}
\begin{boxedverbatim}
                 Algorithme
Pour tout i entre 0 et k-2, on compare
L[i] et L[i+1] :
- si L[i]<)L[i+1], on ne fait rien
- si L[i]>L[i+1], on échange L[i]
  et L[i+1]
\end{boxedverbatim}
\end{document}  
Capture.PNG
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Mathématiques, LaTeX et Python : http://www.mathweb.fr

un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 792
Inscription : vendredi 12 juin 2009, 22:35
Localisation : Chambéry

Re: Boîte autour d'un bloc verbatim

Message par un bon petit »

evariste_G a écrit :Une recherche sur ton moteur préféré peut te conduire à l'environnement boxedverbatim
Certes, mais le coder est très simple et bien plus amusant :

Code : Tout sélectionner

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\makeatletter
\def\verbbox{\expandafter\verbbox@a\string}
\def\verbbox@a#1{%
	\def\verbbox@b##1#1{%
		\fbox{\vtop{\hbox\bgroup##1\egroup}}%
		\endgroup
		}%
	\begingroup
		\let\do\@makeother\dospecials
		\def\par{\egroup\hbox\bgroup}%
		\obeylines\obeyspaces
		\verbatim@font\@noligs
		\verbbox@b
}
\makeatother
\begin{document}
Mon algo : \verbbox|                 Algorithme
Pour tout i entre 0 et k-2, on compare
L[i] et L[i+1] :
- si L[i]<)L[i+1], on ne fait rien
- si L[i]>L[i+1], on échange L[i]
  et L[i+1]| est tout beau
\end{document}
fboxverb.png
@balf, @pg, @denisBitouzé : avant que je ne fasse une bêtise de plus aujourd'hui et que je ne fasse remonter un bug qui n'en est pas un : vous confirmez qu'il y a un bug dans le noyau latex dans la macro \do@noligs ???
Selon moi, il manque un \relax (ou un espace) après la définition du caractère actif pour stopper la lecture du nombre `#1. Ainsi, la ligne 4499 qui est

Code : Tout sélectionner

\lowercase{\endgroup\def~{\leavevmode\kern\z@\char`#1}}}
devrait être

Code : Tout sélectionner

 \lowercase{\endgroup\def~{\leavevmode\kern\z@\char`#1\relax}}}
Ce bug explique pourquoi les espaces sont mangés après les tirets dans mon exemple.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.

pzorba75
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 201
Inscription : mardi 20 août 2013, 04:50
Localisation : Paris

Re: Boîte autour d'un bloc verbatim

Message par pzorba75 »

C'est exactement ce que je cherchais, mais google m'avait conduit dans une multitude pages sur les commandes mbox, makebox, frbox...qui ne conviennent pas dès qu'il y a un bloc verbatim à l'intérieur.
Merci beaucoup pour cette réponse très complète.
Pierre
On se lasse de tout, excepté d'apprendre.
Virgile

pg
Modérateur
Modérateur
Messages : 2600
Inscription : vendredi 15 juin 2007, 00:31

Re: Boîte autour d'un bloc verbatim

Message par pg »

un bon petit a écrit : @balf, @pg, @denisBitouzé : avant que je ne fasse une bêtise de plus aujourd'hui et que je ne fasse remonter un bug qui n'en est pas un : vous confirmez qu'il y a un bug dans le noyau latex dans la macro \do@noligs ???
Selon moi, il manque un \relax (ou un espace) après la définition du caractère actif pour stopper la lecture du nombre `#1. Ainsi, la ligne 4499 qui est

Code : Tout sélectionner

\lowercase{\endgroup\def~{\leavevmode\kern\z@\char`#1}}}
devrait être

Code : Tout sélectionner

 \lowercase{\endgroup\def~{\leavevmode\kern\z@\char`#1\relax}}}
Ce bug explique pourquoi les espaces sont mangés après les tirets dans mon exemple.
Il manque aussi les espaces entre les virgules et les trois "on". Les commandes de type verbatim utilisent \@vobeyspaces pour résoudre le problème.

un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 792
Inscription : vendredi 12 juin 2009, 22:35
Localisation : Chambéry

Re: Boîte autour d'un bloc verbatim

Message par un bon petit »

pg a écrit :Les commandes de type verbatim utilisent \@vobeyspaces pour résoudre le problème.
Je sais bien que rendre l'espace actif \let-égal à \@xobeysp résout le problème évite que le problème ne survienne.

Mais si un utilisateur trop confiant (comme moi) souhaite désactiver les ligatures en police à chasse fixe, il obtient un résultat où les espaces après les caractères « , », « > », « < », « ` », « ' » et « - » sont mangés, ce qui n'est pas le comportement attendu comme on peut le constater sur cet ECM :

Code : Tout sélectionner

\documentclass{article}
\makeatletter
\newenvironment{ttnolig}{\ttfamily\@noligs}{}
\makeatother
\begin{document}
Un essai \begin{ttnolig}1, 2 - 3 - et 4\end{ttnolig}.
\end{document}
Je persiste donc à dire qu'il y a bien une erreur dans la macro \do@noligs :mrgreen:

pg
Modérateur
Modérateur
Messages : 2600
Inscription : vendredi 15 juin 2007, 00:31

Re: [Résolu] Boîte autour d'un bloc verbatim

Message par pg »

Je suis arrivé à la même conclusion, mais ce que je suggérais implicitement est que je ne suis pas sûr que \@noligs soit prévu pour être utilisé sans rendre les espaces actifs auquel cas on ne peut pas vraiment parler de bug.

un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 792
Inscription : vendredi 12 juin 2009, 22:35
Localisation : Chambéry

Re: [Résolu] Boîte autour d'un bloc verbatim

Message par un bon petit »

pg a écrit :Je suis arrivé à la même conclusion, mais ce que je suggérais implicitement est que je ne suis pas sûr que \@noligs soit prévu pour être utilisé sans rendre les espaces actifs auquel cas on ne peut pas vraiment parler de bug.
Il faut que l'espace soit actif ET que son développement ne commence pas par un espace. Ça fait un peu beaucoup, je trouve...
D'ailleurs, si on rend l'espace actif avec \obeyspaces ( ce qui renvient à faire \let<espace>=\space) comme je l'avais innocemment fait, on est confronté au "bug".

Ensuite quand je vois sur la documentation de source2e, en haut de la page 291 ceci :
To stay compatible with packages that use \@noligs we keep it.
ce qui suggère que cette macro est utilisée uniquement dans des packages extérieurs au noyau (ce qui est faux en plus, puisque latex l'utilise plusieurs fois), je me demande bien que faire car les auteurs des packages vont subir le "bug" puisqu'il n'est précisé nulle part comment l'éviter. Je crois que je vais quand même poster une « issue » sur github, d'autant que le "bug" est ultra-facile à corriger.