# Is there any way to do a correct word count of a LaTeX document?

Often assignments (or even papers) have a word count limit. That is not a big deal when using Word, but I don't know how to do that using LaTeX. My solution has been so far to compile the document and then do a rough word count of my pdf file, sometimes even copying the contents of the pdf file and pasting in Word to get a mostly correct Word count.

Is there any tool (maybe even an online tool), package, script or software to do that directly from my .tex document and still get the right word count (i.e., ignore commands, equations, etc)?

-
Same question on Stack Exchange: stackoverflow.com/questions/2974954/… –  Charles Stewart Jun 18 '11 at 12:07
Under Linux I normally do it over the PDF to get a rough count: pdftotext file.pdf - | wc -w, but this also counts page numbers etc. as words. –  Martin Scharrer Jun 29 '11 at 18:27
Word count is never perfectly defined: How much words in can't? In an algorithm? In a figure with several texts? So, the notion of correct word count does not exist... –  Paul Gaborit Jul 17 '12 at 11:43
Emacs native tex-mode has a word count function: M-x tex-count-words. –  giordano Jun 4 '13 at 8:33
watches your LaTeX word limit as you type and save: % watch -d "detex index.tex | wc -w" –  Vaibhav Bajpai Feb 28 at 19:43

This is in the UK TeX FAQ. The solutions suggested are:

• detex filename (which tries to strip LaTeX commands), then use any word count tool. (E.g. wc)

• latexcount.pl, a Perl script for word count

• texcount, another script even has an online interface

• wordcount, which has a script that runs LaTeX with some settings, then counts word indications in the log file.

-

my $count = 0; my$first = "";
my $tex = 0; while ($first =~ /^\s*$/) {$first = <>;
}

if ($first =~ /^\$$input|section|setlength|documentstyle|chapter|documentclass|relax|contentsline|indexentry|begin|glossaryentry)/) { tex = sub { r = _[0]; m = _[1]; r =~ s/\\(emph|textbf|textit|texttt|em)\{//g; r =~ s/\\(sub)*section\*?\{[^\}]*\}//; r =~ s/\\title\{[^\}]*\}//; r =~ s/\\\(.*?\\$$/maths/g;$r =~ s/\\$$.*?/maths/; r =~ s/^.*?\\$$/maths/;
$r =~ s/\\$.*?\\$/maths/g;$r =~ s/.*?\\\]// and $m = 0;$m and $r = "";$r =~ s/\\\[.*?$// and$m = 1;
$r =~ s/\\\S*//g;$r =~ s/%.*//;
return ($r,$m) };
} else {
$tex = sub { return ($_[0],0) };
@split = split(" ", $first);$count += $#split + 1; } while ($s = <>) {
($t,$n) = &$tex($s,$n); @split = split(" ",$t);
$count +=$#split + 1;
}

print "Number of words: $count\n"; - @Andrew: again the issue: what do you do with it? how I am supposed to use it? Can you add that to your answer? – Vivi Jul 29 '10 at 8:44 @Viv: to be honest, I would say that if you don't know what to do with this then you aren't supposed to use it and should use one of the answers in the accepted answer. – Loop Space Jul 29 '10 at 9:18 I am glad you were born knowing how to do it, otherwise you wouldn't be using it now, right? Because if you don't know it, you are not supposed to learn it, isn't that right? – Vivi Jul 29 '10 at 10:59 @Vivi: I apologise for the fact that my remark has come across other than I intended it. I did start writing out the instructions, but they are so OS and user specific that I gave up. I'd be happy to help with this sort of thing (though I think that the comments here are not the best format for such help), but in this specific case I really do think that if you don't know how to do it, then this is not the right way to do it. It's an old script that I dug up and it is very me-specific so almost certainly would need a little tweaking to make it useful to anyone. (contd) – Loop Space Jul 29 '10 at 11:09 @Andrew: In Brazil I am Vivi, but here I am Viv, so you didn't spell it wrong after all! Thanks for your answer. I understand some things are too complicated to explain here, and it is not really the place. This thing (scripts, and pearl) keeps coming up so often that I decided it is time to understand it! I will ask this to someone that lives here and can explain to me in person (about using scripts in general, but I will probably leave yours for later, given what you said). Thanks again for taking the time to explain, and thanks for sharing the code :) – Vivi Jul 29 '10 at 11:58 Here’s an excerpt from my .vimrc that gives me a comfortable word count in Vim: function! WC() let filename = expand("%") let cmd = "detex " . filename . " | wc -w | tr -d [:space:]" let result = system(cmd) echo result . " words" endfunction command WC call WC() Now I can invoke :WC in command mode to have the word count echoed in the status line. - I cannot help but think that calling perl just to do chomp and a regex is way too much of an overkill. =) Why not just ' ... | wc -w | tr -d [:space:]'? – Willie Wong Aug 4 '10 at 0:06 @Willie: good call. Don’t remember why I used Perl here. – Konrad Rudolph Aug 4 '10 at 8:38 now I would be much happier if you had given me something I can use in Emacs! :P – Vivi Aug 4 '10 at 9:45 – Seamus Feb 15 '12 at 12:05 @Vivi: odd name for an Emacs user! :P – naught101 Apr 24 '12 at 4:29 The last time I had to worry about this, I compiled my LaTeX document to PDF and ran it through pdftotext. - This approach cannot deliver reliable results due to unreliable conversion by pdftotext. – helcim Aug 6 '10 at 15:26 Do you have an example of how pdftotext fails? I got reasonable results when I used it, but the documents I was using were not particularly elaborate (I don't think they had figures, for example). – Blake Stacey Aug 8 '10 at 18:46 This will count headers and page numbers in your word count. This will also count lots of words in mathmode. Try doing pdftotext and then wc on a file containing the equation$x+y=z\$. That counts as something like 5 words for this method… –  Seamus Jul 17 '12 at 9:55
@Seamus For documents without much logic or maths, though, I've found it more accurate than alternatives when combined with a script to remove headers, footers etc. For documents with a lot of logic or maths, it would be hopeless. (I have no idea how those should be calculated, either.) –  cfr Sep 12 at 23:45

The first one to come to mind is detex which strips a tex file of commands. You will then have to pass it through wc or some other word counting software. A search on the internet also brought up two items on Sourceforge: word counter 1 and word counter 2.

Disclaimer: out of the three, I've only used detex before. It worked reasonably well, but I was working with an English essay and it had no equations, so I don't know how it plays with math mode stuff. (Currently I don't have it installed so I can't check.)

-
It's been a while since I used it but if I remember correctly, I don't think detex completely strips out the math content of a file, so that might skew the word count. –  David Z Jul 29 '10 at 0:47
I had opportunity to use detex recently and it leaves many TeX-related words which have nothing to do with the content. I would almost go as far as saying that compiling to PDF and then using pdftotext might produce a more accurate count, even when it contains page numbers and repeats the headers. –  José Figueroa-O'Farrill Jul 29 '10 at 0:50
Just tried it on a recent paper I wrote: yeah, detex is wildly off. I get even better results from piping dvi2tty to wc. –  Willie Wong Aug 4 '10 at 0:51
Never used detex, but untex which comes in Debian seems to do the job. –  helcim Aug 6 '10 at 15:23
@José: I found pdftotext to be much better. Especially since I tend to write macros that generate text so stripping them produces wildly incorrect word counts. –  TH. Nov 27 '10 at 17:41