emacs中LaTeX的字数统计


19

我想计算一下我的LaTeX文档中有多少个单词。我可以通过访问texcount软件包的网站并在其中使用Web界面来做到这一点。但这不是理想的。

我宁愿在emacs中使用一些快捷方式,以便仅返回文件中的单词数(或者理想情况下,返回文件中以及文档中\input\include文档中调用的所有文件中的单词数)。我已经下载了texcount脚本,但是我不知道该怎么做。也就是说,我不知道将.pl文件放在哪里,以及如何在emacs中调用它。

那就是:我想要一个shell命令的键盘快捷键。我希望该shell命令在当前活动缓冲区上运行texcount并返回迷你缓冲区中的总字数。

我正在使用Ubuntu和emacs22,如果有帮助的话...

Answers:


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”。
Seamus

11

这是上面脚本的一个更好的版本(处理文件名中的空格,产生单行输出等)。这些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

我只想用emacs包括shell-command

M-! <cmd> RET

连同texcount大多数乳胶发行版一起安装的(texcount.pl)。编辑文档时,只需按M-!Enter键,texcount <tex-file>然后按Return键。


1
这也是我最快的方法。谢谢!
Jimi Oke

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.