Emacs के भीतर LaTeX के लिए शब्द गणना


19

मैं गिनती करना चाहता हूं कि मेरे लाटेक्स दस्तावेज़ में कितने शब्द हैं। मैं टेक्सकाउंट पैकेज के लिए वेबसाइट पर जाकर और वहां वेब इंटरफेस का उपयोग करके ऐसा कर सकता हूं । लेकिन यह आदर्श नहीं है।

मैं बल्कि Emacs में कुछ शॉर्टकट्स को फ़ाइल में शब्दों की संख्या (या फ़ाइल में शब्दों की आदर्श संख्या और दस्तावेज़ में \inputया उसके \includeभीतर मौजूद सभी फ़ाइलों में वापस आ सकता हूं) में रखूँगा । मैंने टेक्सकाउंट स्क्रिप्ट डाउनलोड की है, लेकिन मुझे नहीं पता कि इसके साथ क्या करना है। यही है, मुझे नहीं पता कि .plफ़ाइल कहाँ रखनी है, और इसे emacs के भीतर कैसे कॉल करना है।

वह यह है: मैं एक शेल कमांड के लिए एक कीबोर्ड शॉर्टकट चाहता हूं। और मुझे लगता है कि शेल कमांड चालू सक्रिय बफर पर टेक्सकाउंट चलाने के लिए और मिनीबफ़र में कुल शब्दों को वापस करना चाहता है।

मैं Ubuntu और emacs22 का उपयोग कर रहा हूँ, अगर यह मदद करता है ...

जवाबों:


15

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

आप / usr / लोकल / बिन के अलावा कहीं और भी texcount.pl लगाने का विकल्प चुन सकते हैं, यदि आप चाहें तो कोड को उपयुक्त रूप से संशोधित कर सकते हैं। यह एक नया कमांड "Mx लेटेक्स-वर्ड-काउंट" बनाता है, जो करंट फाइल पर texcount.pl चलाएगा (यदि आपने हालांकि फाइल को सेव नहीं किया है तो यह गलत परिणाम देगा)। आप अर्धविराम को हटा सकते हैं और भरण पाठ को किसी भी कमांड लाइन के तर्क के साथ बदल सकते हैं जिसका आप उपयोग करना चाहते हैं, यदि कोई हो। आप इसे अपने .emacs में कुछ इस तरह से कीबोर्ड कमांड से बांध सकते हैं:

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

पृष्ठ जो टेक्सकाउंट स्थापित करने का तरीका बताता है, वह यहां है: टेक्सकाउंट faq । लघु संस्करण:

sudo cp texcount.pl /usr/local/bin/texcount.pl
या वैकल्पिक रूप से आप ऐसा कर सकते हैं जैसा कि वे अनुशंसा करते हैं और बस इसे टेक्सकाउंट नाम देते हैं, और कोड को उचित रूप से अपडेट करते हैं।


यदि आप \ इनपुट और \ को कुल में शामिल करना चाहते हैं, तो अपने विकल्पों में "-inc" जोड़ें।
सीमस

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-!दर्ज करें texcount <tex-file>और वापसी करें।


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

भविष्य के संदर्भ के लिए, इनमें से कई उत्तरों को शेल-कोट-तर्क फ़ंक्शन का उपयोग करके सुधार किया जाएगा ताकि यह सुनिश्चित किया जा सके कि फ़ाइल नाम में रिक्त स्थान और किसी भी अन्य अजीब स्वरूपण को सही तरीके से संभाला जाएगा। उदाहरण के लिए, प्लेग के उत्तर पर सुधार करने के लिए:

(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बाश लिपि की ओर इशारा करते हुए शामिल फ़ाइल में एक स्थानीय चर जोड़कर जो शब्द गिनती के लिए जिम्मेदार था।

  • कस्टम चर घोषित करें

    (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है जो मास्टर फ़ाइल से गैर-टिप्पणी किए गए अध्यायों और परिशिष्टों के लिए है और वहां शब्दों को गिनें।

आप जिस संरचना का उपयोग कर रहे हैं, उससे मेल खाने के लिए प्रत्येक प्रोजेक्ट के लिए रेगेक्स को बदल सकते हैं, लेकिन यदि आप लगातार एक ही संरचना का उपयोग करते हैं, तो आप बैश स्क्रिप्ट को अपने रास्ते में कहीं रख सकते हैं और इसे स्थानीय के बजाय emacs में एक वैश्विक चर बना सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.