Eu não sei se isso ajudaria alguém, mas quando eu estava escrevendo minha tese eu 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 contador personalizado. O ponto para este último é que ele evitaria seções como resumos, declarações, etc. e apenas selecionaria os capítulos relevantes.
Contar palavras do arquivo mestre
A solução aqui foi simples; descubra se o arquivo em que estamos é o principal, caso contrário, envie 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
Eu fiz isso adicionando uma variável custom-tex-counter
local ao arquivo incluído apontando para o script bash que era 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 (fim do arquivo .tex
)
%%% Local Variables:
%%% mode: latex
%%% TeX-master: "../thesis"
%%% custom-tex-counter: "../count_words -t"
%%% End:
-
Colocando tudo 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 ficou meu script personalizado (não 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 é grep
dos capítulos e apêndices não comentados do arquivo mestre e contar as palavras lá.
Você pode alterar o regex de cada projeto para corresponder à estrutura que está usando, mas, se usar consistentemente a mesma estrutura, poderá colocar o script em algum lugar do caminho e torná-lo uma variável global no emacs em vez de local um.