LaTeXドキュメントに含まれる単語の数を数えたいです。 texcount package のWebサイトにアクセスし、そこでWebインターフェイスを使用することでこれを行うことができます。しかし、それは理想的ではありません。
むしろ、emacs内に、ファイル内の単語数(または、理想的には、ファイル内およびドキュメント内の\input
または\include
によって呼び出されるすべてのファイル内の単語数)を返すショートカットが必要です。 texcountスクリプトをダウンロードしましたが、どうしたらよいかわかりません。つまり、.pl
ファイルをどこに置くか、そしてそれをemacs内で呼び出す方法がわかりません。
つまり、シェルコマンドのキーボードショートカットが必要です。そして、そのShellコマンドで現在アクティブなバッファーでtexcountを実行し、ミニバッファー内の合計単語数を返すようにします。
私はUbuntuとemacs22を使用しています。
(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
上記のスクリプトの少し優れたバージョンを次に示します(ファイル名のスペースを処理し、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)
将来の参考のために、これらの回答のいくつかは、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)
ショートバージョン:M-! texcount <file.tex> RET
Shell-command
に含まれているemacsを使用するだけです。
M-! <cmd> RET
ほとんどのラテックスディストリビューションにインストールされているtexcount
(texcount.pl)と一緒に。ドキュメントを編集しているときに、M-!
を押してtexcount <tex-file>
と入力し、Returnキーを押します。
ここに掲載されている他のソリューションの簡単な組み合わせは次のとおりです。
(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)
組み込みのM-x tex-count-words
を使用することもできます。キーボードショートカットを作成するには、.emacs
に以下を追加します
(add-hook 'latex-mode-hook
(lambda () (local-set-key (kbd "C-c C-w") 'tex-count-words)))
これが誰かに役立つかどうかはわかりませんが、論文を書いているときに、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のグローバル変数にすることができます。