TeXcount 无法使用路径中的命令查找 \input 文件?

TeXcount 无法使用路径中的命令查找 \input 文件?

更新:我遇到的问题是由于 PythonTeXpycode环境中有 Python 代码。这似乎导致 TeXcount Perl 脚本出现解析错误。


我想使用 TeXcount 来统计论文中的单词数。但是,我要么遇到了 TeXcount 的限制,要么很难找到详细说明如何缓解我的问题(通过文档、此处、论坛等)。

我将论文中的所有章节都放在主 .tex 文档的子文件夹中。我通过以下行调用它们(或类似代码,显然取决于章节名称):

\include{\chaptersPath/background_information}

在许多章节文件中,我都在更深的目录中存储了其他文件,用于存放该章节的主要主题/主题,例如:

\input{\chaptersPath/background_information/literature}

文档编译得很好。老实说,我现在不是来讨论我的文件和目录结构是否合适、是否最高效等的。

我尝试过\chaptersPath不同的定义:

\newcommand{\buildFilesPath}{_build_files}%

或者

\edef\buildFilesPath{./_build_files}%

两者的行为相同 - 我遇到的问题是,这个命令或定义似乎\input无法为 texcount 扩展。TeXcount 抱怨找不到该文件:

[1;31m!!! File not found or not readable: \chaptersPath/background_information !!![0m

我尝试使用-auxdir-dir,但这些似乎不能让 TeXcount 满意,因为这些命令仍在调用中\input

我也尝试\immediate\write18{texcount \jobname.tex -inc -out=\buildFilesPath/\jobname.sum}在序言中加入这些命令,以为它可能会识别这些命令(替换为纯文本路径详细信息)。但我错了;它没有。有趣的是\buildFilesPath\jobname 得到认可。

最后,我尝试过使用 including \expandafter,但这个也完全没用。似乎texcount.exe(即使在\immediate\write18方法中也无法扩展这些文件路径定义)。

问题: 是否有可能以某种方式解决这个问题,同时保留定义文件/章节路径的命令?

我意识到我可以手动浏览并硬编码所有路径。但如果我想使用大部分相同的 (La)TeX 前言和基本 .tex 文档但具有不同的文件/文件夹结构来创建新文档,那么这对于灵活性来说相当糟糕。当前的方式只需要进行一次更改,而不是每次都查找和替换一堆内容。

答案1

正如 daleif 在评论中指出的那样,TeXcount 实际上并没有扩展 LaTeX 命令,因此在\chaptersPath尝试定位包含的文件时它不会扩展路径。

有一个技巧可能有用。TeXcount 可以将嵌入在 LaTeX 文档中的指令作为表单上的注释%TC:...。其中一条指令是%TC:subst使用任意文本字符串对宏进行简单替换。例如,您可以尝试在文档顶部的某个位置(例如,在定义之后\chaptersPath)包含该命令 %TC:subst \chaptersPath /my/chapters/path ,看看是否可行。这基本上是进行简单的搜索和替换。您可能需要稍微摆弄一下才能获得正确的路径(绝对路径还是相对路径?)。我不完全确定它将如何处理包含的 tex 文件中包含的 tex 文件,但我想您会发现它是否可行。


更新 TeXcount 中导致问题的漏洞

TeXcount 解决方案以及使用 的其他使用文件包含解决方案\include可能会因 TeXcount 中的错误而失败。

当使用\include包含 TeX 文件时,.tex文件类型不是必需的。如果文件名中没有 TeXcount,则应该将其添加.tex到文件名中,但这似乎失败了,也是解决方案难以奏效的根本原因。

\include通过确保所有文件包含包含文件类型,可以绕过此错误.tex

另一种方法是修复 TeXcount 的代码,这很简单。只需找到函数定义sub _parse_include_file并将行更改 if (!$file=~/\.tex$/i) {$file.='.tex';} if ($file!~/\.tex$/i) {$file.='.tex';} ,TeXcount 应.tex在需要时附加到文件名中。

答案2

正如 @daleif 在评论中所说,TeXcount 无法解析 TeX,因为它是一个 Perl 脚本。

我不会使用 Perl,因此面对类似的问题时,我用 Python 编写了一些东西来预处理主 tex 文件。

这是针对您的案例的最小版本改编的 Python 脚本。我称之为tc-paths.py

import fileinput # see https://docs.python.org/2/library/fileinput.html
import os
chaptersPath=None
chaptersPathMacro=r'\chaptersPath'
chaptersPathDef=r'\def'+chaptersPathMacro
outfilename=None

for line in fileinput.input():
    if outfilename==None:
        outfilename=os.path.splitext(fileinput.filename())[0]+'-temp'+os.path.splitext(fileinput.filename())[1]
        print ('Writing to: '+outfilename)
        outfile=open(outfilename,'w')
    if chaptersPathDef in line:
        startpos=line.find('{',line.find(chaptersPathDef)+len(chaptersPathDef))+1
        endpos=line.find('}',startpos)
        chaptersPath=line[startpos:endpos]
        print (r'\chaptersPath='+chaptersPath)
        outline=line
    elif r'\input{'+chaptersPathMacro in line:
        print ('Found '+chaptersPathMacro+' in line %d'%fileinput.lineno())  
        outline=line.replace(chaptersPathMacro,chaptersPath)
    else:
        outline=line
    outfile.write(outline)

运行它python tc-paths.py my-master-file.tex,它将输出到my-master-file-temp.tex

示例输入 tex 文件:

\documentclass{article}
\def\chaptersPath{../Chris}
\begin{document}
\input{\chaptersPath/chap1.tex}
\end{document}

输出结果如下:

\documentclass{article}
\def\chaptersPath{../Chris}
\begin{document}
\input{../Chris/chap1.tex}
\end{document}

然后对文件运行 texcount -temp.tex

相关内容