Nombre de mots pour LaTeX dans emacs

19

Je veux compter le nombre de mots contenus dans mon document LaTeX. Je peux le faire en allant sur le site Web pour le package texcount et en utilisant l'interface Web là-bas. mais ce n'est pas idéal.

Je préfère avoir un raccourci dans emacs pour renvoyer simplement le nombre de mots dans un fichier (ou idéalement le nombre de mots dans le fichier et dans tous les fichiers appelés par \inputou \includedans le document). J'ai téléchargé le script texcount, mais je ne sais pas quoi en faire. Autrement dit, je ne sais pas où placer le .plfichier et comment l'appeler dans emacs.

C'est-à-dire: je veux un raccourci clavier pour une commande shell. Et je veux que cette commande shell exécute texcount sur le tampon actif actuel et renvoie le total des mots dans le mini-tampon.

J'utilise Ubuntu et emacs22, si cela aide ...

Seamus
la source

Réponses:

15

(defun latex-word-count ()
  (interactive)
  (shell-command (concat "/usr/local/bin/texcount.pl "
                         ; "uncomment then options go here "
                         (buffer-file-name))))

Vous pouvez choisir de placer texcount.pl ailleurs que dans / usr / local / bin, modifiez simplement le code comme il convient si vous le faites. Cela crée une nouvelle commande "Mx latex-word-count", qui exécutera texcount.pl sur le fichier actuel (elle donnera le mauvais résultat si vous n'avez pas enregistré le fichier cependant). Vous pouvez supprimer le point-virgule et remplacer le texte de remplissage par tous les arguments de ligne de commande que vous souhaitez utiliser, le cas échéant. Vous pouvez le lier à une commande clavier avec quelque chose comme ceci dans votre .emacs:

(define-key latex-mode-map "\C-cw" 'latex-word-count)

La page qui décrit comment installer texcount est ici: faq texcount . Version courte:

sudo cp texcount.pl /usr/local/bin/texcount.pl
ou bien vous pouvez faire ce qu'ils recommandent et simplement le nommer texcount, et mettre à jour le code de manière appropriée.

Justin Smith
la source
Si vous souhaitez inclure \ input et \ include des fichiers dans le total, ajoutez "-inc" à vos options.
Seamus
11

Voici une version légèrement plus agréable du script ci-dessus (gère les espaces dans les noms de fichiers, produit une sortie sur une ligne, etc ...) Les LaTeXcrochets sont pour AuCTeX.

(defun my-latex-setup ()
  (defun latex-word-count ()
    (interactive)
    (let* ((this-file (buffer-file-name))
           (word-count
            (with-output-to-string
              (with-current-buffer standard-output
                (call-process "texcount" nil t nil "-brief" this-file)))))
      (string-match "\n$" word-count)
      (message (replace-match "" nil nil word-count))))
    (define-key LaTeX-mode-map "\C-cw" 'latex-word-count))
(add-hook 'LaTeX-mode-hook 'my-latex-setup t)
Nicholas Riley
la source
2

Version courte: M-! texcount <file.tex> RET

J'utiliserais simplement emacs inclus shell-commandqui est

M-! <cmd> RET

avec texcount(texcount.pl) qui est installé avec la plupart des distributions de latex. Lors de la modification de votre document, appuyez simplement sur M-!Entrée texcount <tex-file>et sur Retour.

Couler
la source
1
C'était aussi le moyen le plus rapide pour moi. Merci!
Jimi Oke
2

Une combinaison facile d'autres solutions affichées ici serait:

(defun latex-word-count ()
   (interactive)
   (shell-command (concat "texcount " ; my latex installation includes texcount.pl
                       ; "uncomment then options go here, such as "
                       "-unicode "
                       "-inc "
                       (buffer-file-name))) ; better than typing path to current file
)

(define-key LaTeX-mode-map "\C-cw" 'latex-word-count)
plgx
la source
2

Pour référence future, plusieurs de ces réponses seraient améliorées en utilisant la fonction shell-quote-argument pour garantir que les espaces et toute autre mise en forme amusante dans le nom de fichier seraient traités correctement. Par exemple, pour améliorer la réponse de plgx:

(defun latex-word-count ()
   (interactive)
   (shell-command (concat "texcount "
                       ; "uncomment then options go here, such as "
                       "-unicode "
                       "-inc "
                       (shell-quote-argument buffer-file-name))) 
;Now the buffer file name is sent correctly to the shell, 
;regardless of platform
)

(define-key LaTeX-mode-map "\C-cw" 'latex-word-count)
Eric Greenwood
la source
1

Vous pouvez également utiliser le intégré M-x tex-count-words. Pour créer un raccourci clavier, ajoutez ce qui suit à.emacs

(add-hook 'latex-mode-hook
          (lambda () (local-set-key (kbd "C-c C-w") 'tex-count-words)))
fgregg
la source
0

Je ne sais pas si cela aiderait quelqu'un, mais quand j'écrivais ma thèse, je voulais faire deux choses; (1) compter le nombre de mots pour l'ensemble de la thèse (au lieu d'un seul chapitre), et (2) utiliser un contre-script personnalisé. Le point pour ce dernier était qu'il éviterait les sections telles que les résumés, les déclarations, etc. et ne sélectionnerait que les chapitres pertinents.

Compter les mots du fichier maître

La solution ici était simple; déterminer si le fichier dans lequel nous nous trouvons est le fichier principal, sinon, envoyez-le à texcount.

(defun latex-word-count-master ()
  (interactive)
  (if (eq TeX-master t)
      (setq master (buffer-file-name))
    (setq master (concat (expand-file-name TeX-master) ".tex")))
  (shell-command (concat "texcount "
                         "-dir "
                         "-unicode "
                         "-inc "
                         master)))

Utilisez un script personnalisé

Je l'ai fait en ajoutant une custom-tex-countervariable locale au fichier inclus pointant vers le script bash qui était responsable du comptage de mots.

  • Déclarez la variable personnalisée

    (defvar custom-tex-counter nil)
    (make-variable-buffer-local 'custom-tex-counter)
    (put 'custom-tex-counter 'safe-local-variable #'stringp)
    
  • Ajouter le chemin dans les variables locales (fin de .texfichier)

    %%% Local Variables:
    %%% mode: latex
    %%% TeX-master: "../thesis"
    %%% custom-tex-counter: "../count_words -t"
    %%% End:
    
  • Assembler avec ce qui précède

    (defun latex-word-count-alt ()
      (interactive)
      (if (eq TeX-master t)
          (setq master (buffer-file-name))
        (setq master (concat (expand-file-name TeX-master) ".tex")))
      (if (not (eq custom-tex-counter nil))
          (shell-command (concat custom-tex-counter
                                 " "
                                 master))
        (shell-command (concat "texcount "
                               "-dir "
                               "-unicode "
                               "-inc "
                               master))))
    

Pour référence, voici à quoi ressemblait mon script personnalisé (n'oubliez pas de le rendre exécutable):

#!/usr/bin/bash

total='false'

while getopts 't' flag; do
  case "${flag}" in
    t) total='true' ;;
    ?) printf '\nUsage: %s: [-t] \n' $0; exit 2 ;;
  esac
done

shift $(($OPTIND - 1))

TOPATH=$(dirname "${1}")

CHAPTERS=$(while read -r chapter; do
               printf "%s%s.tex\n" "$TOPATH" "/$chapter";
           done < <(grep -Po "^[^%]\s?\\include{\K(Chapter|Appendix)[[:digit:]]+/(chapter|appendix)[[:digit:]]+" "${1}") \
           | paste -sd' ')

if [ "$total" == "false" ]; then
    texcount -unicode -inc $CHAPTERS
else
    texcount -unicode -total -inc $CHAPTERS
fi

Fondamentalement, la seule chose que cela fait est aux grepchapitres et annexes non commentés du fichier maître et compte les mots là-bas.

Vous pouvez modifier l'expression régulière de chaque projet pour qu'elle corresponde à la structure que vous utilisez mais, si vous utilisez systématiquement la même structure, vous pouvez placer le script bash quelque part sur votre chemin et en faire une variable globale dans emacs au lieu d'une variable locale.

dalikan
la source