web-dev-qa-db-ja.com

emacs内のLaTeXのワードカウント

LaTeXドキュメントに含まれる単語の数を数えたいです。 texcount package のWebサイトにアクセスし、そこでWebインターフェイスを使用することでこれを行うことができます。しかし、それは理想的ではありません。

むしろ、emacs内に、ファイル内の単語数(または、理想的には、ファイル内およびドキュメント内の\inputまたは\includeによって呼び出されるすべてのファイル内の単語数)を返すショートカットが必要です。 texcountスクリプトをダウンロードしましたが、どうしたらよいかわかりません。つまり、.plファイルをどこに置くか、そしてそれをemacs内で呼び出す方法がわかりません。

つまり、シェルコマンドのキーボードショートカットが必要です。そして、そのShellコマンドで現在アクティブなバッファーでtexcountを実行し、ミニバッファー内の合計単語数を返すようにします。

私はUbuntuとemacs22を使用しています。

19
Seamus
(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以外の場所に配置することもできますが、必要に応じてコードを変更するだけです。これにより、新しいコマンド「M-xlatex-Word-count」が作成され、現在のファイルでtexcount.plが実行されます(ただし、ファイルを保存していない場合は、間違った結果が返されます)。セミコロンを削除し、フィラーテキストを使用するコマンドライン引数がある場合はそれで置き換えることができます。 .emacsで次のようなものを使用して、これをキーボードコマンドにバインドできます。

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

Texcountのインストール方法を説明するページはここにあります: texcount faq 。短縮版:

Sudo cp texcount.pl /usr/local/bin/texcount.pl
15
Justin Smith

上記のスクリプトの少し優れたバージョンを次に示します(ファイル名のスペースを処理し、1行の出力を生成するなど...)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)
11
Nicholas Riley

将来の参考のために、これらの回答のいくつかは、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)
2
Eric Greenwood

ショートバージョン:M-! texcount <file.tex> RET

Shell-commandに含まれているemacsを使用するだけです。

M-! <cmd> RET

ほとんどのラテックスディストリビューションにインストールされているtexcount(texcount.pl)と一緒に。ドキュメントを編集しているときに、M-!を押してtexcount <tex-file>と入力し、Returnキーを押します。

2
Flow

ここに掲載されている他のソリューションの簡単な組み合わせは次のとおりです。

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

組み込みのM-x tex-count-wordsを使用することもできます。キーボードショートカットを作成するには、.emacsに以下を追加します

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

これが誰かに役立つかどうかはわかりませんが、論文を書いているときに、2つのことをしたかったのです。 (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ローカル変数を追加して、ワードカウントを担当するbashスクリプトを指すようにしました。

  • カスタム変数を宣言します

    (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して、そこにある単語を数えることです。

使用している構造に一致するように各プロジェクトの正規表現を変更できますが、同じ構造を一貫して使用する場合は、bashスクリプトをパスのどこかに配置して、ローカル変数ではなくemacsのグローバル変数にすることができます。

0
dalikan