我正在尝试用 LaTeX 统计我的论文项目的字数。我在 Ubuntu 机器上使用 VIM 和 VIMLaTeX。
我的 main.tex 文件中有以下代码
\newcounter{Hoofdstuk}
\newcommand{\file}{empty}
\setcounter{Hoofdstuk}{1}
\forloop{Hoofdstuk}{1}{\value{Hoofdstuk}<20}
{
\renewcommand{\file}{Hoofdstuk\arabic{Hoofdstuk}/\arabic{Hoofdstuk}}
\IfFileExists{\file}{
\input{Hoofdstuk\arabic{Hoofdstuk}/\arabic{Hoofdstuk}}
}{}
}
将我的所有章节输入到我的主文件中。现在我想用以下代码计算我论文中的所有单词:
\usepackage{moreverb}
\immediate\write18{texcount -inc -incbib -sum main.tex > /tmp/wordcount.tex}
\newcommand\wordcount{
\verbatiminput{/tmp/wordcount.tex}}
本质上,对于我输入的文件名,此代码是有效的。但对于在 forloop 中输入的文件,它会出错并说找不到文件:'./Hoofdstuk\arabic{',并且遇到第二个错误,并且没有相应的'{',这似乎是了解第一个错误的逻辑。
有人知道如何修复这个问题吗?我texcount -inc -incbib main.tex
在终端中运行时也遇到了同样的错误
答案1
有两件事失败了,导致了不同的问题。
首先,您需要知道 TeXcount 仅解析 TeX 代码,使用启发式规则尝试区分文本和宏。但是,它实际上并不运行 TeX,因此它不会实际运行\forloop
并扩展它生成的代码。因此,它不会\input
在文件Hoofdstuk1.tex
、Hoofdstuk2.tex
等上运行。这就是它不会处理这些文件的原因。
接下来,它会\input
尝试解析该行
\input{Hoofdstuk\arabic{Hoofdstuk}/\arabic{Hoofdstuk}}
纯粹按原样显示,无法理解,因为它不是文件名。事实上,我怀疑这里有一个小错误,因为它似乎无法正确匹配花括号,最后剩下一个}
,这导致了错误消息。
\input
TeXcount 解析中的语句的原因\forloop
是 TeXcount 没有附带 的宏处理规则\forloop
,因此 的参数\forloop
被解析为文本。可以通过添加提供宏处理规则的 TeXcount 指令来“修复”此问题:
%TC:macro \forloop [ignore,ignore,ignore,xx]
在第一次使用之前的任何地方插入此行将\forloop
告诉 TeXcount 它需要四个参数,所有这些参数都应该被忽略:该xx
规则只是 ignore 的更强大形式,它在尝试处理内容方面做得少一点(不确定是否真的需要它或者是否ignore
通常就足够了)。它所做的只是让 TeXcount 忽略\forloop
及其参数,从而防止出现错误消息。
为了真正解决包含 Hoofdstuk 文件的问题,我认为最简单的方法是更改指令texcount
以包含它们。如果这些是表单上唯一的文件,我认为这可能会奏效Hoofdstuk*.tex
:
\immediate\write18{texcount -inc -incbib -sum main.tex Hoofdstuk*.tex > /tmp/wordcount.tex}
这只是明确告诉 TeXcount 也包含所有这些文件。
注意:我还没有实际测试过,可能需要进行一些调整才能让它按你想要的方式工作。但我认为这是最可行的方法。
如果你需要更具体地选择要包含的文件,你可以累积宏变量中包含的文件列表,例如\filelist
,然后使用以下命令运行 TeXcount
\immediate\write18{texcount -inc -incbib -sum main.tex \filelist > /tmp/wordcount.tex}
这基本上是相同的,只是您可以更加确保所计算的文件与文档中包含的文件相同。