[Lualatex] Compter les mots dans un document

Tout ce qui concerne le langage TeX/LaTeX et ses variantes. Ce langage est utilisable sur le forum via les balises tex.
[participation réservée aux membres inscrits]
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.
MB
Administrateur
Administrateur
Messages : 7898
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

[Lualatex] Compter les mots dans un document

Message non lu par MB »

Encore un exemple inspiré du paquet chickenize, qui permet de compter et d'afficher le nombre de mots dans un document. Cette valeur est affichée à la fois en bas de la dernière page du document et à la fin log (via le callback "stop_run").

Code : Tout sélectionner

\documentclass{article}
\usepackage{luacode,lipsum,xcolor}
\begin{luacode}
wordnumber = 0

function countwords(head)
    for glyph in node.traverse_glyph(head) do
        if glyph.next.id == node.id("glue") then
             wordnumber = wordnumber+1
        end
    end
    wordnumber = wordnumber+1
    return head
end

function printwordnumber()
    texio.write_nl("wordnumber=" .. wordnumber)
end

luatexbase.add_to_callback("pre_linebreak_filter",countwords,"countwords")
luatexbase.add_to_callback("stop_run",printwordnumber,"printwordnumber")
\end{luacode}
\AtEndDocument{\par\vfill\hfill\textcolor{red}{[wordnumber=\directlua{tex.sprint(wordnumber) wordnumber=wordnumber-1}]}}
\begin{document}

\lipsum[1-4]

\end{document}
wordnumber.png
MB. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
projetmbc
Utilisateur chevronné
Utilisateur chevronné
Messages : 2150
Inscription : samedi 29 décembre 2007, 00:58

Re: [lualatex] Exemples d'utilisation

Message non lu par projetmbc »

Bonjour et merci mais pour le coup c'est très fragile car par exemple on obtient 8 mots dans le cas suivant.

Code : Tout sélectionner

Un, deux et trois mots : $a + b$ .
MB
Administrateur
Administrateur
Messages : 7898
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: [lualatex] Exemples d'utilisation

Message non lu par MB »

Oui car comme on peut le voir le programme considère que les mots sont séparés par des espaces. Ainsi le texte a . b compte comme trois mots.

Il faudrait affiner les choses si besoin, mais ça doit fonctionner assez correctement pour des textes classiques et correctement typographiés. Pour les formules mathématiques il faudrait d'ailleurs préciser la notion de mot.
MB. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
projetmbc
Utilisateur chevronné
Utilisateur chevronné
Messages : 2150
Inscription : samedi 29 décembre 2007, 00:58

Re: [lualatex] Exemples d'utilisation

Message non lu par projetmbc »

J'aurais tendance à ignorer les formules.

Sais-tu repérer ce genre de chose en LuaTeX ?
MB
Administrateur
Administrateur
Messages : 7898
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: [lualatex] Exemples d'utilisation

Message non lu par MB »

Je propose éventuellement code suivant, qui compte 6 mots.

On utilise le fait que le mode math débute par un noeud de type math et de sous-type 0 et se termine par un noeud de type math et de sous-type 1.

Code : Tout sélectionner

\documentclass{article}
\usepackage{luacode,lipsum,xcolor}
\begin{luacode}
wordnumber = 0

function countwords(head)
    local mathmode = false
    for n in node.traverse(head) do
        if n.id == node.id("math") then
            mathmode = (n.subtype == 0)
        elseif (n.id == node.id("glyph") and n.next.id == node.id("glue") and not mathmode) then
            wordnumber = wordnumber+1
        end
    end
    wordnumber = wordnumber+1
    return head
end

function printwordnumber()
    texio.write_nl("wordnumber=" .. wordnumber)
end

luatexbase.add_to_callback("pre_linebreak_filter",countwords,"countwords")
luatexbase.add_to_callback("stop_run",printwordnumber,"printwordnumber")
\end{luacode}
\AtEndDocument{\par\vfill\hfill\textcolor{red}{[wordnumber=\directlua{tex.sprint(wordnumber) wordnumber=wordnumber-1}]}}
\begin{document}

Voici une formule $a+b=c$ entourée de texte.

\end{document}
Il resterait à gérer le problème du cas Voici une formule $a+b=c$. qui compterait 4 mots (à cause du point final), mais l'objectif de ce topic n'est que de mettre en évidence certaines fonctionnalités de lualatex.
MB. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
MB
Administrateur
Administrateur
Messages : 7898
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: [lualatex] Exemples d'utilisation

Message non lu par MB »

J'en profite pour signaler le paquet nodetree qui permet d'afficher la liste des noeuds avec certaines de leurs caractéristiques.

Code : Tout sélectionner

\documentclass{article}
\usepackage{nodetree}
\begin{document}
Voici une formule $a+b=c$.
\end{document}
nodetree.png
MB. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
projetmbc
Utilisateur chevronné
Utilisateur chevronné
Messages : 2150
Inscription : samedi 29 décembre 2007, 00:58

Re: [lualatex] Exemples d'utilisation

Message non lu par projetmbc »

Super.

Je creuserais de mon côté le comptage.