在以下 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
第一级扩展之间的差异的注意。\test
word1, 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}