Contagem de palavras para LaTeX no emacs


19

Quero contar quantas palavras meu documento LaTeX contém. Eu posso fazer isso acessando o site do pacote texcount e usando a interface da Web. mas isso não é o ideal.

Eu prefiro ter algum atalho no emacs para retornar apenas o número de palavras em um arquivo (ou o número ideal de palavras em um arquivo e em todos os arquivos chamados por \inputou \includedentro do documento). Fiz o download do script texcount, mas não sei o que fazer com ele. Ou seja, não sei onde colocar o .plarquivo e como chamá-lo no emacs.

Ou seja: eu quero um atalho de teclado para um comando shell. E eu quero que esse comando shell execute texcount no buffer ativo atual e retorne o total de palavras no minibuffer.

Estou usando o Ubuntu e emacs22, se isso ajudar ...

Respostas:


15

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

Você pode colocar o texcount.pl em outro lugar que não seja / usr / local / bin, apenas modifique o código conforme o caso. Isso cria um novo comando "Mx latex-word-count", que executará texcount.pl no arquivo atual (ele fornecerá o resultado errado se você não salvou o arquivo). Você pode remover o ponto-e-vírgula e substituir o texto do preenchimento por qualquer argumento da linha de comando que desejar usar, se houver. Você pode vincular isso a um comando do teclado com algo assim no seu .emacs:

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

A página que descreve como instalar o texcount está aqui: texcount faq . Versão curta:

sudo cp texcount.pl /usr/local/bin/texcount.pl
ou, como alternativa, você pode fazer o que eles recomendam e simplesmente nomeá-lo como texcount e atualizar o código adequadamente.


Se você deseja incluir \ input e \ include arquivos no total, adicione "-inc" às suas opções.
— Seamus

11

Aqui está uma versão um pouco mais agradável do script acima (manipula espaços nos nomes de arquivos, produz saída em uma linha, etc ...) Os LaTeXganchos são para o 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)

2

Versão curta: M-! texcount <file.tex> RET

Eu simplesmente usaria o emacs incluído, shell-commandque é

M-! <cmd> RET

junto com texcount(texcount.pl), que é instalado com a maioria das distribuições de látex. Durante a edição do documento, basta pressionar M-!Enter texcount <tex-file>e Return.


11
Este foi o caminho mais rápido para mim também. Obrigado!
— Jimi Oke

2

Uma combinação fácil de outras soluções postadas aqui seria:

(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)

2

Para referência futura, várias dessas respostas seriam aprimoradas usando a função shell-quote-argument para garantir que os espaços e qualquer outra formatação engraçada no nome do arquivo sejam manipulados corretamente. Por exemplo, para melhorar a resposta do 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)

1

Você também pode usar o incorporado M-x tex-count-words. Para criar um atalho de teclado, adicione o seguinte a.emacs

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

0

Não sei se isso ajudaria alguém, mas quando estava escrevendo minha tese, queria fazer duas coisas; (1) conte o número de palavras para toda a tese (em vez de um único capítulo) e (2) use um script de contador personalizado. O ponto principal foi que ele evitaria seções como resumos, declarações etc. e selecionaria apenas os capítulos relevantes.

Contar palavras do arquivo mestre

A solução aqui foi simples; descobrir se o arquivo em que estamos é o principal, caso contrário, envie-o para 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)))

Use um script personalizado

Fiz isso adicionando uma custom-tex-countervariável local ao arquivo incluído, apontando para o script bash, responsável pela contagem de palavras.

  • Declarar a variável personalizada

    (defvar custom-tex-counter nil)
    (make-variable-buffer-local 'custom-tex-counter)
    (put 'custom-tex-counter 'safe-local-variable #'stringp)
    
  • Adicione o caminho nas variáveis ​​locais (final do .texarquivo)

    %%% Local Variables:
    %%% mode: latex
    %%% TeX-master: "../thesis"
    %%% custom-tex-counter: "../count_words -t"
    %%% End:
    
  • Colocando junto com o acima

    (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))))
    

Para referência, veja como era o meu script personalizado (não se esqueça de torná-lo executável):

#!/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

Basicamente, a única coisa que isso faz é grepacessar os capítulos e anexos não comentados do arquivo mestre e contar as palavras.

Você pode alterar o regex de cada projeto para corresponder à estrutura que está usando, mas, se você usar consistentemente a mesma estrutura, poderá colocar o script bash em algum lugar do caminho e torná-lo uma variável global no emacs, em vez de local.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.