我正在排版一本书,里面的植物数量比较多。在输入文字时,我必须记录书中记录的植物总数。
事实上,我已经为所有这些植物创建了索引,但问题是我应该手动计数,还是 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}\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}\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}
文档末尾。