计数选定的单词

计数选定的单词

我正在排版一本书,里面的植物数量比较多。在输入文字时,我必须记录书中记录的植物总数。

事实上,我已经为所有这些植物创建了索引,但问题是我应该手动计数,还是 LaTeX 可以自己计数。

这是我的简单文档。

\documentclass[a4paper,10pt]{article}

%For multiple index
\usepackage{imakeidx}
\makeindex
 \makeindex[name=ch, title=Chemical index]
\makeindex[name=pl,title=Plant Index]

\begin{document}

This is my test docment. It contains total 5 plants. Plant 1\index[pl]{plant 1}  has                
chemicals 1\index[ch]{chemical 1} and 2\index[ch]{chemical 2}. Another plant\index[pl]
{plant 2} continas the chemicals 2\index[ch]{chemical 2} and 3\index[ch]{chemical 3}.

List of plants:
Plant 3\index[pl]{plant 3}
plant 4\index[pl]{plant 4}
plant 5\index[pl]{plant 5}

\printindex
\indexprologue{\small Index of plants}
\printindex[pl]

\indexprologue{\small Index of chemicals}
\printindex[ch]

\end{document}

答案1

您可以使用该.idx文件进行计数:

\documentclass[a4paper,10pt]{article}

%For multiple index
\usepackage{imakeidx}
\makeindex[name=ch, title=Chemical index]
\makeindex[name=pl,title=Plant Index]

\begin{document}

This is my test document. It contains a total of \ref{plants-number} plants. Plant 
1\index[pl]{plant 1} has chemicals 1\index[ch]{chemical 1} and 2\index[ch]{chemical 2}. 
Another plant\index[pl]{plant 2} continas the chemicals 2\index[ch]{chemical 2} and 
3\index[ch]{chemical 3}.

List of plants:
Plant 3\index[pl]{plant 3}
plant 4\index[pl]{plant 4}
plant 5\index[pl]{plant 5}

\indexprologue{\small Index of plants}
\printindex[pl]

\indexprologue{\small Index of chemicals}
\printindex[ch]

% We'll count the number of plants and of chemicals
\newcounter{items}
\makeatletter
\begingroup
% Define suitably \indexentry
\newcommand{\indexentry}[2]{%
  \@ifundefined{#1}
    {\refstepcounter{items}\expandafter\let\csname#1\endcsname\@empty}
    {}}

% Let's count the plants
\begingroup
\setcounter{items}{0}
\input{pl.idx}\label{plants-number}
\endgroup

% Let's count the chemicals
\begingroup
\setcounter{items}{0}
\input{ch.idx}\label{chemicals-number}
\endgroup

\endgroup

\end{document}

最终的代码将不会产生任何文本,而只会产生对最后计数的植物的引用;此引用可以在任何地方使用(但当然,这至少需要运行两次 LaTeX)。

注意:如果您只有标记为 和 的条目,则无需给出\makeindex命令和命令。\printindex\index[pl]\index[ch]

答案2

LaTeX 提供内置宏来处理计数器,这就是处理分区编号、页码和浮点数的方法。在https://tex.stackexchange.com/a/19761/963我发布了一个回复,它与您想要做的非常相似,并且我对其进行了调整以包含计数器。

\documentclass{article}
\usepackage{lstdoc,booktabs}
\begin{document}
\makeatletter

\newcounter{cnt}
\setcounter{cnt}{0}
\let\alist\@empty

\def\addtolist#1#2{%
  \lst@lAddTo#1{#2}
}

\def\RA#1|#2|#3|#4;{%
  \addtolist{\alist}{#1#2,}%
  \expandafter\gdef\csname#1#2\endcsname{\textit{#1}&#2&#3&#4\cr\relax}
  \lst@BubbleSort{\alist}
  \stepcounter{cnt}
}

\def\RB#1|#2|#3|#4;{%
   \addtolist{\alist}{#2#1,}%
   \expandafter\gdef\csname#2#1\endcsname{\textit{#1}&#2&#3&#4\cr\relax}
   \lst@BubbleSort{\alist}
}

%% adding the data now
\RA Lactarius fallax      | velvety milk cap |edible |potentially risky;  
\RA Lactarius camphoratus | candy cap        |edible |aromatic qualities;
\RA Suillus pungens       | slippery Jack    |edible |poor taste;
\RA Lactarius affinis     | kindred milk     |edible |unpalatable;
\RA Calocybe carnea       | pink fairhead    |edible |potentially risky;
\RA Amateta ocreata       | death angel      |inedible |highly poisonous;   

%% typesetting the table
\newsavebox{\tempbox}
\savebox{\tempbox}{
\centering
\begin{tabular}{llll}
  \toprule[1pt]
  Species & Common name & Edibility & Remarks\\
  \midrule
  \@for\i:=\alist \do{\csname\i\endcsname}
  \vspace{-14pt}\\\bottomrule
\end{tabular}
}

\begin{table}
\usebox{\tempbox}
\caption{Some mushrooms from Wikipedia}
\end{table}

Number of mushrooms in database is \textbf{\thecnt}

\end{document}

这个想法是,每次添加植物(在我的例子中是蘑菇)时,您首先将其添加到数据库宏(实际上只是一个逗号分隔的列表),然后增加计数器。与将某些内容添加到索引时非常相似。根据文档的结构,可以调整代码以保存图像、增加数字、按字母顺序排序等。在示例中,我们只是在表中显示名称。

答案3

LateX 提供了命令\newcounter\stepcounter一些其他用于计数的命令。

\documentclass{article}

\newcounter{plants}
\newcommand{\plant}[1]{%
    % step counter
    \stepcounter{plants}% use \refstepcounter if you want
        % to use the number with the \ref-\label-mechanism
    % new line
    \par
    % optionally print counter
%   \theplants. 
    % print name
    #1
}


\begin{document}
\plant{Foo}
\plant{Bar}
\plant{Baz}

Sum: \theplants
\end{document}

为了明确我的答案,我需要更多关于您项目的信息。请提供最小工作示例(MWE)

答案4

如果您正在使用xetex,您可以使用该xesearch包:

\documentclass{article}
\usepackage{xesearch}
\newcounter{plants}
\setcounter{plants}{0}
\def\plantlist{tree?,grass,flower?}
\SearchList{list1}{#1\stepcounter{plants}}{\plantlist}
\begin{document}
    ``What is your favorite kind of plant? Trees, grass, or flowers?''
    ``I like trees because they are much taller than grass and flowers.''
\end{document}

此代码创建一个名为的计数器plants,然后搜索在中找到的单词,\plantlist每当找到列表中的单词时,计数器就会增加一倍。

  • 将您想要计数的任何单词添加到第 5 行的列表中。例如tree,grass,flower
  • 如果您要写复数形式,也请将其添加到列表中,或使用“?”或“*”来匹配这些形式。例如,tree?将匹配“tree”和“trees”,并将cact*匹配“catcus”和“cacti”。
  • 要显示最终匹配的单词数,请将其放在\arabic{plants}文档末尾。

相关内容