Số từ cho LaTeX trong emacs


19

Tôi muốn đếm xem tài liệu LaTeX của tôi có bao nhiêu từ. Tôi có thể làm điều này bằng cách truy cập trang web cho gói texcount và sử dụng giao diện web ở đó. nhưng đó không phải là lý tưởng.

Tôi muốn có một số phím tắt trong emacs để chỉ trả về số lượng từ trong một tệp (hoặc số lượng từ lý tưởng trong tệp và trong tất cả các tệp được gọi bởi \inputhoặc \includetrong tài liệu). Tôi đã tải xuống tập lệnh texcount, nhưng tôi không biết phải làm gì với nó. Đó là, tôi không biết đặt .pltệp ở đâu và cách gọi nó trong emacs.

Đó là: Tôi muốn một phím tắt cho lệnh shell. Và tôi muốn lệnh shell đó chạy texcount trên bộ đệm hoạt động hiện tại và trả về tổng số từ trong bộ thu nhỏ.

Tôi đang sử dụng Ubuntu và emacs22, nếu điều đó giúp ...

Câu trả lời:


15

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

Bạn có thể chọn đặt texcount.pl ở một nơi khác ngoài / usr / local / bin, chỉ cần sửa đổi mã cho phù hợp nếu bạn làm như vậy. Điều này tạo ra một lệnh mới "Mx latex-word-Count", sẽ chạy texcount.pl trên tệp hiện tại (nó sẽ cho kết quả sai nếu bạn chưa lưu tệp). Bạn có thể xóa dấu chấm phẩy và thay thế văn bản phụ bằng bất kỳ đối số dòng lệnh nào bạn muốn sử dụng, nếu có. Bạn có thể liên kết điều này với một lệnh bàn phím với một cái gì đó như thế này trong .emacs của bạn:

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

Trang mô tả cách cài đặt texcount tại đây: texcount faq . Phiên bản ngắn:

sudo cp texcount.pl /usr/local/bin/texcount.pl
hoặc cách khác, bạn có thể làm như họ đề xuất và chỉ cần đặt tên là texcount và cập nhật mã một cách thích hợp.


Nếu bạn muốn bao gồm \ input và \ bao gồm các tệp trong tổng số, hãy thêm "-inc" vào các tùy chọn của bạn.
Seamus

11

Đây là phiên bản đẹp hơn của tập lệnh trên (xử lý khoảng trắng trong tên tệp, tạo đầu ra một dòng, v.v ...) Các LaTeXmóc nối dành cho 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

Phiên bản ngắn: M-! texcount <file.tex> RET

Tôi chỉ đơn giản sẽ sử dụng emacs bao gồm shell-commandtrong đó là

M-! <cmd> RET

cùng với texcount(texcount.pl) được cài đặt với hầu hết các bản phân phối latex. Trong khi chỉnh sửa tài liệu của bạn chỉ cần nhấn M-!enter texcount <tex-file>và nhấn return.


1
Đây là cách nhanh nhất để đi cho tôi là tốt. Cảm ơn!
Jimi Oke

2

Một sự kết hợp dễ dàng của các giải pháp khác được đăng ở đây sẽ là:

(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

Để tham khảo trong tương lai, một số câu trả lời sẽ được cải thiện bằng cách sử dụng hàm shell-quote-argument để đảm bảo rằng khoảng trắng và bất kỳ định dạng ngộ nghĩnh nào khác trong tên tệp sẽ được xử lý chính xác. Ví dụ: để cải thiện câu trả lời của 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

Bạn cũng có thể sử dụng tích hợp M-x tex-count-words. Để tạo một phím tắt, thêm phần sau vào.emacs

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

0

Tôi không biết điều này có giúp được ai không, nhưng khi tôi đang viết luận án, tôi muốn làm hai việc; (1) đếm số lượng từ cho toàn bộ luận án (thay vì một chương duy nhất) và (2) sử dụng tập lệnh truy cập tùy chỉnh. Điểm cho cái sau là nó sẽ tránh các phần như tóm tắt, khai báo, v.v. và chỉ chọn các chương liên quan.

Đếm số từ trong tệp chủ

Giải pháp ở đây rất đơn giản; Tìm hiểu xem tập tin chúng tôi đang ở là tập tin chính, nếu không, hãy gửi nó đến 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)))

Sử dụng tập lệnh tùy chỉnh

Tôi đã làm điều đó bằng cách thêm một custom-tex-counterbiến cục bộ vào tệp được bao gồm chỉ vào tập lệnh bash chịu trách nhiệm đếm từ.

  • Khai báo biến tùy chỉnh

    (defvar custom-tex-counter nil)
    (make-variable-buffer-local 'custom-tex-counter)
    (put 'custom-tex-counter 'safe-local-variable #'stringp)
    
  • Thêm đường dẫn trong các biến cục bộ (cuối .textệp)

    %%% Local Variables:
    %%% mode: latex
    %%% TeX-master: "../thesis"
    %%% custom-tex-counter: "../count_words -t"
    %%% End:
    
  • Đặt nó cùng với ở trên

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

Để tham khảo ở đây, kịch bản tùy chỉnh của tôi trông như thế nào (đừng quên làm cho nó có thể thực thi được):

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

Về cơ bản, điều duy nhất làm điều này là grepcác chương và phụ lục không được bình luận từ tệp chính và đếm các từ ở đó.

Bạn có thể thay đổi regex cho từng dự án để phù hợp với cấu trúc bạn đang sử dụng, nhưng, nếu bạn luôn sử dụng cùng một cấu trúc, bạn có thể đặt tập lệnh bash ở đâu đó trong đường dẫn của mình và biến nó thành biến toàn cục trong emacs thay vì cục bộ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.