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

Numérotation des (de tous les) paragraphes : « robustifier » les \everypar, mais pas trop

68 views
Skip to first unread message

Denis Bitouzé

unread,
Feb 4, 2012, 11:04:28 AM2/4/12
to
Bonjour,

pour répondre à une doctorante en droit, qui a pour consigne que /tous/
les paragraphes (au sens \par, pas au sens \paragraph) de sa thèse
soient numérotés, je suis allé glaner ici et là quelques solutions.
Toutes reposent, bien sûr, sur le principe qu'un compteur est
incrémenté et affiché ; cette action peut être provoquée :

1. manuellement au moyen d'une (même) commande insérée, à chaque
début de paragraphe (lourd) ;

2. semi-automatiquement au moyen d'un (même) environnement appliqué
aux zones où les paragraphes doivent être numérotés, en évitant par
exemple les \section (dont la définition comporte des \par) mais qui
ne doivent pas être sur-numérotées (mi-lourd) ;

3. automatiquement à chaque début de nouveau paragraphe (léger).

Les solutions de ce dernier type sont donc les plus commodes mais aussi
les moins robustes : elles reposent en effet sur l'ajout d'ordres à
l'unité lexicale (?) \everypar mais celle-ci est fréquemment employée
et donc réinitialisée au cours d'un document par toutes sortes de
macros (par les \section notamment).

Par exemple, la solution fournie ici même par GL :

https://groups.google.com/group/fr.comp.text.tex/msg/62436f5f236aeae3?hl=fr

fonctionne très bien mais nécessite de redéfinir /toutes/ les commandes
de structuration (\chapter, \section, etc.), ainsi que d'autres objets,
les listes par exemple.

Or, j'ai vu qu'il y avait moyen, pour ne pas devoir redéfinir \everypar
à chaque fois qu'il est utilisé par autre chose, de « robustifier » les
\everypar au moyen de :

\everypar\expandafter{\the\everypar...}

ce qui m'a conduit à :

http://www.tex.ac.uk/cgi-bin/texfaq2html?label=subverttoks

et enfin à l'ECM suivant :

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{lipsum}
% ---------------------------------------------
\makeatletter
\newcounter{nopar}
\let\mypkg@@everypar\everypar
\newtoks\mypkg@everypar
\mypkg@everypar\expandafter{\the\everypar}
\mypkg@@everypar{\mypkgs@ownstuff\the\mypkg@everypar}
\def\mypkgs@ownstuff{%
\stepcounter{nopar}\textbf{\the\value{nopar}}.
}
\let\everypar\mypkg@everypar
\makeatother
% ---------------------------------------------
\begin{document}
\section{Bla}
\lipsum[1-4]
\begin{itemize}
\item Bli
\item Blo
\end{itemize}
\lipsum[5-9]
\section{Ble}
\lipsum[1-4]
\begin{itemize}
\item Bli
\item Blo
\end{itemize}
\lipsum[5-9]
\end{document}

L'inconvénient est que, cette fois, les titres de \chapter, de \section,
etc., les listes, etc. sont (sur-)numérotés.

Si on souhaite employer, parmi les 3 types de solutions indiqués
ci-dessus, celui qui est « automatique », on se trouve donc face au
dilemme suivant :

1. soit on ne « robustifie » pas les \everypar, mais on est
alors obligé de redéfinir tous les objets les utilisant qui vont être
employés dans le document (sans compter que certains packages
risquent de peut-être troubler cela) ;

2. soit on « robustifie » les \everypar (comme dans l'ECM ci-dessus),
mais alors on est obligé de spécifier, si cela est toutefois
possible, les objets qui ne doivent pas être concernés par la
redéfinition de \everypar.

La seconde alternative me semblant plus facile à mettre en oeuvre, ma
question est donc la suivante : y a-t-il moyen, dans l'ECM ci-dessus,
d'indiquer que la redéfinition de \everypar ne doit /pas/ concerner les
\chapter, les \section, etc., les listes, etc.

Merci d'avance.
--
Denis

Damien Wyart

unread,
Feb 5, 2012, 6:05:13 AM2/5/12
to
* Denis Bitouzé <dbito...@spam.wanadoo.fr> in fr.comp.text.tex:
> pour répondre à une doctorante en droit, qui a pour consigne que
> /tous/ les paragraphes (au sens \par, pas au sens \paragraph) de sa
> thèse soient numérotés, je suis allé glaner ici et là quelques
> solutions. Toutes reposent, bien sûr, sur le principe qu'un compteur
> est incrémenté et affiché ; cette action peut être provoquée :

> 1. manuellement au moyen d'une (même) commande insérée, à chaque
> début de paragraphe (lourd) ;

> 2. semi-automatiquement au moyen d'un (même) environnement appliqué
> aux zones où les paragraphes doivent être numérotés, en évitant par
> exemple les \section (dont la définition comporte des \par) mais qui
> ne doivent pas être sur-numérotées (mi-lourd) ;

> 3. automatiquement à chaque début de nouveau paragraphe (léger).

> [...]

Tu peux également regarder ceci et peut-être t'en inspirer :
http://parano.sarovar.org/

--
DW

Jean-Côme Charpentier

unread,
Feb 5, 2012, 6:33:45 AM2/5/12
to
Le 04/02/2012 17:04, Denis Bitouzé a écrit :
> Bonjour,

Bisou monsieur,

> pour répondre à une doctorante en droit, qui a pour consigne que /tous/
> les paragraphes (au sens \par, pas au sens \paragraph) de sa thèse
> soient numérotés, je suis allé glaner ici et là quelques solutions.
> Toutes reposent, bien sûr, sur le principe qu'un compteur est
> incrémenté et affiché ; cette action peut être provoquée :
>
> 1. manuellement au moyen d'une (même) commande insérée, à chaque
> début de paragraphe (lourd) ;

Voire chiant.

> 2. semi-automatiquement au moyen d'un (même) environnement appliqué
> aux zones où les paragraphes doivent être numérotés, en évitant par
> exemple les \section (dont la définition comporte des \par) mais qui
> ne doivent pas être sur-numérotées (mi-lourd) ;

Mi-chiant ?

> 3. automatiquement à chaque début de nouveau paragraphe (léger).

C'est quoi le contraire de chiant ? Constipant ? Mais je sens que le
côté positif de la chose ne soit pas bien rendu avec « constipant ».

> Les solutions de ce dernier type sont donc les plus commodes mais aussi
> les moins robustes : elles reposent en effet sur l'ajout d'ordres à
> l'unité lexicale (?) \everypar mais celle-ci est fréquemment employée
> et donc réinitialisée au cours d'un document par toutes sortes de
> macros (par les \section notamment).

En fait par toutes les macros de section puisque c'est \@startsection
qui fait le boulot. \part aussi mais il n'utilise pas \@startsection.
Il y a aussi, comme ton ECM le montre les listes (toutes les listes,
c'est \list qui fait le boulot). En fouillant dans le code de LaTeX,
j'ai vu aussi que verbatim faisait joujou avec \everypar, ainsi que dans
l'environnement tabbing (on s'en fout je suppose), minipage et parbox
(on s'en fout peut-être moins), la commande \newpage (donc attention) et
le double-colonnage.
Le cas échéant, ce que je propose pour \startsection peut-être étendu
pour d'autres commandes et ce que je propose pour \list peut être étendu
pour d'autres environnements.

> Par exemple, la solution fournie ici même par GL :
>
> https://groups.google.com/group/fr.comp.text.tex/msg/62436f5f236aeae3?hl=fr

Je n'ai pas vu.

> fonctionne très bien mais nécessite de redéfinir /toutes/ les commandes
> de structuration (\chapter, \section, etc.), ainsi que d'autres objets,
> les listes par exemple.

C'est néanmoins une bonne idée. En tous cas, c'est celle que je retiens.

> Or, j'ai vu qu'il y avait moyen, pour ne pas devoir redéfinir \everypar
> à chaque fois qu'il est utilisé par autre chose, de « robustifier » les
> \everypar au moyen de :
>
> \everypar\expandafter{\the\everypar...}

Ben oui mais non. Cela va garder l'ancienne définition et ajouter ce
que tu veux. Tu ne peux pas enlever quelque chose avec ça or c'est
justement ce que tu veux : ajouter un numéro sauf quelquefois où il ne
faut pas ajouter ce numéro.

> ce qui m'a conduit à :
>
> http://www.tex.ac.uk/cgi-bin/texfaq2html?label=subverttoks
>
> et enfin à l'ECM suivant :
> [couic ECM]
>
> L'inconvénient est que, cette fois, les titres de \chapter, de \section,
> etc., les listes, etc. sont (sur-)numérotés.

Bé oui.

> Si on souhaite employer, parmi les 3 types de solutions indiqués
> ci-dessus, celui qui est « automatique », on se trouve donc face au
> dilemme suivant :
>
> 1. soit on ne « robustifie » pas les \everypar, mais on est
> alors obligé de redéfinir tous les objets les utilisant qui vont être
> employés dans le document (sans compter que certains packages
> risquent de peut-être troubler cela) ;
>
> 2. soit on « robustifie » les \everypar (comme dans l'ECM ci-dessus),
> mais alors on est obligé de spécifier, si cela est toutefois
> possible, les objets qui ne doivent pas être concernés par la
> redéfinition de \everypar.
>
> La seconde alternative me semblant plus facile à mettre en oeuvre, ma
> question est donc la suivante : y a-t-il moyen, dans l'ECM ci-dessus,
> d'indiquer que la redéfinition de \everypar ne doit /pas/ concerner les
> \chapter, les \section, etc., les listes, etc.

Plutôt que de toucher à \everypar, je vais plutôt faire joujou avec
la macro \mypkgs@ownstuff qui fait le boulot voulu. C'est parti :

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{lipsum}
% ---------------------------------------------
\makeatletter
\newcounter{nopar}
\let\mypkg@@everypar\everypar
\newtoks\mypkg@everypar
\mypkg@everypar\expandafter{\the\everypar}
\mypkg@@everypar{\mypkgs@ownstuff\the\mypkg@everypar}
\def\mypkgs@ownstuff{%
\stepcounter{nopar}\textbf{\the\value{nopar}}.
}
\let\mypkgs@ownstuffsave\mypkgs@ownstuff % Sauvegarde
\let\everypar\mypkg@everypar
%%% Corrections (il faudrait le faire sur \part aussi mais j'ai la
%%% flemme et comme tu ne l'emploies pas...
\let\listori\list
\def\list{%
\def\mypkgs@ownstuff{}% On tue tout bêtement. On est dans un groupe
% donc pas grave.
\listori % et on reprend comme si de rien n'était
}
\let\@startsectionori\@startsection
\def\@startsection{%
\def\mypkgs@ownstuff{%
\let\mypkgs@ownstuff\mypkgs@ownstuffsave
}%
\@startsectionori
}

\makeatother
% ---------------------------------------------
\begin{document}
\section{Bla}
\lipsum[1-4]
\begin{itemize}
\item Bli
\item Blo
\end{itemize}
\lipsum[5-9]
\section{Ble}
\subsection{Bli}
\lipsum[1-4]
\begin{itemize}
\item Bli
\item Blo
\end{itemize}
\lipsum[5-9]
\end{document}

Je n'assure pas que cela fonctionne à 100% dans tous les cas. Mais
l'idée de base ne doit pas être complètement pourri. Le problème, c'est
qu'il faut l'adapter au cas par cas. Je pense à d'autres extensions qui
feraient joujou avec le \everypar en particulier.

Jean-Côme Charpentier

--
Le TeXbook, c'est comme le bon vin...
-+- Jean-Côme in fr.comp.text.tex -+-

Denis Bitouzé

unread,
Feb 5, 2012, 10:52:11 AM2/5/12
to
Le dimanche 05/02/12 à 12h05,
Damien Wyart <damien...@free.fr> a écrit :

> Tu peux également regarder ceci et peut-être t'en inspirer :
> http://parano.sarovar.org/

Malheureusement, ce package semble ne pas fonctionner idéalement, comme
le montre l'ECM suivant (cf. page 4 l'absence de numérotation du
paragraphe qui suit le second chapitre) :

\documentclass{report}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{parano}
\usepackage{lmodern}
\usepackage{lipsum}
%
\renewcommand{\theparano}{\textbf{\arabic{parano}}}
%
\begin{document}
\chapter{Blo}
\parano
\lipsum[1-3]
\section{A section}
\lipsum[1-3]
\section{A section}
\lipsum[1-3]
\chapter{Blo}
\lipsum[1-3]
\section{A section}
\lipsum[1-3]
\section{A section}
\lipsum[1-3]
\end{document}

Le bug tracker de ce paquet indique également un problème avec les
listes, ce qui n'est pas étonnant à la lumière du message de Jean-Côme
puisqu'un coup d'oeil dans parano.sty montre qu'il ne s'attaque qu'à
\@startsection.

Ceci étant, merci quand même !
--
Denis

Denis Bitouzé

unread,
Feb 5, 2012, 11:00:12 AM2/5/12
to
Le dimanche 05/02/12 à 12h33,
Jean-Côme Charpentier <Jean-Côme.Char...@wanadoo.fr> a écrit :

> Le 04/02/2012 17:04, Denis Bitouzé a écrit :
> > Bonjour,
>
> Bisou monsieur,

C'est soit « bisou », soit « monsieur », pas les deux à la fois !

> > 1. manuellement au moyen d'une (même) commande insérée, à chaque
> > début de paragraphe (lourd) ;
>
> Voire chiant.

Certes mais c'est un mot que rigoureusement ma mère m'a défendu
d'employer ici (ailleurs, j'ai le droit).

> > 2. semi-automatiquement au moyen d'un (même) environnement
> > appliqué aux zones où les paragraphes doivent être numérotés, en
> > évitant par exemple les \section (dont la définition comporte des
> > \par) mais qui ne doivent pas être sur-numérotées (mi-lourd) ;
>
> Mi-chiant ?

Certes mais c'est un mi-mot que mi-rigoureusement ma mère m'a
mi-défendu de mi-employer ici (ailleurs, j'ai le mi-droit).

> > 3. automatiquement à chaque début de nouveau paragraphe (léger).
>
> C'est quoi le contraire de chiant ? Constipant ? Mais je sens que
> le côté positif de la chose ne soit pas bien rendu avec « constipant
> ».

Toi, on voit que t'as lu le TeXbook et sa parabole digestive...

> > Les solutions de ce dernier type sont donc les plus commodes mais
> > aussi les moins robustes : elles reposent en effet sur l'ajout
> > d'ordres à l'unité lexicale (?) \everypar mais celle-ci est
> > fréquemment employée et donc réinitialisée au cours d'un document
> > par toutes sortes de macros (par les \section notamment).
>
> En fait par toutes les macros de section puisque c'est
> \@startsection qui fait le boulot.

Saloperie de \@startsection !

> \part aussi mais il n'utilise pas \@startsection. Il y a aussi, comme
> ton ECM le montre les listes (toutes les listes, c'est \list qui fait
> le boulot). En fouillant dans le code de LaTeX, j'ai vu aussi que
> verbatim faisait joujou avec \everypar, ainsi que dans
> l'environnement tabbing (on s'en fout je suppose), minipage et parbox
> (on s'en fout peut-être moins), la commande \newpage (donc attention)
> et le double-colonnage.

Bouhouhou...

> Le cas échéant, ce que je propose pour \startsection peut-être étendu
> pour d'autres commandes et ce que je propose pour \list peut être
> étendu pour d'autres environnements.

Coule.

> > Par exemple, la solution fournie ici même par GL :
> >
> > https://groups.google.com/group/fr.comp.text.tex/msg/62436f5f236aeae3?hl=fr
>
> Je n'ai pas vu.

T'es Miró ?

> > fonctionne très bien mais nécessite de redéfinir /toutes/ les
> > commandes de structuration (\chapter, \section, etc.), ainsi que
> > d'autres objets, les listes par exemple.
>
> C'est néanmoins une bonne idée. En tous cas, c'est celle que je
> retiens.

OK.

> > Or, j'ai vu qu'il y avait moyen, pour ne pas devoir redéfinir
> > \everypar à chaque fois qu'il est utilisé par autre chose, de «
> > robustifier » les \everypar au moyen de :
> >
> > \everypar\expandafter{\the\everypar...}
>
> Ben oui mais non. Cela va garder l'ancienne définition et ajouter
> ce que tu veux. Tu ne peux pas enlever quelque chose avec ça or c'est
> justement ce que tu veux : ajouter un numéro sauf quelquefois où il
> ne faut pas ajouter ce numéro.

Je vois.

> > [...]
> >
> > L'inconvénient est que, cette fois, les titres de \chapter, de
> > \section, etc., les listes, etc. sont (sur-)numérotés.
>
> Bé oui.

Ouah l'aut', eh !

> Plutôt que de toucher à \everypar, je vais plutôt faire joujou
> avec la macro \mypkgs@ownstuff

C'est marrant, on n'a pas les mêmes joujoux...

> qui fait le boulot voulu. C'est parti :
>
> \documentclass{article}
> [...]

La vache, ça en jette !

> Je n'assure pas que cela fonctionne à 100% dans tous les cas.

Mieux vaut pour toi, parce que déjà là, ça marche pas ! ;) Certains «
premiers » paragraphes ne sont pas numérotés (les premiers de la page 1
et les

> Mais
> l'idée de base ne doit pas être complètement pourri. Le problème,
> c'est qu'il faut l'adapter au cas par cas. Je pense à d'autres
> extensions qui feraient joujou avec le \everypar en particulier.
>
> Jean-Côme Charpentier
>


--
Denis

Denis Bitouzé

unread,
Feb 5, 2012, 11:15:53 AM2/5/12
to
Le dimanche 05/02/12 à 12h33,
Jean-Côme Charpentier <Jean-Côme.Char...@wanadoo.fr> a écrit :

> Le 04/02/2012 17:04, Denis Bitouzé a écrit :
> > Bonjour,
>
> Bisou monsieur,

Comme vous pouvez le constater, le JCC et moi, on s'aime mais avec une
certaine réserve :)

> > 1. manuellement au moyen d'une (même) commande insérée, à chaque
> > début de paragraphe (lourd) ;
>
> Voire chiant.

Certes, mais c'est un mot que rigoureusement ma mère m'a défendu
d'employer ici (ailleurs, j'ai le droit).

> > 2. semi-automatiquement au moyen d'un (même) environnement
> > appliqué aux zones où les paragraphes doivent être numérotés, en
> > évitant par exemple les \section (dont la définition comporte des
> > \par) mais qui ne doivent pas être sur-numérotées (mi-lourd) ;
>
> Mi-chiant ?

Certes, mais c'est un mi-mot que rigoureusement ma mère m'a mi-défendu
de mi-employer ici (ailleurs, j'ai le mi-droit).

> > 3. automatiquement à chaque début de nouveau paragraphe (léger).
>
> C'est quoi le contraire de chiant ? Constipant ? Mais je sens que
> le côté positif de la chose ne soit pas bien rendu avec « constipant
> ».

On voit que, toi, tu as lu le TeXbook et sa parabole digestive...

> En fait par toutes les macros de section puisque c'est
> \@startsection qui fait le boulot. \part aussi mais il n'utilise pas
> \@startsection.

Saloperie de \@startsection !

> Il y a aussi, comme ton ECM le montre les listes (toutes les listes,
> c'est \list qui fait le boulot). En fouillant dans le code de LaTeX,
> j'ai vu aussi que verbatim faisait joujou avec \everypar, ainsi que
> dans l'environnement tabbing (on s'en fout je suppose), minipage et
> parbox (on s'en fout peut-être moins), la commande \newpage (donc
> attention) et le double-colonnage.

Bouhouhou...

> Le cas échéant, ce que je propose pour \startsection peut-être étendu
> pour d'autres commandes et ce que je propose pour \list peut être
> étendu pour d'autres environnements.

OK.

> > Par exemple, la solution fournie ici même par GL :
> >
> > https://groups.google.com/group/fr.comp.text.tex/msg/62436f5f236aeae3?hl=fr
>
> Je n'ai pas vu.

T'es Miró ?

> > fonctionne très bien mais nécessite de redéfinir /toutes/ les
> > commandes de structuration (\chapter, \section, etc.), ainsi que
> > d'autres objets, les listes par exemple.
>
> C'est néanmoins une bonne idée. En tous cas, c'est celle que je
> retiens.

OK.

> > \everypar\expandafter{\the\everypar...}
>
> Ben oui mais non. Cela va garder l'ancienne définition et ajouter
> ce que tu veux. Tu ne peux pas enlever quelque chose avec ça or c'est
> justement ce que tu veux : ajouter un numéro sauf quelquefois où il
> ne faut pas ajouter ce numéro.

Je vois.

> > L'inconvénient est que, cette fois, les titres de \chapter, de
> > \section, etc., les listes, etc. sont (sur-)numérotés.
>
> Bé oui.

Ouah l'aut' eh !

> Plutôt que de toucher à \everypar, je vais plutôt faire joujou
> avec la macro \mypkgs@ownstuff

C'est marrant, on n'a pas les mêmes joujoux...

> qui fait le boulot voulu. C'est parti :
>
> \documentclass{article}
> [...]

La vache, ça en jette !

> Je n'assure pas que cela fonctionne à 100% dans tous les cas.

Vaut mieux pour toi, car ça ne marche pas dans cet ECM ! ;) Cf.
l'absence de numérotation des premiers paragraphes pages 1 et 3. Je
vais essayer, avec mes maigres connaissances TeX, de voir si je peux
rectifier de moi-même, mais je compte sur ton amour-propre pour le
faire avant moi (d'autant que je pars dans moins d'une heure prendre un
train).

> Mais l'idée de base ne doit pas être complètement pourri.

Ça, je n'en ai pas le moindre doute (rassurez-vous, je ne suis pas
moi-même certain de ce que signifie réellement cette phrase dans ce
contexte).

> Le problème, c'est qu'il faut l'adapter au cas par cas. Je pense à
> d'autres extensions qui feraient joujou avec le \everypar en
> particulier.

C'est bien ce qui m'inquiète : c'est le genre de chose qui peut
déstabiliser un débutant en LaTeX...

Merci !
--
Denis

Denis Bitouzé

unread,
Feb 5, 2012, 11:17:57 AM2/5/12
to
Le dimanche 05/02/12 à 17h15,
Denis Bitouzé <dbito...@spam.wanadoo.fr> a écrit :

> [...]

Rhaaaa, j'ai fait une fausse manip' et croyais avoir définitivement
perdu le message en réponse à Jean-Côme, si bien que je l'ai
intégralement récrit de mémoire !

Désolé pour cette redondance...
--
Denis

Manuel Pégourié-Gonnard

unread,
Feb 5, 2012, 12:30:09 PM2/5/12
to
Denis Bitouzé scripsit :
Non c'est fun, ça nous permet d'apprendre des choses sur ta mémoire :)

--
Manuel Pégourié-Gonnard - http://people.math.jussieu.fr/~mpg/


Jean-Côme Charpentier

unread,
Feb 5, 2012, 1:33:54 PM2/5/12
to
Le 05/02/2012 17:15, Denis Bitouzé a écrit :
> Le dimanche 05/02/12 à 12h33,
> Jean-Côme Charpentier<Jean-Côme.Char...@wanadoo.fr> a écrit :
>
>> Le 04/02/2012 17:04, Denis Bitouzé a écrit :
>>> Bonjour,
>>
>> Bisou monsieur,
>
> Comme vous pouvez le constater, le JCC et moi, on s'aime mais avec une
> certaine réserve :)

Disons qu'on sait se tenir et que sur fctt, il y a quelques uns de
nos élèves qui traînent donc la retenue est une obligation morale.

> [...]
>
>> En fait par toutes les macros de section puisque c'est
>> \@startsection qui fait le boulot. \part aussi mais il n'utilise pas
>> \@startsection.
>
> Saloperie de \@startsection !

Le côté agréable c'est qu'en modifiant \@startsection, on règle son
compte à cinq niveau de section d'un coup.

>> Il y a aussi, comme ton ECM le montre les listes (toutes les listes,
>> c'est \list qui fait le boulot). En fouillant dans le code de LaTeX,
>> j'ai vu aussi que verbatim faisait joujou avec \everypar, ainsi que
>> dans l'environnement tabbing (on s'en fout je suppose), minipage et
>> parbox (on s'en fout peut-être moins), la commande \newpage (donc
>> attention) et le double-colonnage.
>
> Bouhouhou...

Meuuh non. Je fais un test avec \newpage et minipage. Tu va voir mon
roudoudou^W gars.

>>> Par exemple, la solution fournie ici même par GL :
>>>
>>> https://groups.google.com/group/fr.comp.text.tex/msg/62436f5f236aeae3?hl=fr
>>
>> Je n'ai pas vu.
>
> T'es Miró ?

Non mais j'ai un seul intervenant sur ma black list donc je n'ai pas
pu voir le message d'origine (sauf si quelqu'un y a répondu) et je n'ai
pas de compte google. Donc je ne peux pas voir.

>>> fonctionne très bien mais nécessite de redéfinir /toutes/ les
>>> commandes de structuration (\chapter, \section, etc.), ainsi que
>>> d'autres objets, les listes par exemple.
>>
>> C'est néanmoins une bonne idée. En tous cas, c'est celle que je
>> retiens.
> [...]
>> Plutôt que de toucher à \everypar, je vais plutôt faire joujou
>> avec la macro \mypkgs@ownstuff
>
> C'est marrant, on n'a pas les mêmes joujoux...

Bravo pour la retenue !

>> qui fait le boulot voulu. C'est parti :
>>
>> \documentclass{article}
>> [...]
>
> La vache, ça en jette !
>
>> Je n'assure pas que cela fonctionne à 100% dans tous les cas.
>
> Vaut mieux pour toi, car ça ne marche pas dans cet ECM ! ;) Cf.
> l'absence de numérotation des premiers paragraphes pages 1 et 3. Je
> vais essayer, avec mes maigres connaissances TeX, de voir si je peux
> rectifier de moi-même, mais je compte sur ton amour-propre pour le
> faire avant moi (d'autant que je pars dans moins d'une heure prendre un
> train).

Ah merde. J'arrive trop tard alors ? J'ai réglé le problème en
ajoutant bêtement un \global à un endroit stratégique. Cela dit, cela
fait que le premier paragraphe qui suit une section a un retrait
d'alinéa. Si ta doctorante écrit sa thèse en français c'est plutôt tant
mieux mais sinon, il faudra régler aussi ce petit détail.

>> Mais l'idée de base ne doit pas être complètement pourri.
>
> Ça, je n'en ai pas le moindre doute (rassurez-vous, je ne suis pas
> moi-même certain de ce que signifie réellement cette phrase dans ce
> contexte).

Je suis sûr que ton code ne nécessite pas une tonne de réglages ad
hoc pour fonctionner comme il faut.

>> Le problème, c'est qu'il faut l'adapter au cas par cas. Je pense à
>> d'autres extensions qui feraient joujou avec le \everypar en
>> particulier.
>
> C'est bien ce qui m'inquiète : c'est le genre de chose qui peut
> déstabiliser un débutant en LaTeX...

Mouais. D'un autre côté, il faut que le package en question soit
touche aux commandes qui font joujou avec \everypar (style titlesec ou
enumerate ou...) soit fasse joujou lui-même avec \everypar. Ce n'est
quand même pas la majorité.

Bon. Le code corrigé. J'ai donc ajouté la gestion des minipages (pour
le \newpage, j'ai juste vérifié qu'il n'y avait rien à faire). Par
défaut, les minipages ne sont pas numérotées mais j'indique la façon de
passer outre. J'en ai profité pour changer ta
\macro@WithOwnNameHardToRememberAndChiantToWrite par un plus court
\nopar. D'ailleurs \numpar aurait été plus parlant. Tant pis.

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{lipsum}
% ---------------------------------------------
\makeatletter
\newcounter{nopar}
\let\mypkg@@everypar\everypar
\newtoks\mypkg@everypar
\mypkg@everypar\expandafter{\the\everypar}
\mypkg@@everypar{\nopar\the\mypkg@everypar}
\def\nopar{%
\stepcounter{nopar}\textbf{\the\value{nopar}}.%
\hbox{ }% espace sans compression-étirement.
}
\let\noparsave\nopar % Sauvegarde
\let\everypar\mypkg@everypar
%%% Corrections (il faudrait le faire sur \part aussi mais j'ai la
%%% flemme et comme tu ne l'emploies pas...
\let\listori\list
\def\list{%
\def\nopar{}% On tue tout bêtement. On est dans un groupe
% donc pas grave.
\listori % et on reprend comme si de rien n'était
}
%
\let\@startsectionori\@startsection
\def\@startsection{%
\def\nopar{%
\global\let\nopar\noparsave
}%
\@startsectionori
}
%
\let\minipageori\minipage
\def\minipage{%
\def\nopar{}%
\minipageori
}
\makeatother
% ---------------------------------------------
\begin{document}
\section{Bla}
\lipsum[1-4]
\begin{itemize}
\item Bli
\item Blo
\end{itemize}
\lipsum[5-9]
\section{Ble}
\subsection{Bli}
\lipsum[1-4]
\begin{itemize}
\item Bli
\item Blo
\end{itemize}
\lipsum[5-8]
Du texte
\newpage % Ça fonctionne sans rien faire
Un autre texte

\lipsum[9-11]

\begin{minipage}{0.45\linewidth}
Je suis une minipage

avec deux paragraphes
\end{minipage}\hfill
\begin{minipage}{0.45\linewidth}
\let\nopar\noparsave % Ça vaudrait peut-être le coup d'en faire une
% commande
J'en suis une autre

avec deux paragraphes aussi mais numérotés.\strut
\end{minipage}

Et on reprend. Bla bla bla bla bla bla bla bla bla bla bla bla bla bla
bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla
bla bla bla
\end{document}

--
Pub : tout ceux qui veulent rigoler un coup en m'entendant parler
anglais sont cordialement invités à se retrouver au RMLL à
Nancy. Ulrike aura le droit de se moquer de moi :-)

Paul Gaborit

unread,
Feb 6, 2012, 1:48:32 AM2/6/12
to

À (at) Sun, 05 Feb 2012 19:33:54 +0100,
Jean-Côme Charpentier <Jean-Côme.Char...@wanadoo.fr> écrivait (wrote):

> Le 05/02/2012 17:15, Denis Bitouzé a écrit :
>>
>> Saloperie de \@startsection !
>
> Le côté agréable c'est qu'en modifiant \@startsection, on règle son
> compte à cinq niveau de section d'un coup.
>
>>> Je n'assure pas que cela fonctionne à 100% dans tous les cas.
>>
[...]
>> C'est bien ce qui m'inquiète : c'est le genre de chose qui peut
>> déstabiliser un débutant en LaTeX...
>
> Mouais. D'un autre côté, il faut que le package en question soit
> touche aux commandes qui font joujou avec \everypar (style titlesec ou
> enumerate ou...) soit fasse joujou lui-même avec \everypar. Ce n'est
> quand même pas la majorité.
>
> Bon. Le code corrigé. J'ai donc ajouté la gestion des minipages (pour
> le \newpage, j'ai juste vérifié qu'il n'y avait rien à faire). Par
> défaut, les minipages ne sont pas numérotées mais j'indique la façon de
> passer outre.
[...]

Tout ceci montre à l'évidence que, quoi qu'on fasse, la solution
automatique restera fragile et ad'hoc. Personnellement et malgré les
éventuels problèmes digestifs de certains, j'en serai resté à la
solution d'une commande explicite à insérer manuellement en début de
chaque paragraphe à numéroter. Cette solution a le mérite de respecter
l'idée que c'est l'auteur qui indique la sémantique du texte et non le
moteur de composition qui essaye de deviner...

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>

Jean-Côme Charpentier

unread,
Feb 6, 2012, 8:40:22 AM2/6/12
to
Le 06/02/2012 07:48, Paul Gaborit a écrit :
>
> À (at) Sun, 05 Feb 2012 19:33:54 +0100,
> Jean-Côme Charpentier<Jean-Côme.Char...@wanadoo.fr> écrivait (wrote):
>
>> Le 05/02/2012 17:15, Denis Bitouzé a écrit :
>>>
>>> Saloperie de \@startsection !
>> [...]
>>>> Je n'assure pas que cela fonctionne à 100% dans tous les cas.
> [...]
>>> C'est bien ce qui m'inquiète : c'est le genre de chose qui peut
>>> déstabiliser un débutant en LaTeX...
>>
>> Mouais. D'un autre côté, il faut que le package en question soit
>> touche aux commandes qui font joujou avec \everypar (style titlesec ou
>> enumerate ou...) soit fasse joujou lui-même avec \everypar. Ce n'est
>> quand même pas la majorité.
>>
>> Bon. Le code corrigé. J'ai donc ajouté la gestion des minipages (pour
>> le \newpage, j'ai juste vérifié qu'il n'y avait rien à faire). Par
>> défaut, les minipages ne sont pas numérotées mais j'indique la façon de
>> passer outre.
> [...]
>
> Tout ceci montre à l'évidence que, quoi qu'on fasse, la solution
> automatique restera fragile et ad'hoc.

Oui mais.

> Personnellement et malgré les
> éventuels problèmes digestifs de certains,

:-)

> j'en serai resté à la
> solution d'une commande explicite à insérer manuellement en début de
> chaque paragraphe à numéroter. Cette solution a le mérite de respecter
> l'idée que c'est l'auteur qui indique la sémantique du texte et non le
> moteur de composition qui essaye de deviner...

Oui mais quand même. Ici, le moteur de composition n'essaye pas de
deviner. Pour l'instant, c'est : numérote tous les paragraphes (au sens
TeXien du terme) sauf les sections, les listes et les minipages.
Ce qui est chiant, c'est qu'on a peut-être pas tout prévu et que
certains ajouts ultérieurs de packages peuvent produire des problèmes.
C'est le côté nécessairement fragile de la chose. Pour l'instant, je
n'ai pas d'idée de génie pour assurer une solution fonctionnant dans
tous les cas de figure... n'ayant même pas une idée bien claire de ce
que sont les « tous les cas de figure ».
Comme j'aime bien l'argent, le beurre, la ceinture, la bretelle, la
crémière et son sourire, je pencherai pour le code plus ou moins dans
l'était actuel avec en plus deux commandes explicites pour mettre le
mécanisme en branle et pour l'arrêter.
Devoir mettre une macro de façon systématique devant chaque
paragraphe ne me semble pas une si bonne idée, ni au point de vue
facilité d'utilisation (évidemment), ni au point de vue séparation
fond-forme, ni même au niveau sécurité. C'est comme si tu disais que les
auteurs devaient mettre un \indent (ou un \noindent) au départ de chaque
paragraphe^W alinéa. C'est bien le moteur qui doit deviner, en fonction
de la langue de l'auteur voire de ses souhaits personnels, si on doit ou
non avoir un retrait d'alinéa. Cela n'empêche pas, ponctuellement, de
placer un \noindent bien senti (ou une macro incluant un \noindent non
moins bien senti). Quoi que t'en penses ?

Jean-Côme Charpentier

--
En fait, le format de cette police était "MS Windows symbols", ce qui
explique à la fois un peu tout et pas grand chose...
-+- Christophe C. in fr.comp.text.tex -+-

Paul Gaborit

unread,
Feb 6, 2012, 9:53:00 AM2/6/12
to

À (at) Mon, 06 Feb 2012 14:40:22 +0100,
Jean-Côme Charpentier <Jean-Côme.Char...@wanadoo.fr> écrivait (wrote):

> Oui mais quand même. Ici, le moteur de composition n'essaye pas de
> deviner. Pour l'instant, c'est : numérote tous les paragraphes (au
> sens TeXien du terme) sauf les sections, les listes et les minipages.
> Ce qui est chiant, c'est qu'on a peut-être pas tout prévu et que
> certains ajouts ultérieurs de packages peuvent produire des
> problèmes. C'est le côté nécessairement fragile de la chose.

C'est fragile parce que la notion de paragraphe de (La)TeX ne recouvre
absolument pas la notion de paragraphe au sens de l'auteur. Quid des
paragraphes dans une note de bas de page, dans une figure, dans un
tableau, dans la bibliographie, dans une citation, etc. ?

En fait, à chaque utilisation d'un nouvel environnement ou d'une
nouvelle commande qui utilise des paragraphes au sens de (La)TeX, il
faudra décider si c'est une exception ou non.

On passe d'un problème simple (il faut mettre une commande au début de
chaque paragraphe à numéroter) à un problème compliqué (on numérote tous
les paragraphes sauf certains). C'est plus compliqué car cela nécessite
de connaître tous les endroits où (La)TeX utilise des paragraphes !

[...]
> C'est comme si tu disais que les auteurs devaient mettre un \indent
> (ou un \noindent) au départ de chaque paragraphe^W alinéa. C'est bien
> le moteur qui doit deviner, en fonction de la langue de l'auteur voire
> de ses souhaits personnels, si on doit ou non avoir un retrait
> d'alinéa. Cela n'empêche pas, ponctuellement, de placer un \noindent
> bien senti (ou une macro incluant un \noindent non moins bien
> senti). Quoi que t'en penses ?

Ton exemple est parfaitement choisi. Il n'existe aucun moyen de savoir
automatiquement quel paragraphe doit être indenté ou non. D'où la
nécessité d'un appel à \noindent (à la main ou dans toutes les macros
bien pensées). Mais alors pouquoi cela marche-t-il ? Parce que la
plupart des auteurs de macros ont pris en compte cette notion
d'indentation qui pré-existait. Or ces mêmes auteurs n'ont évidemment
pas pris en compte la notion de numérotation des paragraphes puisque
pour eux elle n'existe pas.

C'est donc le plus gros défaut de la numérotation automatique : ce ne
sera pas robuste dans le temps. Un package utilisé dans le document peut
très bien ne pas utiliser de paragraphe aujourd'hui (il ne nécessite
donc pas d'exception) et en utiliser demain (ce qui nécessitera
d'ajouter des macros et environnements dans le liste des exceptions).

Jean-Côme Charpentier

unread,
Feb 6, 2012, 1:30:45 PM2/6/12
to
Le 06/02/2012 15:53, Paul Gaborit a écrit :
>
> À (at) Mon, 06 Feb 2012 14:40:22 +0100,
> Jean-Côme Charpentier<Jean-Côme.Char...@wanadoo.fr> écrivait (wrote):
>
>> Oui mais quand même. Ici, le moteur de composition n'essaye pas de
>> deviner. Pour l'instant, c'est : numérote tous les paragraphes (au
>> sens TeXien du terme) sauf les sections, les listes et les minipages.
>> Ce qui est chiant, c'est qu'on a peut-être pas tout prévu et que
>> certains ajouts ultérieurs de packages peuvent produire des
>> problèmes. C'est le côté nécessairement fragile de la chose.
>
> C'est fragile parce que la notion de paragraphe de (La)TeX ne recouvre
> absolument pas la notion de paragraphe au sens de l'auteur.

Certes. Mais ce n'est pas fragile au sens où ça va péter à la gueule.
C'est fragile seulement parce que le résultat obtenu ne sera pas clui
voulu par l'auteur.

> Quid des
> paragraphes dans une note de bas de page, dans une figure, dans un
> tableau, dans la bibliographie, dans une citation, etc. ?

En l'état actuel, ces « paragraphes » seront numérotés. Si on a une
commande idoine pour suspendre cette numérotation, il n'y a plus de
problème.

> En fait, à chaque utilisation d'un nouvel environnement ou d'une
> nouvelle commande qui utilise des paragraphes au sens de (La)TeX, il
> faudra décider si c'est une exception ou non.

Oui. Et alors ? Si il n'y a pas de numérotation automatique et qu'on
en veux une, il faudra le dire. S'il y a une numérotation automatique et
qu'on n'en veut pas, il faudra le dire. De toutes façons on va se faire
chier donc, quitte à se faire chier autant se faire chier le moins
possible. Non ?

> On passe d'un problème simple (il faut mettre une commande au début de
> chaque paragraphe à numéroter)

Simple mais chiant. Voire super méga chiant. Personnellement j'aurais
du mal à supporter.

> à un problème compliqué (on numérote tous
> les paragraphes sauf certains). C'est plus compliqué car cela nécessite
> de connaître tous les endroits où (La)TeX utilise des paragraphes !

Bof. Pour celui qui programme c'est sans doute plus compliqué. Pour
celui qui utilise, il suffit de mettre une commande indiquant qu'on ne
veut pas de numérotation pour *ce* paragraphe (commande one shot) ou à
partir d'ici jusqu'à rencontrer la commande qui redemande la numérotation.

> [...]
>> C'est comme si tu disais que les auteurs devaient mettre un \indent
>> (ou un \noindent) au départ de chaque paragraphe^W alinéa. C'est bien
>> le moteur qui doit deviner, en fonction de la langue de l'auteur voire
>> de ses souhaits personnels, si on doit ou non avoir un retrait
>> d'alinéa. Cela n'empêche pas, ponctuellement, de placer un \noindent
>> bien senti (ou une macro incluant un \noindent non moins bien
>> senti). Quoi que t'en penses ?
>
> Ton exemple est parfaitement choisi. Il n'existe aucun moyen de savoir
> automatiquement quel paragraphe doit être indenté ou non. D'où la
> nécessité d'un appel à \noindent (à la main ou dans toutes les macros
> bien pensées). Mais alors pouquoi cela marche-t-il ? Parce que la
> plupart des auteurs de macros ont pris en compte cette notion
> d'indentation qui pré-existait. Or ces mêmes auteurs n'ont évidemment
> pas pris en compte la notion de numérotation des paragraphes puisque
> pour eux elle n'existe pas.

Je te promets que je préfère de loin mettre quelques rares \noindent
dans mes documents que des \indent quasi-systématiquement.

> C'est donc le plus gros défaut de la numérotation automatique : ce ne
> sera pas robuste dans le temps. Un package utilisé dans le document peut
> très bien ne pas utiliser de paragraphe aujourd'hui (il ne nécessite
> donc pas d'exception) et en utiliser demain (ce qui nécessitera
> d'ajouter des macros et environnements dans le liste des exceptions).

Je ne veux absolument pas en faire un package régulier. Là, c'est
effectivement trop fragile parce que n'importe qui peut faire joujou
avec \everypar. Je répondais à une question sur un document précis. Si
la solution ne fonctionne pas (à cause de packages bizarres ou à cause
de constructions complexes avec des minipages ou que sais-je), un
réajustement rapide permettra qu'elle fonctionne, il suffit de poster
sur fctt. Mettre des \numpar à la main devant presque tous les
paragraphes me semble *vraiment* trop emmerdant. Cela hérisse tous mes
poils d'informaticien de devoir répéter aussi bêtement une commande.

Jean-Côme Charpentier

--
je pense pouvoir traduire assez bien de l'anglais vers le français
mais l'inverse est toujours une véritable torture (pour moi
certainement et pour les anglophones très probablement).

Denis Bitouzé

unread,
Feb 6, 2012, 4:32:06 PM2/6/12
to
Le dimanche 05/02/12 à 18h30,
Manuel Pégourié-Gonnard <m...@elzevir.fr> a écrit :

> Non c'est fun, ça nous permet d'apprendre des choses sur ta mémoire :)

Oh, t'as fait un diff ? C'est gentil d'y avoir pensé, mais fallait
pas...

À part ça :

\Huge Tu sais ce qu'elle te dit ma mémoire ?!! Elle te dit... euh...
\Large Rhaaa, bon sang, j'l'ai sur le bout de langue \small C'est
dingue, je suis sûr qu'elle dit un truc, ma mémoire... \footnotesize La
prochaine fois, je m'en souviendrai... \tiny Grmblbl...
--
Denis

Denis Bitouzé

unread,
Feb 6, 2012, 4:34:09 PM2/6/12
to
Le dimanche 05/02/12 à 19h33,
Jean-Côme Charpentier <Jean-Côme.Char...@wanadoo.fr> a écrit :

> \documentclass{article}
> [...]

Trop fatigué ce soir pour répondre, et même pour tester, et plus
encore pour continuer ce fil. Mais je reviens demain pour de nouvelles
aventures ('y a du package titlesec et du package enumitem dans l'air :)
--
Denis

Denis Bitouzé

unread,
Feb 8, 2012, 8:26:39 AM2/8/12
to
Le dimanche 05/02/12 à 19h33,
Jean-Côme Charpentier <Jean-Côme.Char...@wanadoo.fr> a écrit :

> >> Bisou monsieur,
> >
> > Comme vous pouvez le constater, le JCC et moi, on s'aime mais avec
> > une certaine réserve :)
>
> Disons qu'on sait se tenir et que sur fctt, il y a quelques uns de
> nos élèves qui traînent donc la retenue est une obligation morale.

Arrête, ils vont s'imaginer de ces choses quand on se rencontre en
privé !

> > [...]
> >
> >> En fait par toutes les macros de section puisque c'est
> >> \@startsection qui fait le boulot. \part aussi mais il n'utilise
> >> pas \@startsection.
> >
> > Saloperie de \@startsection !
>
> Le côté agréable c'est qu'en modifiant \@startsection, on règle
> son compte à cinq niveau de section d'un coup.

Justement, j'ai oublié de dire qu'il faudrait ajouter à cela, non
seulement des \part et \chapter, mais également un niveau de
structuration intermédiaire entre ces deux-là, nommé « titre »,
apparemment courant en droit (ils sont fous ces juristes !).

J'ai trouvé un moyen relativement simple (!) de créer cela grâce aux
packages titlesec et titletoc (il faudrait redéfinir \chapter qui
change de page alors que \titre, son « supérieur », ne le fait pas) :

\documentclass[french]{report}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage{lipsum}
\usepackage[newparttoc]{titlesec}
\usepackage{titletoc}
\usepackage[a4paper]{geometry}
\usepackage{babel}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Définition de la commande de structuration \titre, située
% entre \part et \chapter
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\titleclass{\titre}{straight}[\part]
%
\newcounter{titre}[part]
\renewcommand{\thetitre}{Titre \arabic{titre}}
%
\titleformat{\titre}[hang]
{\normalfont\LARGE\bfseries\sffamily}{\thetitre}{23pt}{\LARGE}
\titlespacing*{\titre}{0pt}{4.5ex plus 1ex minus .2ex}{4.5ex plus .2ex}
\titlecontents{titre}%
[2em+\widthof{\thecontentslabel}]%
{\addvspace{.75pc}}%
{\contentsmargin{0pt}%
\bfseries\sffamily%
\makebox[0pt][r]{\thecontentslabel.\enspace}%
}%
{\contentsmargin{0pt}}%
{\bfseries\sffamily\hfill\contentspage}
%
\begin{document}
\part{Bla}
\lipsum[1]
\titre{Ble}
\lipsum[1]
\chapter{Bli}
\lipsum[1]
\chapter{Bli bis}
\lipsum[1]
\titre{Ble bis}
\lipsum[1]
\chapter{Bli bis bis}
\lipsum[1]
\chapter{Bli bis bis bis}
\lipsum[1]
\part{Bla}
\lipsum[1]
\titre{Ble}
\lipsum[1]
\chapter{Bli}
\lipsum[1]
\chapter{Bli bis}
\lipsum[1]
\titre{Ble bis}
\lipsum[1]
\chapter{Bli bis bis}
\lipsum[1]
\chapter{Bli bis bis bis}
\lipsum[1]
\end{document}

> > T'es Miró ?
>
> Non mais j'ai un seul intervenant sur ma black list donc je n'ai
> pas pu voir le message d'origine (sauf si quelqu'un y a répondu) et
> je n'ai pas de compte google. Donc je ne peux pas voir.

Effectivement, ceci explique cela...

> > C'est marrant, on n'a pas les mêmes joujoux...
>
> Bravo pour la retenue !

Honni soit qui mal y pense !

> J'ai réglé le problème en ajoutant bêtement un \global à un endroit
> stratégique.

Coule, ça marche.

> Cela dit, cela fait que le premier paragraphe qui suit une section a
> un retrait d'alinéa.

OK.

> Si ta doctorante écrit sa thèse en français c'est plutôt tant mieux
> mais sinon, il faudra régler aussi ce petit détail.

Justement, chef, il y a un petit problème pour ces premiers paragraphes
suivant les \section et consorts (espace insuffisant).

> > C'est bien ce qui m'inquiète : c'est le genre de chose qui peut
> > déstabiliser un débutant en LaTeX...
>
> Mouais. D'un autre côté, il faut que le package en question soit
> touche aux commandes qui font joujou avec \everypar (style titlesec
> ou enumerate ou...) soit fasse joujou lui-même avec \everypar. Ce
> n'est quand même pas la majorité.

Paf, bien vu ! Vu la nécessité d'un niveau de structuration
supplémentaire, titlesec est chargé. Et malheureusement, le code que tu
m'as aimablement fourni ne fonctionne plus.

> Bon. Le code corrigé.

Qui fonctionne impeccablement.

> \documentclass{article}
> [...]
> %%% Corrections (il faudrait le faire sur \part aussi mais j'ai la
> %%% flemme et comme tu ne l'emploies pas...

Help : les \part et \chapter sont également employés.

> [...]
> \let\@startsectionori\@startsection
> \def\@startsection{%
> \def\nopar{%
> \global\let\nopar\noparsave
> }%

Ça, c'est le genre de trucs que je ne comprends pas : \nopar défini par
un \let\nopar ?! Et pourquoi faut-il redéfinir \nopar, qui plus est au
moyen de sa sauvegarde \noparsave : il a été tué ?

> [...]

Merci !
--
Denis

Denis Bitouzé

unread,
Feb 8, 2012, 8:37:34 AM2/8/12
to
Le lundi 06/02/12 à 07h48,
Paul Gaborit <Paul.G...@invalid.invalid> a écrit :

> Cette solution a le mérite de respecter l'idée que c'est l'auteur qui
> indique la sémantique du texte

Même si, comme tu dis, « la notion de paragraphe de (La)TeX ne recouvre
absolument pas la notion de paragraphe au sens de l'auteur », l'auteur
indique la sémantique dans le cas présent au moyen de lignes vides ou
de commandes \par (mais, justement dans ce dernier cas, il est heureux
qu'il y ait le raccourci <ligne vide> pour faciliter la saisie).

La commande « one shot » proposée par le JCC permettrait de gérer
les exceptions (même si ça nécessite de les guetter, ces exceptions)
tout en traitant automatiquement l'ordinaire. Ça me paraît plus coule.
--
Denis

Paul Gaborit

unread,
Feb 9, 2012, 3:02:13 AM2/9/12
to

À (at) Wed, 8 Feb 2012 14:37:34 +0100,
Denis Bitouzé <dbito...@spam.wanadoo.fr> écrivait (wrote):

> Le lundi 06/02/12 à 07h48,
> Paul Gaborit <Paul.G...@invalid.invalid> a écrit :
>
>> Cette solution a le mérite de respecter l'idée que c'est l'auteur qui
>> indique la sémantique du texte
>
> Même si, comme tu dis, « la notion de paragraphe de (La)TeX ne recouvre
> absolument pas la notion de paragraphe au sens de l'auteur », l'auteur
> indique la sémantique dans le cas présent au moyen de lignes vides ou
> de commandes \par (mais, justement dans ce dernier cas, il est heureux
> qu'il y ait le raccourci <ligne vide> pour faciliter la saisie).

Bien sûr. Mais nous sommes d'accord pour dire que l'appel à \par ou la
présence d'une ligne vide ne sont pas les seuls bons critères pour
décider s'il faut ou non numéroter.

> La commande « one shot » proposée par le JCC permettrait de gérer
> les exceptions (même si ça nécessite de les guetter, ces exceptions)
> tout en traitant automatiquement l'ordinaire. Ça me paraît plus coule.

Ce que je voulais surtout souligner c'est que de nouvelles exceptions
risquaient d'apparaître par simple mise à jour d'un package. Le document
n'est donc plus stable dans le temps...

Mais comme je n'ai pas d'autre solution à proposer, je ferais mieux de
me taire ! ;-)

Laurent Claessens

unread,
Feb 9, 2012, 8:09:00 AM2/9/12
to
Il 04/02/2012 17:04, Denis Bitouzé ha scritto:
> Bonjour,
>
> pour répondre à une doctorante en droit, qui a pour consigne que /tous/
> les paragraphes (au sens \par, pas au sens \paragraph) de sa thèse
> soient numérotés, je suis allé glaner ici et là quelques solutions.
> Toutes reposent, bien sûr, sur le principe qu'un compteur est
> incrémenté et affiché ; cette action peut être provoquée :

J'avoue ne pas avoir lu toutes les réponses, mais il me semble que rien
de super-robuste a été trouvé.

Un script externe qui détecte les lignes vides suivies d'une ligne qui
contient du texte peut aider ?

Ça aurait évidemment l'inconvénient de demander une compilation en deux
passes, mais ça semble contenir éventuellement moins d'effets de bords.

Mes deux centimes
Bonne après midi
Laurent

Denis Bitouzé

unread,
Feb 9, 2012, 9:29:54 AM2/9/12
to
Le jeudi 09/02/12 à 14h09,
Laurent Claessens <moky...@gmail.com> a écrit :

> J'avoue ne pas avoir lu toutes les réponses, mais il me semble que
> rien de super-robuste a été trouvé.

Effectivement, pas pour l'instant, mais je ne désespère pas :
Jean-Côme et tant d'autres ici sont pleins de ressources et de
sagacité...

> Un script externe qui détecte les lignes vides suivies d'une ligne
> qui contient du texte peut aider ?

Ça ne suffirait pas : les sections, par exemple, peuvent être précédées
d'une ligne vide mais il ne faudrait pas qu'elles soient marquées comme
devant être numérotées.

> Ça aurait évidemment l'inconvénient de demander une compilation en
> deux passes, mais ça semble contenir éventuellement moins d'effets de
> bords.

ÀMHA, un script externe ne parviendra pas à mieux analyser un
source .tex que TeX lui-même, non ?
--
Denis

Denis Bitouzé

unread,
Feb 9, 2012, 9:57:58 AM2/9/12
to
Le jeudi 09/02/12 à 09h02,
Paul Gaborit <Paul.G...@invalid.invalid> a écrit :

> Bien sûr. Mais nous sommes d'accord pour dire que l'appel à \par ou la
> présence d'une ligne vide ne sont pas les seuls bons critères pour
> décider s'il faut ou non numéroter.

Nous sommes d'accords. Mais, ÀMHA, c'est un bon critère pour décider
que, sauf mention contraire, il faut numéroter.

> > La commande « one shot » proposée par le JCC permettrait de gérer
> > les exceptions (même si ça nécessite de les guetter, ces exceptions)
> > tout en traitant automatiquement l'ordinaire. Ça me paraît plus
> > coule.
>
> Ce que je voulais surtout souligner c'est que de nouvelles exceptions
> risquaient d'apparaître par simple mise à jour d'un package. Le
> document n'est donc plus stable dans le temps...

C'est un risque dont l'utilisateur d'une si diabolique astuce doit
effectivement être informé. Et doivent lui être rappelées les commandes
permettant de débrayer et d'embrayer cette numérotation automatique
pour gérer les exceptions.

> Mais comme je n'ai pas d'autre solution à proposer, je ferais mieux de
> me taire ! ;-)

Pas du tout : si les arguments que tu développes m'avaient convaincu, il
eût été dommage qu'ils ne fussent point exprimés ;)
--
Denis

Laurent Claessens

unread,
Feb 13, 2012, 3:33:41 AM2/13/12
to

>> Un script externe qui détecte les lignes vides suivies d'une ligne
>> qui contient du texte peut aider ?
>
> Ça ne suffirait pas : les sections, par exemple, peuvent être précédées
> d'une ligne vide mais il ne faudrait pas qu'elles soient marquées comme
> devant être numérotées.
>
>> Ça aurait évidemment l'inconvénient de demander une compilation en
>> deux passes, mais ça semble contenir éventuellement moins d'effets de
>> bords.
>
> ÀMHA, un script externe ne parviendra pas à mieux analyser un
> source .tex que TeX lui-même, non ?

C'est pas tout à fait clair parce que nous ne sommes pas en train de
parler de paragraphes au sens de LaTeX, mais au sens des «consignes
données à une doctorante en droit»; si ça se trouve la différence est
suffisante pour que TeX ne soit pas le bon outil.

Quoi qu'il en soit, j'ai écrit ceci :


====================== CODE ============================

#! /usr/bin/python
# -*- coding: utf8 -*-

# (c) Laurent Claessens
# This code is released under the WTFPL - Do What The Fuck You Want To
Public License
# http://sam.zoy.org/wtfpl/
#
#
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
# Version 2, December 2004
#
# Copyright (C) 2004 Sam Hocevar <s...@hocevar.net>
#
# Everyone is permitted to copy and distribute verbatim or modified
# copies of this license document, and changing it is allowed as long
# as the name is changed.
#
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
# TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
#
# 0. You just DO WHAT THE FUCK YOU WANT TO.
#

from __future__ import unicode_literals
import codecs
import sys

class FakePrint(object):
def __init__(self):
self.record_stdout=sys.stdout
sys.stdout=self
def write(self,text):
octet=text.encode("utf8")
self.record_stdout.write(octet)

# the list non_text_macros is the list of things that can be found at
the begginig of a line
# without being the beginning of a paragraph
non_text_macros=[ r"\begin{"+x+"}" for x in ["enumerate","itemize"] ]
non_text_macros.append("\end{")
non_text_macros.append("\input{")
non_text_macros.append("\\bibitem")
non_text_macros.append("\makeatletter")
non_text_macros.append("subitem")
non_text_macros.append("indexspace")
non_text_macros.append("\\tableofcontents")

# The list `exclude_environments` is the list of environments not to be
taken into account
exclude_environments=["equation","equation*","split","aligned","align","subequations","pspicture"]


# The list `add_line` is the list of thinks that mark that the next text
will be a new paragraph.
# We will add an empty line after them. They are typically sectioning.
add_line = [ "\\"+x for x in
["part","chapter","section","subsection","numcases"] ]
add_line.append("\item")
add_line.append("\\begin{")

# This is a list of thinks that are indicating that we are not beginning
a paragraph
non_text_line = non_text_macros+add_line


found_macros=[]

withe_list=[" "," ","\n"] # the second is a TAB

def is_empty(line):
"""
return if `line` is empty, that is if it
contains only TAB and spaces.
"""
for c in line:
if c not in withe_list:
return False
return True

def is_text_line(line):
"""
Says True if the line is considered as a text line.
"""
if is_empty(line):
return False
for special in non_text_line:
if line.startswith(special):
return False
if line[0]=="\\":
found_macros.append(line[:line.find(" ")])
return True

def find_firt_non_withe(line):
for i,c in enumerate(line):
if c not in withe_list:
return i

def remove_first_withe(line):
"""
return the line without the first withe characters.
"""
return line[find_firt_non_withe(line):]

def is_to_be_added_a_line(line):
"""
Return True if a blank line has to be added after `line`
"""
for env in exclude_environments:
if line.startswith("\\begin{"+env+"}"):
return False
for sec in add_line :
if line.startswith(sec):
return True
return False

def preparation(code):
"""
Remove spaces at the beginning of lines
Add a withe line after sectioning
Remove the comments

NOTE : code is a _list_ of strings. The retured value is also a list.
"""
new_code=[]
for line in code:
new_code.append(remove_first_withe(line))
code=new_code
new_code=[]
nested_exclude=0
for line in code:
for env in exclude_environments:
if line.startswith("\\begin{"+env+"}"):
nested_exclude=nested_exclude+1
if line.startswith("\\end{"+env+"}"):
nested_exclude=nested_exclude-1
new_code.append(line)
if is_to_be_added_a_line(line) and nested_exclude==0:
new_code.append("\n")
code=new_code
new_code=[]
for line in code:
if not line.startswith("%"):
new_code.append(line)
return new_code

def hack(code,command):
"""
Add `command` before each new paragraph in `code`.

`code` is a list of strings while the returned value is a string.
"""
new_code=[]
nested_exclude=0
in_document=True
for line in code:
if line.startswith(r"\begin{document}"):
in_document=False
for i,line in enumerate(code):
if line.startswith(r"\begin{document}"):
in_document=True
for env in exclude_environments:
if line.startswith("\\begin{"+env+"}"):
nested_exclude=nested_exclude+1
if line.startswith("\\end{"+env+"}"):
nested_exclude=nested_exclude-1
new_code.append(line)
if in_document and nested_exclude==0 :
if is_empty(line):
try:
if is_text_line(code[i+1]):
new_code.append(command)
except IndexError : # This should only happen at the
end of the file.
pass

return "".join(new_code)

FakePrint()

source_file = codecs.open(sys.argv[1],encoding="utf8",mode="r")
code=list(source_file)

ready_code = preparation(code)

print hack(ready_code,"\youpie\n")
print "For your informations, the following macros were found at the
begining of text lines"
for m in found_macros:
print m

================ FIN DU CODE ========================

Le programme prend un argument le nom d'un fichier tex et retourne (à
l'écran) le code contenant des \youpie au début de chaque paragraphe.



J'ai testé sur un cours de math de 114 pages, et je crois que c'est bon.
Ce n'est certainement pas optimisé, et il faut certainement encore
compléter les listes d'environnements à nier ou à traiter.
Je crois aussi qu'il crachera lamentablement sur des sources non en utf8.

Il y a surement plein de cas tangents non traité : par exemple un \par
ou des \\ explicites au beau milieu d'une ligne.


Bonne semaine
Laurent

PS : Je suis preneur d'un code source de thèse en droit pour voir à quoi
ça ressemble et affiner mon script.

Denis Bitouzé

unread,
Feb 14, 2012, 6:03:38 AM2/14/12
to
Le lundi 13/02/12 à 09h33,
Laurent Claessens <moky...@gmail.com> a écrit :

> C'est pas tout à fait clair parce que nous ne sommes pas en train de
> parler de paragraphes au sens de LaTeX, mais au sens des «consignes
> données à une doctorante en droit»; si ça se trouve la différence est
> suffisante pour que TeX ne soit pas le bon outil.

Pas faux. Cependant, les exceptions que tu gères dans ton script python
de façon nécessairement manuelle devraient pouvoir l'être également
dans TeX me semble-t-il.

> Quoi qu'il en soit, j'ai écrit ceci :
>
> [...]

C'est beau !

> Le programme prend un argument le nom d'un fichier tex et retourne (à
> l'écran) le code contenant des \youpie au début de chaque paragraphe.

Intéressant ! Je vais le soumettre à l'étudiante.

> J'ai testé sur un cours de math de 114 pages, et je crois que c'est
> bon. Ce n'est certainement pas optimisé, et il faut certainement
> encore compléter les listes d'environnements à nier ou à traiter.

Oui, comme il faudrait le faire sous TeX ;)

> Je crois aussi qu'il crachera lamentablement sur des sources non en
> utf8.

Ce n'est pas un problème : je recommande vivement l'UTF-8 à ceux que je
forme à LaTeX.

> Il y a surement plein de cas tangents non traité : par exemple un
> \par ou des \\ explicites au beau milieu d'une ligne.

Yep.

> Bonne semaine

De même.

> PS : Je suis preneur d'un code source de thèse en droit pour voir à
> quoi ça ressemble et affiner mon script.

Je vais lui demander si je peux te transmettre celle qu'elle m'a
envoyée. Enfin, ça ne sera pas un code source, c'est le .pdf d'un
document créé sous Word. (Ton adresse est-elle valide ?)

Au fait, j'ai découvert une excellente classe LaTeX pour les documents,
notamment les thèses, en droit francophones :

https://bitbucket.org/Yveu/latex-droit-fr/overview

qui, pour ces paragraphes numérotés (qu'il appelle à juste titre des
versets), utilise un sous-niveau de \subsubsection (facile à créer avec
memoir qui sert de base à cette classe) qui n'a pas de titre mais qui
ajoute donc un numéro automatiquement au début de chaque « verset ».

J'ai contacté l'auteur et nous allons essayer de conjuguer nos efforts.
--
Denis

0 new messages