Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Environnement-Retour à la ligne comme avec verbatim et nombre de lignes

308 views
Skip to first unread message

projetmbc

unread,
Apr 21, 2012, 8:38:53 AM4/21/12
to
Bonjour,
considérons l'environnement bidon suivant.

\begin{bidon}
Ligne 1
Ligne 2
Ligne 3
Ligne 4
Ligne 5
\end{bidon}

Est-il possible de connaître, à la fin de l'environnement, le nombre de lignes dans le code LaTeX ?

De plus est-il possible aussi d'avoir un retour à la ligne lors de la mise en forme sans avoir à sauter une ligne dans le code LaTeX

projetmbc

unread,
Apr 21, 2012, 8:57:02 AM4/21/12
to
> De plus est-il possible aussi d'avoir un retour à la ligne
> lors de la mise en forme sans avoir à sauter une ligne
> dans le code LaTeX ?

En fait, j'ai un début de solutions pour les retours à la ligne qui coupe les mots dès qu'il le faut (ceci me va très bien). Il reste à compter le nombre de lignes dans le code LaTeX.

J'aimerais aussi que le mises en forme soient prises en compte, ce que ne fait pas le début de solution ci-dessous.

===== UN DÉBUT DE CODE =====

\documentclass{article}
\usepackage{adjustbox}
\usepackage{color}

\makeatletter
\newsavebox{\breakableTextEnvBox}
\newenvironment{breakableTextEnv}{%
\begin{lrbox}{\breakableTextEnvBox}\ttfamily\minipage{8.5em}
\catcode`\#=12 \obeyspaces \obeylines
\begingroup\lccode`~=` \lowercase{\endgroup\def~}{\unskip\space}%
\begingroup\lccode`~=` \lowercase{\endgroup\let\brt@space~}%
\begingroup\lccode`~=`\^^M \lowercase{\endgroup\def~}{\ifvmode\else\endgraf\fi}%
\breakabletexttt@i%
}{%
\vspace{-\baselineskip}\endminipage\end{lrbox}\fbox{\usebox\breakableTextEnvBox}%
}

\long\def\breakabletexttt@i#1{%
\ifx#1\end
\expandafter\breakabletexttt@ii
\else
\ifx#1\brt@space
\unskip\space
\else
#1\hskip\z@ plus.2em
\fi
\expandafter\breakabletexttt@i
\fi%
}

\def\breakabletexttt@ii#1{%
\end{#1}%
\def\temp@{#1}\def\temp@@{breakableTextEnv}%
\ifx\temp@\temp@@\else
\expandafter\breakabletexttt@i
\fi%
}

% To test compatibilty with the similar inline command.
\newcommand\breakabletexttt{%
\begingroup
\catcode`\#=12
\@breakabletexttt
}
\newcommand\@breakabletexttt[1]{%
\ttfamily
\breakable@texttt#1\@nil%
\endgroup%
}
\def\@gobble@fi#1\fi{\fi#1}
\def\breakable@texttt#1#2\@nil{%
#1\hspace{0pt plus 0.1pt minus 0.1pt}%
\ifx\relax#2\relax
\else
\@gobble@fi\breakable@texttt#2\@nil
\fi
}
\makeatother


\begin{document}

\begin{breakableTextEnv}
12345678901 234567890123456789
\textbf{ggg}
12345678901234567890123456789
\end{breakableTextEnv}

\end{document}


Jean-Côme Charpentier

unread,
Apr 22, 2012, 9:29:48 AM4/22/12
to
Le 21/04/2012 14:57, projetmbc a écrit :
>> De plus est-il possible aussi d'avoir un retour à la ligne lors de
>> la mise en forme sans avoir à sauter une ligne dans le code LaTeX
>> ?
>
> En fait, j'ai un début de solutions pour les retours à la ligne qui
> coupe les mots dès qu'il le faut (ceci me va très bien). Il reste à
> compter le nombre de lignes dans le code LaTeX.
>
> J'aimerais aussi que le mises en forme soient prises en compte, ce
> que ne fait pas le début de solution ci-dessous.
>
> ===== UN DÉBUT DE CODE =====
>[couic code compliqué]

Il y a un fossé entre ce que peut potentiellement réaliser le code
proposé et les exigences demandées au départ. Il faudrait connaître
exactement ce qui est voulu. Pour l'instant je vois :
1. Saut à la ligne (dans le résultat je suppose, c'est-à-dire plutôt
fin de paragraphe en fait) lorsque le source présente un saut de ligne
sans ligne vide dans le source.
2. Compter les lignes du source.
3. Respecter tout ce que fait LaTeX sinon.

Pour le 1., \obeylines est une bonne piste. Elle rend le caractère de
fin de ligne (^^M) actif et en fait un équivalent de \par si on ne dit rien.
2. Il suffit de modifier la valeur du ^^M actif pour qu'en plus du
\par il incrémente un compteur.
3. Il n'y a rien à faire.

D'où le code :

\documentclass{article}

\begingroup
\obeylines
\gdef\activecr{%
\def^^M{%
\global\advance\numberline 1 %
\par %
}%
}%
\endgroup
\newcount\numberline
\newenvironment{breakableTextEnv}
{%
\global\numberline 0
\obeylines
\activecr
\minipage{5cm} %
}
{%
\endminipage %
\global\advance\numberline -1 %
Il y a eu \the\numberline{} lignes dans le source \par %
}
\begin{document}
\begin{breakableTextEnv}
123 456 78 901 234 56 78 9 012 3 456 789
\textbf{ggg}
123 456 789 012 345 678 901 234 567 89
\end{breakableTextEnv}
\end{document}

Il y a une petite complication avec le décompte des lignes puisque le
\begin{breakableTextEnv} compte lui-même pour une ligne. Je suppose
qu'on ne voulait pas compter cette ligne !

Jean-Côme Charpentier

--
<Jean-Côme> Maintenant, les commandes ne sont quand même pas fait au
petit bonheur, il y a une logique relativement rigoureuse,
<Joss> Soit on diffère sur le sens de rigoureux soit sur le sens de
relatif. Cependant, j'essaie de la retenir pour vendredi. La
logique rigoureuse de l'absence de rigueur. ;-)
-+- in fr.comp.text.tex -+-

projetmbc

unread,
Apr 22, 2012, 2:46:22 PM4/22/12
to
Merci pour ce code et ces explications. C'était d'une très grand clarté !

projetmbc

unread,
Apr 25, 2012, 3:51:42 AM4/25/12
to
Bonjour.

> Jean-Côme Charpentier a écrit :
>> Elle rend le caractère de fin de ligne (^^M)...

Que signifie ce code ^^M ? est-ce une code ASCII ?

projetmbc

unread,
Apr 25, 2012, 3:58:43 AM4/25/12
to
> Que signifie ce code ^^M ?

Le "est-ce une code ASCII ?" est en trop !!!

Jean-Côme Charpentier

unread,
Apr 25, 2012, 5:55:46 AM4/25/12
to
Le 25/04/2012 09:58, projetmbc a écrit :
>> Que signifie ce code ^^M ?
>
> Le "est-ce une code ASCII ?" est en trop !!!

À part le « une » à la place du « un » c'est pourtant pile poil cela.
La notation ^^ est expliquée dans plusieurs ouvrages (dont le
TeXbook). Le principe est de prendre le code du caractère qui suit et,
si celui-ci a lui-même un code entre 64 et 127, d'enlever 64. C'est
parti : code (ASCII) de M = 77 donc code de ^^M = 77 - 64 = 13. ^^M
correspond donc à ce que le code ASCII nomme CR.
Parmi les codes utiles, on a également ^^J qui indique le code 10
(caractère utilisé pour passer à la ligne au niveau des consoles). Par
exemple :
\message{^^JJe fais^^Jmumuse avec^^Jles codes ASCII^^J^^J}
On a également ^^I pour détecter un caractère TAB (en mode verbatim
sinon TeX le transforme en espace en première lecture. Peut-être ^^@
pour le code 0.
Si le code du caractère qui suit ^^ est situé entre 0 et 63, c'est le
contraire, TeX ajoute 64 au code. Par exemple ^^? est le caractère de
code 127 (normalement interdit).
À part les exemples ^^M et ^^J, utiles en soit, cette notation peut
servir à indiquer un caractère qui n'a pas de code ASCII visualisable.
Dans le TeXbook, le caractère virage dangereux était en position 127
dans la fonte manfnt. On peut le saisir avec un truc du genre
{\accesmanfnt ^^?} (en ayant changé le code de catégorie de ce
caractère). Cela dit, c'est un peu s'emmerder pour rien parce qu'ici,
\char127 fonctionnerait aussi bien.
En revanche, \message{\char10 coucou} va lamentablement merder. Je ne
rentre pas dans tous les détails techniques mais on peut plus facilement
comprendre que \def\char65bc{...} n'est pas du tout l'équivalent de
\def\Abc{...} même si \char65 correspond au « A ». Cela ne fonctionne
que pour afficher un caractère, pas pour utiliser une lettre dans un
syntaxe TeXienne. Inversement, les ^^ sont traités comme s'ils étaient
un seul caractère. Voir le paragraphe suivant.
Il y a enfin une dernière convention concernant la notation ^^. Si
les deux caractères qui suivent sont des chiffres hexadécimaux bas de
casse (de 0 à 9 et de a à f), TeX le traduit en une lettre de code
correspondant. Là, on a vraiment une lettre. Par exemple

\def\^^61^^62^^63{Hello}

définit vraiment la macro \abc et on peut vraiment l'utiliser soit sous
la forme \abc, soit sous la forme \^^61^^62^^63 (soit un mélange). Cela
peut servir si une touche du clavier (autre que 0-9 a-f) est cassée :-)

Jean-Côme Charpentier

--
Vous êtes incroyables !
On vous demande un truc et dans le quart d'heure vous apportez la solution.
-+- Sisyphe in fr.comp.text.tex -+-

projetmbc

unread,
Apr 25, 2012, 6:22:32 AM4/25/12
to
Toujours aussi limpides tes explications.

Merci pour ton réponse (j'ai des problèmes d'accord avec les pronoms aujourd'hui... :-) )
0 new messages