我不知道这是否对任何人都有帮助,但是当我写论文时,我想做两件事。(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中的全局变量,而不是局部变量。