Wortzahl für LaTeX innerhalb von Emacs


18

Ich möchte zählen, wie viele Wörter mein LaTeX-Dokument enthält. Ich kann dies tun, indem ich auf die Website für das Texcount-Paket gehe und dort das Webinterface benutze. aber das ist nicht ideal.

Ich hätte lieber eine Abkürzung in Emacs, um nur die Anzahl der Wörter in einer Datei (oder idealerweise die Anzahl der Wörter in der Datei und in allen Dateien, die von \inputoder \includeinnerhalb des Dokuments aufgerufen werden ) zurückzugeben. Ich habe texcount script heruntergeladen, weiß aber nicht, was ich damit anfangen soll. Das heißt, ich weiß nicht, wo ich die .plDatei ablegen soll und wie ich sie in Emacs aufrufen soll.

Das heißt: Ich möchte eine Tastenkombination für einen Shell-Befehl. Und ich möchte, dass dieser Shell-Befehl texcount für den aktuell aktiven Puffer ausführt und die Gesamtzahl der Wörter im Minipuffer zurückgibt.

Ich benutze Ubuntu und emacs22, wenn das hilft ...

Antworten:


14

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

Sie können texcount.pl auch an einem anderen Ort als / usr / local / bin ablegen. Ändern Sie den Code gegebenenfalls. Dadurch wird ein neuer Befehl "Mx latex-word-count" erstellt, der texcount.pl für die aktuelle Datei ausführt (es wird jedoch ein falsches Ergebnis angezeigt, wenn Sie die Datei nicht gespeichert haben). Sie können das Semikolon entfernen und den Fülltext durch die gewünschten Befehlszeilenargumente ersetzen. Sie können dies in Ihren .emacs an einen Tastaturbefehl binden:

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

Die Seite, auf der die Installation von texcount beschrieben wird, ist hier: texcount faq . Kurzfassung:

sudo cp texcount.pl /usr/local/bin/texcount.pl
oder alternativ können Sie tun, was sie empfehlen, und es einfach texcount nennen und den Code entsprechend aktualisieren.


Wenn Sie \ input- und \ include-Dateien in die Gesamtsumme aufnehmen möchten, fügen Sie "-inc" zu Ihren Optionen hinzu.
Seamus

10

Hier ist eine etwas schönere Version des obigen Skripts (behandelt Leerzeichen in Dateinamen, erzeugt eine einzeilige Ausgabe usw.). Die LaTeXHooks sind für 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

Kurzfassung: M-! texcount <file.tex> RET

Ich würde einfach verwenden Emacs enthalten , shell-commanddas ist

M-! <cmd> RET

zusammen mit texcount(texcount.pl), das mit den meisten Latexdistributionen installiert wird. Während Sie Ihr Dokument bearbeiten, drücken Sie einfach die M-!Eingabetaste texcount <tex-file>und die Eingabetaste .


1
Dies war auch für mich der schnellste Weg. Vielen Dank!
Jimi Oke

2

Eine einfache Kombination von anderen hier veröffentlichten Lösungen wäre:

(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

Zum späteren Nachschlagen werden einige dieser Antworten mit der Funktion shell-quote-argument verbessert, um sicherzustellen, dass Leerzeichen und andere komische Formatierungen im Dateinamen korrekt behandelt werden. Zum Beispiel, um die Antwort von plgx zu verbessern:

(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

Sie können auch das eingebaute verwenden M-x tex-count-words. Um eine Tastenkombination zu erstellen, fügen Sie Folgendes zu hinzu.emacs

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

0

Ich weiß nicht, ob dies jemandem helfen würde, aber als ich meine Doktorarbeit schrieb, wollte ich zwei Dinge tun; (1) Zählen Sie die Anzahl der Wörter für die gesamte Arbeit (anstelle eines einzelnen Kapitels), und (2) verwenden Sie ein benutzerdefiniertes Zählerskript. Letzteres bezog sich darauf, Abschnitte wie Zusammenfassungen, Erklärungen usw. zu vermeiden und nur die relevanten Kapitel auszuwählen.

Zähle Wörter aus der Hauptdatei

Die Lösung hier war einfach; Finden Sie heraus, ob die Datei, in der wir uns befinden, die Master-Datei ist, andernfalls senden Sie diese an 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)))

Verwenden Sie ein benutzerdefiniertes Skript

Dazu habe ich custom-tex-counterder enthaltenen Datei eine lokale Variable hinzugefügt , die auf das Bash-Skript zeigt, das für die Wortzählung verantwortlich ist.

  • Deklarieren Sie die benutzerdefinierte Variable

    (defvar custom-tex-counter nil)
    (make-variable-buffer-local 'custom-tex-counter)
    (put 'custom-tex-counter 'safe-local-variable #'stringp)
    
  • Füge den Pfad in die lokalen Variablen ein (Ende der .texDatei)

    %%% Local Variables:
    %%% mode: latex
    %%% TeX-master: "../thesis"
    %%% custom-tex-counter: "../count_words -t"
    %%% End:
    
  • Putting es zusammen mit dem oben genannten

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

Als Referenz sehen Sie hier, wie mein benutzerdefiniertes Skript aussah (vergessen Sie nicht, es ausführbar zu machen):

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

Im Grunde ist das Einzige, was dies tut, grepdie nicht kommentierten Kapitel und Anhänge aus der Hauptdatei zu lesen und die Wörter dort zu zählen.

Sie können die reguläre Ausdrücke für jedes Projekt an die von Ihnen verwendete Struktur anpassen. Wenn Sie jedoch die gleiche Struktur verwenden, können Sie das Bash-Skript an einer beliebigen Stelle in Ihrem Pfad ablegen und es als globale Variable in Emacs anstatt als lokale Variable definieren.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.