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


19

私のLaTeX文書に含まれている単語の数を数えたいです。これを行うには、texcountパッケージの Webサイトにアクセスし、Webインターフェイスを使用します。しかし、それは理想的ではありません。

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

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

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 faqです。短縮版:

sudo cp texcount.pl /usr/local/bin/texcount.pl
または、推奨どおりに実行し、単にtexcountという名前を付けて、コードを適切に更新できます。


合計に\ inputおよび\ includeファイルを含める場合は、オプションに「-inc」を追加します。
シーマス

11

上記のスクリプトのもう少し優れたバージョンを次に示します(ファイル名のスペースの処理、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)

2

短縮版: M-! texcount <file.tex> RET

私は単に含まれshell-commandているemacsを使用します

M-! <cmd> RET

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


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

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

これがだれにも役立つかどうかはわかりませんが、論文を書いているときに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のグローバル変数にすることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.