用于统计单词的新命令?

用于统计单词的新命令?

统计单词的环境确实如标题所述,但也会打印计数的单词。有没有办法计算单词而不打印它们?

\countCommand{Four and twenty blackbirds} % should print: 4

答案1

如果你指的是计算参数中的空格,在所有括号级别,使用l3regex你能行的:

\documentclass{article}
\usepackage{xparse,l3regex}

\ExplSyntaxOn
\NewDocumentCommand{\countwords}{+m} % allow \par (or blank lines in the argument)
 {
  \regex_count:nnN { \s } { #1 } \l_corneli_words_int
  \int_to_arabic:n { \l_corneli_words_int + 1 }
 }
\int_new:N \l_corneli_words_int
\ExplSyntaxOff

\begin{document}
\countwords{Four and twenty blackbirds}

\countwords{Four \emph{and twenty} blackbirds}
\end{document}

这将打印

4
4

答案2

这是一个简单的解决方案xstring

% arara: pdflatex
\documentclass{article}

\usepackage{xstring}

\newcommand{\wordcount}[1]{\StrCount{#1}{\space}[\tmp]%
\number\numexpr\tmp+1\relax}
\begin{document}

\wordcount{Four and twenty blackbirds}
\end{document}

它的工作原理是计算空格数,然后添加1;即使单词之间有多个空格,它也能正常工作,因此您可以使用

\wordcount{Four    and     twenty     blackbirds}

并且仍然得到4然而如果你尝试类似

\wordcount{ Four and twenty blackbirds}
\wordcount{Four and twenty blackbirds }
\wordcount{ Four and twenty blackbirds }

那么你将得不到预期的结果。你可以使用类似下面的方法修复此问题:

\newcount\cmh
\newcommand{\wordcount}[1]{%
\StrCount{#1}{\space}[\tmp]%
\cmh=\tmp%
\IfBeginWith{#1}{\space}{\advance\cmh by -1\relax}{}%
\IfEndWith{#1}{\space}{\advance\cmh by -1\relax}{}%
\number\numexpr\cmh+1\relax
}

答案3

\documentclass{article}
\usepackage{readarray}
\begin{document}
\getargsC{Four and twenty blackbirds}
Words = \narg\par
The words are \argi, \argii, \argiii, and \argiv.
\end{document} 

因此,基于这个 MWE,\def\wordcount#1{\getargsC{#1}\narg}足以回答 OP 的问题。请注意,\getargsC功能上与包的宏相同,但速度上却远远优于包\getargs的宏stringstrings

相关内容