Jumlah kata untuk LaTeX dalam emacs

19

Saya ingin menghitung berapa kata dalam dokumen LaTeX saya. Saya dapat melakukan ini dengan pergi ke situs web untuk paket texcount dan menggunakan antarmuka web di sana. tapi itu tidak ideal.

Saya lebih suka memiliki beberapa cara pintas di dalam emacs untuk mengembalikan jumlah kata dalam file (atau jumlah kata dalam file dan semua file yang dipanggil oleh \inputatau \includedi dalam dokumen). Saya telah mengunduh skrip texcount, tetapi saya tidak tahu apa yang harus saya lakukan dengannya. Yaitu, saya tidak tahu di mana harus meletakkan .plfile, dan bagaimana menyebutnya dalam emacs.

Yaitu: Saya ingin pintasan keyboard untuk perintah shell. Dan saya ingin perintah shell untuk menjalankan texcount pada buffer aktif saat ini dan mengembalikan kata-kata total dalam minibuffer.

Saya menggunakan Ubuntu dan emacs22, jika itu membantu ...

Seamus
sumber

Jawaban:

15

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

Anda dapat memilih untuk menempatkan texcount.pl di tempat lain selain / usr / local / bin, cukup modifikasi kode yang sesuai jika Anda melakukannya. Ini menciptakan perintah baru "Mx latex-word-count", yang akan menjalankan texcount.pl pada file saat ini (ini akan memberikan hasil yang salah jika Anda belum menyimpan file tersebut). Anda dapat menghapus tanda koma dan mengganti teks pengisi dengan argumen baris perintah apa pun yang ingin Anda gunakan, jika ada. Anda dapat mengikat ini ke perintah keyboard dengan sesuatu seperti ini di .emacs Anda:

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

Halaman yang menjelaskan cara menginstal texcount ada di sini: texcount faq . Versi pendek:

sudo cp texcount.pl /usr/local/bin/texcount.pl
atau sebagai alternatif Anda dapat melakukan apa yang mereka rekomendasikan dan cukup beri nama texcount, dan perbarui kode dengan tepat.

Justin Smith
sumber
Jika Anda ingin memasukkan \ input dan \ termasuk file dalam total, tambahkan "-inc" ke opsi Anda.
Seamus
11

Berikut ini adalah versi yang sedikit lebih bagus dari skrip di atas (menangani spasi dalam nama file, menghasilkan output satu baris, dll ...) LaTeXHooks adalah untuk 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)
Nicholas Riley
sumber
2

Versi pendek: M-! texcount <file.tex> RET

Saya hanya akan menggunakan emacs termasuk shell-commandyang

M-! <cmd> RET

bersama dengan texcount(texcount.pl) yang diinstal dengan sebagian besar distribusi lateks. Saat mengedit dokumen Anda cukup tekan M-!enter texcount <tex-file>dan tekan kembali.

Mengalir
sumber
1
Ini juga cara tercepat untuk saya. Terima kasih!
Jimi Oke
2

Kombinasi mudah dari solusi lain yang diposting di sini adalah:

(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
sumber
2

Untuk referensi di masa mendatang, beberapa jawaban ini akan ditingkatkan dengan menggunakan fungsi argumen-penawaran-shell untuk memastikan bahwa spasi dan pemformatan lucu lainnya dalam nama file akan ditangani dengan benar. Misalnya, untuk meningkatkan jawaban 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)
Eric Greenwood
sumber
1

Anda juga dapat menggunakan bawaan M-x tex-count-words. Untuk membuat pintasan keyboard, tambahkan berikut ini ke.emacs

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

Saya tidak tahu apakah ini akan membantu siapa pun, tetapi ketika saya sedang menulis tesis saya, saya ingin melakukan dua hal; (1) hitung jumlah kata untuk seluruh tesis (bukan satu bab), dan (2) gunakan skrip penghitung khusus. Maksudnya adalah bahwa ia akan menghindari bagian-bagian seperti abstrak, deklarasi, dll. Dan hanya memilih bab-bab yang relevan.

Hitung kata-kata dari file master

Solusi di sini sederhana; mencari tahu apakah file yang kita gunakan adalah file master, jika tidak, kirimkan ke 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)))

Gunakan skrip khusus

Saya melakukannya dengan menambahkan custom-tex-countervariabel lokal ke file yang disertakan yang menunjuk ke skrip bash yang bertanggung jawab untuk penghitungan kata.

  • Nyatakan variabel khusus

    (defvar custom-tex-counter nil)
    (make-variable-buffer-local 'custom-tex-counter)
    (put 'custom-tex-counter 'safe-local-variable #'stringp)
    
  • Tambahkan path di variabel lokal (akhir .texfile)

    %%% Local Variables:
    %%% mode: latex
    %%% TeX-master: "../thesis"
    %%% custom-tex-counter: "../count_words -t"
    %%% End:
    
  • Menyatukannya dengan yang di atas

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

Untuk referensi inilah yang terlihat seperti skrip kustom saya (jangan lupa untuk membuatnya dapat dieksekusi):

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

Pada dasarnya, satu-satunya hal yang dilakukan adalah grepbab dan lampiran yang tidak dikomentari dari file master dan menghitung kata-kata di sana.

Anda dapat mengubah regex untuk setiap proyek agar sesuai dengan struktur yang Anda gunakan tetapi, jika Anda secara konsisten menggunakan struktur yang sama, Anda dapat meletakkan skrip bash di suatu tempat di jalur Anda dan menjadikannya variabel global dalam emacs alih-alih yang lokal.

dalikan
sumber