有没有办法包含 ConTeXt 文档中的字数(不包括目录、其他列表等)?我发现拼写检查功能它不仅提供字数统计,还包含列表。
答案1
您可以简单地禁用拼写检查器的状态,这样就不计算目录中的单词等。这里有一个说明这一点的例子:
\define\enablewordcount
{\setupspellchecking[state=start,method=2]
\ctxlua{languages.words.threshold=1}}
\define\disablewordcount
{\setupspellchecking[state=stop]}
\define\showwordcount
{\ctxlua{
local data = table.load(file.addsuffix(tex.jobname,"words"))
context(data and data.total or "nothing")
}}
\starttext
\completecontent
\enablewordcount
\dorecurse{10}
{\expanded{\startchapter[title=Chapter \recurselevel]}
\dorecurse{4}
{\expanded{\startsection[title=Section \recurselevel]}
\input ward
\stopsection}
\stopchapter}
This document has \showwordcount\ words.
\stoptext
请注意,您需要运行两次才能获得正确的字数。由于字数存储在单独的文件中(而不是文件.tuc
),您可能需要手动再运行一次 context。
答案2
只需使用以下方法保护文档中的列表
\setupspellchecking[state=stop]
% the list here
\setupspellchecking[state=start]
这样拼写检查器就会抑制列表的工作。总字数为不是由 重置\setupspellchecking[state=stop]
。
\setupspellchecking[state=start,method=2]
\ctxlua{languages.words.threshold=1}
\starttext
\setupspellchecking[state=stop]
\completecontent
\setupspellchecking[state=start]
\startsection[title=Knuth]
\input knuth
\stopsection
\startsection[title=Ward]
\input ward
\stopsection
\startsection[title=Zapf]
\input zapf
\stopsection
\startluacode
local report_words = logs.reporter("word count")
local wordfile = "\jobname.words"
if file.is_readable(wordfile) then
local data = dofile(wordfile)
report_words("Total words: " .. data.total)
end
\stopluacode
\stoptext
日志报告
word count > Total words: 281
当我注释掉列表守卫时它显示
word count > Total words: 285