emacs 내에서 LaTeX의 단어 수


19

LaTeX 문서에 몇 단어가 있는지 계산하고 싶습니다. texcount 패키지 의 웹 사이트로 이동 하여 웹 인터페이스를 사용 하여이 작업을 수행 할 수 있습니다 . 그러나 그것은 이상적이지 않습니다.

오히려 파일에서 단어 수 (또는 파일에서 \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"를 추가하십시오.
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

나는 포함 shell-command된 이맥스를 사용합니다.

M-! <cmd> RET

texcount대부분의 라텍스 배포판과 함께 설치되는 (texcount.pl) 과 함께 . 문서를 편집하는 동안 M-!엔터 texcount <tex-file>를 누르고 리턴을 누르십시오.


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

나중에 참조 할 수 있도록 쉘 인용 인수 기능을 사용하여 파일 이름의 공백 및 기타 재미있는 형식을 올바르게 처리하면 이러한 답변 중 일부가 향상 됩니다. 예를 들어 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의 전역 변수로 만들 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.