Количество слов для LaTeX в Emacs
Я хочу посчитать, сколько слов в нем содержится в моем документе LaTeX. Я могу сделать это, перейдя на веб-сайт для пакета texcount и используя там веб-интерфейс. но это не идеально.
Я бы предпочел, чтобы в emacs был ярлык для возврата количества слов в файле (или, в идеале, количества слов в файле и во всех файлах, вызываемых \input
или же \include
в документе). Я скачал скрипт texcount, но я не знаю, что с ним делать. То есть я не знаю, где поставить .pl
файл, и как вызвать его в Emacs.
То есть: я хочу сочетание клавиш для команды оболочки. И я хочу, чтобы эта команда оболочки запустила texcount в текущем активном буфере и вернула общее количество слов в минибуфере.
Я использую Ubuntu и emacs22, если это поможет...
7 ответов
(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. Укороченная версия:
или же вы можете сделать так, как они рекомендуют, и просто назвать его texcount и соответствующим образом обновить код.sudo cp texcount.pl /usr/local/bin/texcount.pl
Вот немного более приятная версия вышеупомянутого сценария (обрабатывает пробелы в именах файлов, производит вывод в одну строку и т. Д.) 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)
Укороченная версия:M-! texcount <file.tex> RET
Я бы просто использовал Emacs в комплекте shell-command
который
M-! <cmd> RET
вместе с texcount
(texcount.pl), который устанавливается с большинством латексных дистрибутивов. Во время редактирования документа просто нажмите M-!
войти texcount <tex-file>
и ударил в ответ.
Для дальнейшего использования некоторые из этих ответов будут улучшены с помощью функции 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)
Простая комбинация других решений, размещенных здесь, будет:
(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)
Вы также можете использовать встроенный M-x tex-count-words
, Чтобы сделать сочетание клавиш, добавьте следующее в .emacs
(add-hook 'latex-mode-hook
(lambda () (local-set-key (kbd "C-c C-w") 'tex-count-words)))
Я не знаю, поможет ли это кому-нибудь, но когда я писал свою диссертацию, я хотел сделать две вещи; (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 вместо локальной.