Количество слов для LaTeX в Emacs

19

Я хочу посчитать, сколько слов в нем содержится в моем документе LaTeX. Я могу сделать это, перейдя на веб-сайт для пакета texcount и используя там веб-интерфейс. но это не идеально.

Я бы предпочел, чтобы в emacs был ярлык, который бы просто возвращал количество слов в файле (или, в идеале, количество слов в файле и во всех файлах, вызываемых в документе \inputили \includeвнутри него). Я скачал скрипт texcount, но я не знаю, что с ним делать. То есть я не знаю, куда поместить .plфайл и как его вызвать в emacs.

То есть: я хочу сочетание клавиш для команды оболочки. И я хочу, чтобы эта команда оболочки запустила texcount в текущем активном буфере и вернула общее количество слов в минибуфере.

Я использую Ubuntu и emacs22, если это поможет ...

Симус
источник

Ответы:

15

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

Вы можете поместить texcount.pl где-то, кроме / usr / local / bin, просто измените код, если это необходимо. Это создаст новую команду «Mx latex-word-count», которая запустит texcount.pl для текущего файла (однако, если вы не сохранили файл, вы получите неверный результат). Вы можете удалить точку с запятой и заменить текст-заполнитель на любые аргументы командной строки, которые вы хотите использовать, если они есть. Вы можете связать это с клавиатурной командой с помощью чего-то подобного в вашем .emacs:

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

Страница, которая описывает, как установить texcount, находится здесь: texcount faq . Укороченная версия:

sudo cp texcount.pl /usr/local/bin/texcount.pl
или же вы можете сделать так, как они рекомендуют, и просто назвать его texcount и соответствующим образом обновить код.

Джастин смит
источник
Если вы хотите включить в итоговые файлы \ input и \ include, добавьте «-inc» к вашим параметрам.
Симус
11

Вот немного более приятная версия вышеупомянутого скрипта (обрабатывает пробелы в именах файлов, производит вывод в одну строку и т. Д.). LaTeXХуки предназначены для 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

Укороченная версия: M-! texcount <file.tex> RET

Я бы просто использовал Emacs, shell-commandкоторый

M-! <cmd> RET

вместе с texcount(texcount.pl), который устанавливается с большинством латексных дистрибутивов. Во время редактирования документа просто нажмите M-!Enter texcount <tex-file>и нажмите Return.

поток
источник
1
Это был самый быстрый путь для меня. Благодарность!
Джими Оке
2

Простая комбинация других решений, размещенных здесь, будет:

(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
источник
2

Для дальнейшего использования некоторые из этих ответов будут улучшены с помощью функции shell-quote-arguments, чтобы гарантировать правильную обработку пробелов и любого другого забавного форматирования в имени файла. Например, чтобы улучшить ответ 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

Вы также можете использовать встроенный M-x tex-count-words. Чтобы сделать сочетание клавиш, добавьте следующее в.emacs

(add-hook 'latex-mode-hook
          (lambda () (local-set-key (kbd "C-c C-w") 'tex-count-words)))
fgregg
источник
0

Я не знаю, поможет ли это кому-нибудь, но когда я писал свою диссертацию, я хотел сделать две вещи; (1) подсчитать количество слов для всего тезиса (вместо одной главы), и (2) использовать собственный сценарий счетчика. Суть последнего заключалась в том, что он избегал таких разделов, как рефераты, объявления и т. Д., И выбирал только соответствующие главы.

Подсчет слов из мастер-файла

Решение здесь было простым; выясните, является ли файл, в котором мы находимся, основным, в противном случае отправьте его 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)))

Используйте собственный скрипт

Я сделал это, добавив custom-tex-counterлокальную переменную во включенный файл, указывающий на скрипт bash, отвечающий за подсчет слов.

  • Объявите пользовательскую переменную

    (defvar custom-tex-counter nil)
    (make-variable-buffer-local 'custom-tex-counter)
    (put 'custom-tex-counter 'safe-local-variable #'stringp)
    
  • Добавить путь в локальные переменные (конец .texфайла)

    %%% Local Variables:
    %%% mode: latex
    %%% TeX-master: "../thesis"
    %%% custom-tex-counter: "../count_words -t"
    %%% End:
    
  • Соединяя это с вышеупомянутым

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

Для справки вот как выглядел мой пользовательский скрипт (не забудьте сделать его исполняемым):

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

По сути, единственное, что это делает, - grepэто некомментированные главы и приложения из мастер-файла и подсчет там слов.

Вы можете изменить регулярное выражение для каждого проекта, чтобы оно соответствовало используемой структуре, но, если вы постоянно используете одну и ту же структуру, вы можете поместить сценарий bash где-нибудь на вашем пути и сделать его глобальной переменной в emacs вместо локальной.

dalikan
источник