Emacs içindeki LaTeX için kelime sayısı


19

LaTeX dokümanımın içinde kaç kelime olduğunu saymak istiyorum. Bunu texcount paketi için web sitesine gidip orada web arayüzünü kullanarak yapabilirim. ama bu ideal değil.

Sadece bir dosyadaki (veya ideal olarak dosyadaki ve belge tarafından \inputveya \includebelge tarafından çağrılan tüm dosyalardaki kelime sayısı) sözcük sayısını döndürmek için emacs içinde bazı kısayol var . Texcount betiğini indirdim, ancak bununla ne yapacağımı bilmiyorum. Yani, .pldosyayı nereye koyacağımı ve emacs içinde nasıl çağıracağımı bilmiyorum.

Yani: Kabuk komutu için klavye kısayolu istiyorum. Ve o kabuk komutunun aktif aktif arabellek üzerinde texcount çalıştırmasını ve minibuffer'daki toplam kelimeleri döndürmesini istiyorum.

Ubuntu ve emacs22 kullanıyorum, eğer yardımcı olursa ...

Yanıtlar:


15

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

Texcount.pl dosyasını / usr / local / bin dışında bir yere koymayı tercih edebilirsiniz, sadece kodu uygun şekilde değiştirin. Bu, geçerli dosyada texcount.pl çalıştıracak yeni bir "Mx lateks-kelime-sayısı" komutu oluşturur (dosyayı kaydetmediyseniz yanlış sonuç verir). Noktalı virgül kaldırabilir ve dolgu metnini, varsa, kullanmak istediğiniz komut satırı bağımsız değişkenleriyle değiştirebilirsiniz. Bunu, .emac'lerinizde böyle bir şeyle bir klavye komutuna bağlayabilirsiniz:

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

Texcount'un nasıl kurulacağını açıklayan sayfa burada: texcount faq . Kısa versiyon:

sudo cp texcount.pl /usr/local/bin/texcount.pl
veya alternatif olarak önerdikleri gibi yapabilir ve sadece texcount olarak adlandırıp kodu uygun şekilde güncelleyebilirsiniz.


\ İnput ve \ files dosyalarını total olarak dahil etmek istiyorsanız seçeneklerinize "-inc" ekleyin.
Seamus

11

Yukarıdaki komut dosyasının biraz daha güzel bir sürümü (dosya adlarındaki boşlukları işler, tek satırlık çıktılar üretir, vb.) LaTeXKancalar AuCTeX içindir.

(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

Kısa versiyon: M-! texcount <file.tex> RET

Ben sadece dahil Emacs'ı kullanmak istiyorum shell-commandhangi

M-! <cmd> RET

texcountçoğu lateks dağılımıyla kurulan (texcount.pl) ile birlikte . Belgenizi düzenlerken sadece M-!enter tuşuna basın texcount <tex-file>ve return tuşuna basın .


1
Benim için de en hızlı yol buydu. Teşekkürler!
Jimi Oke

2

Burada yayınlanan diğer çözümlerin kolay bir kombinasyonu:

(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

Gelecekte başvurmak üzere , bu yanıtların birkaçı , dosya adındaki boşlukların ve diğer komik biçimlendirmelerin doğru bir şekilde işlenmesini sağlamak için kabuk-alıntı-bağımsız değişken işlevini kullanarak geliştirilecektir . Örneğin, plgx'in cevabını iyileştirmek için:

(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

Yerleşik olanı da kullanabilirsiniz M-x tex-count-words. Klavye kısayolu yapmak için aşağıdakileri ekleyin:.emacs

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

0

Bunun kimseye yardım edip etmeyeceğini bilmiyorum, ama tezimi yazarken iki şey yapmak istedim; (1) tüm tez için sözcük sayısını (tek bir bölüm yerine) sayın ve (2) özel bir sayaç komut dosyası kullanın. İkincisi için nokta, özetler, bildiriler vb. Bölümlerden kaçınması ve sadece ilgili bölümleri seçmesiydi.

Ana dosyadaki kelimeleri sayma

Buradaki çözüm basitti; İçinde bulunduğumuz dosyanın ana dosya olup olmadığını anlayın, aksi takdirde bunu gönderin 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)))

Özel komut dosyası kullanma

Bunu, custom-tex-counterkelime sayımından sorumlu olan bash betiğine işaret eden dosyaya yerel bir değişken ekleyerek yaptım .

  • Özel değişkeni bildirin

    (defvar custom-tex-counter nil)
    (make-variable-buffer-local 'custom-tex-counter)
    (put 'custom-tex-counter 'safe-local-variable #'stringp)
    
  • Yerel değişkenlere yol ekleyin ( .texdosya sonu )

    %%% Local Variables:
    %%% mode: latex
    %%% TeX-master: "../thesis"
    %%% custom-tex-counter: "../count_words -t"
    %%% End:
    
  • Yukarıdakilerle bir araya getirmek

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

Referans için benim özel komut dosyası neye benzediğini (çalıştırılabilir yapmayı unutmayın):

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

Temel olarak, bunun tek yaptığı, grepana dosyadaki yorumlanmamış bölümlere ve eklere ve sözleri orada saymaktır.

Her projenin normal ifadesini, kullandığınız yapıya uyacak şekilde değiştirebilirsiniz, ancak sürekli olarak aynı yapıyı kullanırsanız, bash betiğini yolunuzda bir yere koyabilir ve emacs'ta yerel yerine global bir değişken yapabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.