我正在尝试编写一个脚本,使用 texcount 仅输出字符数(包括空格)。我编写了一个批处理脚本,可以正常运行,没有任何问题。
问题是尝试使用 \immediate\write18 环境在 overleaf 中的 latex shell escape 中运行它。问题似乎主要在于 latex 如何处理批处理脚本中使用的特殊字符。脚本/latex 代码如下:
\newcommand{\quickcharcount}[1]{%
\immediate\write18{
texcount -1 -sum -merge -char -q main.tex > chars.txt
texcount -1 -sum -merge -q main.tex > spaces.txt
for /f "skip=1" %%G IN (spaces.txt) DO if not defined line set "nSpace=%%G"
for /f "skip=1" %%G IN (chars.txt) DO if not defined line set "nChar=%%G"
for /f "tokens=1*delims=:" %%G in ('findstr /n "^" spaces.txt') do if %%G equ 2 set "nSpace=%%H"
for /f "tokens=1*delims=:" %%G in ('findstr /n "^" chars.txt') do if %%G equ 2 set "nChar=%%H"
set /a "sum=nChar+nSpace"
echo %sum% > count.sum
}%
\input{count.sum}
}
有谁有这方面的经验并且知道如何解决这个问题?
编辑:
有人告诉我,使用 bat 脚本无法实现这一点,所以我现在将其编写为 shell 脚本。但我仍然无法让它在 latex 中工作。您说 overleaf 有点限制,那么这也是原因吗?
#!/bin/bash
char=$(texcount -1 -sum -merge -char -q main.tex)
space=$(texcount -1 -sum -merge -q main.tex)
nChar=${char%(*}
nSpace=${space%(*}
sum=$((nChar + nSpace))
echo $sum > count.sum
答案1
你已经定义\quickcharcount
为具有 1 个不使用的参数,因此我将其定义为无参数。
源代码中的换行符是一个空格,因此所有脚本都在一行上。您可以使用^^J
写换行符,但在这里我只使用 bash 命令分隔符;
您还需要\@percentchar
注释%
。
\documentclass{article}
\makeatletter
\newcommand{\quickcharcount}{%no argument
\immediate\write18{
char=$(texcount -1 -sum -merge -char -q main.tex);
space=$(texcount -1 -sum -merge -q main.tex);
nChar=${char\@percentchar(*};
nSpace=${space\@percentchar(*};
sum=$((nChar + nSpace));
echo $sum > count.sum
}%
\input{count.sum}%
}
\makeatother
\begin{document}
abc xyz
\quickcharcount
\end{document}