Кількість слів для LaTeX в emacs


19

Я хочу порахувати, скільки слів містить мій документ LaTeX. Я можу це зробити, перейшовши на веб-сайт за текстовим пакетом та використовуючи там веб-інтерфейс. але це не ідеально.

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

Тобто: я хочу комбінацію клавіш для команди оболонки. І я хочу, щоб команда оболонки запустила texcount на поточному активному буфері і повернула загальні слова в minibuffer.

Я використовую 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-count-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
або ви можете зробити так, як вони рекомендують, і просто назвати його текстовим рахунком та оновити код належним чином.


Якщо ви хочете включити \ input та \ включити файли до загальної кількості, додайте до своїх параметрів "-inc".
Seamus

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)

2

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

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 замість локальної.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.