更新新命令中的计数器,但不打印命令的结果

更新新命令中的计数器,但不打印命令的结果

在以下 MWE 中,我想通过自定义命令更新我的计数器\noofwords,但是

  • 在第 25 行写入错误:Missing number, treated as zero. \noofwords
  • 否则写入 PDF 就没问题了
  • 当我调用该命令时,计数器的新值(至少我认为它是它的值)会打印在文档中\noofwords(它是 2,因此比预期的少 1,因为它应该是 3)
  • 写入初始值\thenoofwords(即 1)而不是更新后的值(如前所述,应为 3)

为什么会这样?有什么方法可以解决或规避这个问题?

梅威瑟:

\documentclass{scrreprt}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{xstring}

\newcommand{\test}{word1, word2, word3}

\newcounter{noofcommas}
\setcounter{noofcommas}{1}

\newcounter{noofwords}
\setcounter{noofcommas}{1}

\newcommand{\noofwords}{ %
    \setcounter{noofwords}{
    \setcounter{noofcommas}{ %
        \StrCount{\test}{,}}}
    \refstepcounter{noofwords}}

\begin{document}
    
\thenoofcommas

\noofwords

\thenoofwords

\end{document}

答案1

xstring 的命令有一个可选参数,您可以在其中添加存储结果的命令。然后可以在以下情况下使用它\setcounter

\documentclass{scrreprt}

\usepackage[T1]{fontenc}
\usepackage{xstring}

\newcommand{\test}{word1, word2, word3}

\newcounter{noofcommas}
\setcounter{noofcommas}{1}

\newcounter{noofwords}
\setcounter{noofcommas}{1}


\begin{document}

\StrCount{\test}{,}[\numofcommas]
\setcounter{noofcommas}{\numofcommas}

\thenoofcommas

\end{document}

我删除了该inputenc行,因为当前的 LaTeX 不再需要它。

答案2

使用 时\setcounter{noofwords}{...}...根据 TeX 的语法,它必须是 ⟨number⟩。在你的例子中,参数...⟨space token⟩\setcounter{noofcommas}{⟨space token⟩\StrCount{\test}{,}};包含赋值(\setcounter操作),它肯定不是 ⟨number⟩。此外,虽然\StrCount{\test}{,}排版是一个整数,但它不是扩张转换为⟨number⟩(如果是,那么一个 ⟨number⟩)。因此,它不能用于 TeX 需要 ⟨number⟩ 的上下文中。

正如 Ulrike Fischer 所说写道,您可以使用可选参数来\StrCount告诉它将结果计数存储在您选择的宏中(\tmp此处):

\documentclass{article}
\usepackage{xstring}

\newcommand{\test}{word1, word2, word3}

\newcounter{noofcommas}
\newcounter{noofwords}

\newcommand{\noofwords}{%
  \StrCount{\test}{,}[\tmp]%
  \setcounter{noofcommas}{\tmp}%
  \setcounter{noofwords}{\value{noofcommas}}%
  \stepcounter{noofwords}%
}

\begin{document}

\thenoofcommas\noofwords

\thenoofwords

\end{document}

在此处输入图片描述

小心你之前放置的空格%(其中一些会产生我上面提到的 ⟨space token⟩)。它们可能会给你带来麻烦(主要是虚假的空格)。

上述解决方案有效,但我会采取不同的做法。以下命令\numItems\numItemsOneLevelExp以下内容均有效。扩张转换为 ⟨number⟩;因此,它们可以直接用于各种只进行扩展的地方(称为“仅扩展上下文”)——尤其是那些 TeX 需要 ⟨number⟩ 的地方。它们也希望引起您对(单个控制序列标记)和(示例中的标记列表[带有标准类别代码])\test第一级扩展之间的差异的注意。\testword1, word2, word3

\documentclass{article}
%\usepackage{xparse} % uncomment if your LaTeX format is older than 2020-10-01

\ExplSyntaxOn
\NewExpandableDocumentCommand \numItems { m }
  {
    \clist_count:n {#1}
  }

\cs_generate_variant:Nn \clist_count:n { V }

\NewExpandableDocumentCommand \numItemsOneLevelExp { m }
  {
    \clist_count:V #1
  }
\ExplSyntaxOff

\begin{document}

\numItems{word1, word2, blah blah 3, word4}

\newcommand*{\test}{word1, word2, word3}%
\numItemsOneLevelExp{\test}

% Use in an expansion-only context (inside \numexpr)
\edef\zzz{\the\numexpr \numItemsOneLevelExp{\test}*10}%
%\show\zzz          % \zzz=macro:->30.

\end{document}

在此处输入图片描述

相关内容