คำนับสำหรับ LaTeX ภายใน emacs


19

ฉันต้องการนับว่าเอกสาร LaTeX ของฉันมีอยู่กี่คำ ฉันสามารถทำได้โดยไปที่เว็บไซต์สำหรับแพ็คเกจ texcountและใช้เว็บอินเตอร์เฟสที่นั่น แต่นั่นไม่เหมาะ

ฉันควรมีทางลัดภายใน 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-word-count" ซึ่งจะรัน texcount.pl ในไฟล์ปัจจุบัน (มันจะให้ผลที่ไม่ถูกต้องหากคุณยังไม่ได้บันทึกไฟล์) คุณสามารถลบเครื่องหมายอัฒภาคและแทนที่ข้อความตัวเติมด้วยอาร์กิวเมนต์บรรทัดคำสั่งใด ๆ ที่คุณต้องการใช้ถ้ามี คุณสามารถผูกสิ่งนี้กับคำสั่งแป้นพิมพ์ด้วยสิ่งนี้ใน. emacs ของคุณ:

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

หน้าซึ่งจะอธิบายวิธีการติดตั้ง texcount อยู่ที่นี่: คำถามที่พบบ่อย texcount เวอร์ชั่นสั้น:

sudo cp texcount.pl /usr/local/bin/texcount.pl
หรือคุณสามารถทำตามที่พวกเขาแนะนำและตั้งชื่อมันว่า texcount และอัพเดทรหัสอย่างเหมาะสม


หากคุณต้องการรวมไฟล์ \ input และ \ include ในผลรวมให้เพิ่ม "-inc" ในตัวเลือกของคุณ
เชมัส

11

ต่อไปนี้เป็นเวอร์ชันที่เหนือกว่าเล็กน้อยของสคริปต์ด้านบน (จัดการช่องว่างในชื่อไฟล์สร้างเอาต์พุตหนึ่งบรรทัดและอื่น ๆ ... ) LaTeXhooks สำหรับ 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
นี่เป็นวิธีที่เร็วที่สุดที่จะไปหาฉันเช่นกัน ขอบคุณ!
Jimi Oke

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ตัวแปรท้องถิ่นลงในไฟล์ที่รวมอยู่ซึ่งชี้ไปที่สคริปต์ทุบตีที่รับผิดชอบการนับคำ

  • ประกาศตัวแปรที่กำหนดเอง

    (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บทที่ไม่มีความคิดเห็นและภาคผนวกจากไฟล์ต้นแบบและนับจำนวนคำที่มี

คุณสามารถเปลี่ยน regex สำหรับแต่ละโครงการเพื่อให้ตรงกับโครงสร้างที่คุณกำลังใช้ แต่ถ้าคุณใช้โครงสร้างเดียวกันอย่างสม่ำเสมอคุณสามารถใส่ bash script ที่ใดที่หนึ่งในเส้นทางของคุณและทำให้มันเป็นตัวแปรทั่วโลกใน emacs แทนที่จะเป็นหนึ่งในท้องถิ่น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.