假设我有一个包含相当多条目的列表(所有整数值,如果相关的话),例如,
1 2 4 0 3 1 0 0 2 1 7 1 4 2 3 0 0 6 5 2 1 2 3 0
LaTeX 能否以某种方式计算出上面列表中0
's、1
's、...、 's的数量?7
PS 所有解决方案均可接受,但最好使用 LaTeX 3 版本。
更新
使用egreg 的代码,为什么以下只返回 ,0
以及我怎样(如果可能的话)仍然使用所有的\def
s 并获得正确的结果?
\documentclass{article}
\usepackage{
xparse,
l3regex
}
\ExplSyntaxOn
\NewDocumentCommand{\countoccurrences}{ O{} m }
{
\group_begin:
\keys_set:nn { svend/occurrences } { #1 }
% if the self key appeared, make the list name equal to the sequence name
\bool_if:NT \l_svend_occurrences_self_bool
{
\tl_set_eq:NN \l__svend_occurrences_list_tl \l__svend_occurrences_name_tl
}
\svend_count_occurrences:n { #2 }
\group_end:
}
\NewDocumentCommand{\setsearchlist}{ O{default} m }
{
\svend_occurrences_set_searchlist:nn { #1 } { #2 }
}
\DeclareExpandableDocumentCommand{\getoccurrences}{ O{default} m }
{
\prop_item:cn { g_svend_occurrences_#1_prop } { #2 }
}
\keys_define:nn { svend/occurrences }
{
name .tl_set:N = \l__svend_occurrences_name_tl,
name .initial:n = default,
list .tl_set:N = \l__svend_occurrences_list_tl,
list .initial:n = default,
self .bool_set:N = \l_svend_occurrences_self_bool,
self .default:n = true,
self .initial:n = false,
}
\prop_new:N \g_svend_occurrences_default_prop
\seq_new:N \g_svend_occurrences_default_list_seq
\int_new:N \l__svend_occurrences_matches_int
\cs_new_protected:Npn \svend_count_occurrences:n #1
{
% create a new property list for storing the values for the current string
% or clear an existing one
\prop_gclear_new:c { g_svend_occurrences_ \l__svend_occurrences_name_tl _prop }
% populate the search list, if self is used
\bool_if:NT \l_svend_occurrences_self_bool
{
\svend_occurrences_set_searchlist:Vn \l__svend_occurrences_name_tl { #1 }
}
% map through the search list
\seq_map_inline:cn { g_svend_occurrences_ \l__svend_occurrences_list_tl _list_seq }
{
% store the current search item; using the token list in
% the regex search expression should avoid problems with
% special characters
\tl_set:Nn \l__svend_occurrences_temp_tl { ##1 }
% count the number of times “search item/space” appears
% (a trailing space is added) and store it in an integer variable
% (in a regex, \u{tl variable name} stands for the contents of the variable
\regex_count:nnN { \u{l__svend_occurrences_temp_tl}\s } { #1~ } \l__svend_occurrences_matches_int
% put the number of matches in the property list, corresponding to
% the current item as key
\prop_gput:cnx { g_svend_occurrences_ \l__svend_occurrences_name_tl _prop }
{ ##1 }
{ \int_to_arabic:n { \l__svend_occurrences_matches_int } }
}
}
% populate a search list (with duplicates removed)
\cs_new_protected:Npn \svend_occurrences_set_searchlist:nn #1 #2
{
\seq_gclear_new:c { g_svend_occurrences_#1_list_seq }
\seq_gset_split:cnn { g_svend_occurrences_#1_list_seq } { ~ } { #2 }
\seq_gremove_duplicates:c { g_svend_occurrences_#1_list_seq }
}
\cs_generate_variant:Nn \seq_gset_split:Nnn { c }
\cs_generate_variant:Nn \svend_occurrences_set_searchlist:nn { V }
\ExplSyntaxOff
\begin{document}
\def\fravaerElevEn{1}
\def\fravaerElevTo{2}
\def\fravaerElevTre{4}
\def\fravaerElevFire{0}
\def\fravaerElevFem{3}
\def\fravaerElevSeks{1}
\def\fravaerElevSyv{0}
\def\fravaerElevOtte{0}
\def\fravaerElevNi{2}
\def\fravaerElevTi{1}
\def\fravaerElevElleve{7}
\def\fravaerElevTolv{1}
\def\fravaerElevTretten{4}
\def\fravaerElevFjorten{2}
\def\fravaerElevFemten{3}
\def\fravaerElevSeksten{0}
\def\fravaerElevSytten{0}
\def\fravaerElevAtten{6}
\def\fravaerElevNitten{5}
\def\fravaerElevTyve{2}
\def\fravaerElevEnogtyve{1}
\def\fravaerElevToogtyve{2}
\def\fravaerElevTreogtyve{3}
\def\fravaerElevFireogtyve{0}
\setsearchlist{0 1 2 3 4 5 6 7}
\countoccurrences{
\fravaerElevEn
\fravaerElevTo
\fravaerElevTre
\fravaerElevFire
\fravaerElevFem
\fravaerElevSeks
\fravaerElevSyv
\fravaerElevOtte
\fravaerElevNi
\fravaerElevTi
\fravaerElevElleve
\fravaerElevTolv
\fravaerElevTretten
\fravaerElevFjorten
\fravaerElevFemten
\fravaerElevSeksten
\fravaerElevSytten
\fravaerElevAtten
\fravaerElevNitten
\fravaerElevTyve
\fravaerElevEnogtyve
\fravaerElevToogtyve
\fravaerElevTreogtyve
\fravaerElevFireogtyve
}
\begin{tabular}{cc}
0 & \getoccurrences{0} \\
1 & \getoccurrences{1} \\
2 & \getoccurrences{2} \\
3 & \getoccurrences{3} \\
4 & \getoccurrences{4} \\
5 & \getoccurrences{5} \\
6 & \getoccurrences{6} \\
7 & \getoccurrences{7}
\end{tabular}
\end{document}
答案1
这利用了要计数的标记是数字这一事实:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\countoccurrences}{ O{default} m }
{
\svend_count_occurrences:nn { #1 } { #2 }
}
\DeclareExpandableDocumentCommand{\getoccurrences}{ O{default} m }
{
% just retrieve the property corresponding to the requested digit
\prop_item:cn { g_svend_occurrences_#1_prop } { #2 }
}
\prop_new:N \g_svend_occurrences_default_prop
\tl_new:N \l__svend_input_tl
\tl_new:N \l__svend_temp_tl
\cs_new_protected:Npn \svend_count_occurrences:nn #1 #2
{
% make a new property list, if necessary, or clear an existing one
\prop_gclear_new:c { g_svend_occurrences_#1_prop }
% store the string
\tl_set:Nn \l__svend_input_tl { #2 }
% the items are octal digits so do a loop on them
\int_step_inline:nnnn { 0 } { 1 } { 7 }
{
% make a copy of the given string
\tl_set_eq:NN \l__svend_temp_tl \l__svend_input_tl
% remove all items that are the same as the current digit
\tl_remove_all:Nn \l__svend_temp_tl { ##1 }
% put in the property list the current digit as property
% and the difference between the number of items of the
% full list and the temporary one (count the number of removed items)
\prop_gput:cnx { g_svend_occurrences_#1_prop }
{ ##1 }
{ \int_eval:n { \tl_count:N \l__svend_input_tl - \tl_count:N \l__svend_temp_tl } }
}
}
\ExplSyntaxOff
\begin{document}
\countoccurrences[new]{1 1 1 1 2 2 2 2}
\getoccurrences[new]{0}\quad
\getoccurrences[new]{1}\quad
\getoccurrences[new]{2}
\bigskip
\countoccurrences{1 2 4 0 3 1 0 0 2 1 7 1 4 2 3 0 0 6 5 2 1 2 3 0}
\begin{tabular}{cc}
0 & \getoccurrences{0} \\
1 & \getoccurrences{1} \\
2 & \getoccurrences{2} \\
3 & \getoccurrences{3} \\
4 & \getoccurrences{4} \\
5 & \getoccurrences{5} \\
6 & \getoccurrences{6} \\
7 & \getoccurrences{7} \\
\end{tabular}
\end{document}
对于任意项目,都需要更复杂的代码。
可以使用正则表达式处理任意字符序列。请注意,此处\countoccurrences
将键值对列表作为可选参数:name
设置列表的名称(默认为default
)和list
要计数的序列列表。在列表中,只应指定为可选参数,并在名称\setsearchlist
中指定。\getoccurrences
如果可选参数\countoccurrences
包含self
(即暗示self=true
),则list
不应出现,并且项目列表将根据强制参数构造,并赋予与标记列表相同的名称。特别是
\countoccurrences[self]{0 1 2 3}
将以与发布相同的方式设置列表
\setsearchlist{0 1 2 3}
预先。
完整示例:
\documentclass{article}
\usepackage{xparse,l3regex}
\ExplSyntaxOn
\NewDocumentCommand{\countoccurrences}{ O{} m }
{
\group_begin:
\keys_set:nn { svend/occurrences } { #1 }
% if the self key appeared, make the list name equal to the sequence name
\bool_if:NT \l_svend_occurrences_self_bool
{
\tl_set_eq:NN \l__svend_occurrences_list_tl \l__svend_occurrences_name_tl
}
\svend_count_occurrences:n { #2 }
\group_end:
}
\NewDocumentCommand{\setsearchlist}{ O{default} m }
{
\svend_occurrences_set_searchlist:nn { #1 } { #2 }
}
\DeclareExpandableDocumentCommand{\getoccurrences}{ O{default} m }
{
\prop_item:cn { g_svend_occurrences_#1_prop } { #2 }
}
\keys_define:nn { svend/occurrences }
{
name .tl_set:N = \l__svend_occurrences_name_tl,
name .initial:n = default,
list .tl_set:N = \l__svend_occurrences_list_tl,
list .initial:n = default,
self .bool_set:N = \l_svend_occurrences_self_bool,
self .default:n = true,
self .initial:n = false,
}
\prop_new:N \g_svend_occurrences_default_prop
\seq_new:N \g_svend_occurrences_default_list_seq
\int_new:N \l__svend_occurrences_matches_int
\cs_new_protected:Npn \svend_count_occurrences:n #1
{
% create a new property list for storing the values for the current string
% or clear an existing one
\prop_gclear_new:c { g_svend_occurrences_ \l__svend_occurrences_name_tl _prop }
% populate the search list, if self is used
\bool_if:NT \l_svend_occurrences_self_bool
{
\svend_occurrences_set_searchlist:Vn \l__svend_occurrences_name_tl { #1 }
}
% map through the search list
\seq_map_inline:cn { g_svend_occurrences_ \l__svend_occurrences_list_tl _list_seq }
{
% store the current search item; using the token list in
% the regex search expression should avoid problems with
% special characters
\tl_set:Nn \l__svend_occurrences_temp_tl { ##1 }
% count the number of times “search item/space” appears
% (a trailing space is added) and store it in an integer variable
% (in a regex, \u{tl variable name} stands for the contents of the variable
\regex_count:nnN { \u{l__svend_occurrences_temp_tl}\s } { #1~ } \l__svend_occurrences_matches_int
% put the number of matches in the property list, corresponding to
% the current item as key
\prop_gput:cnx { g_svend_occurrences_ \l__svend_occurrences_name_tl _prop }
{ ##1 }
{ \int_to_arabic:n { \l__svend_occurrences_matches_int } }
}
}
% populate a search list (with duplicates removed)
\cs_new_protected:Npn \svend_occurrences_set_searchlist:nn #1 #2
{
\seq_gclear_new:c { g_svend_occurrences_#1_list_seq }
\seq_gset_split:cnn { g_svend_occurrences_#1_list_seq } { ~ } { #2 }
\seq_gremove_duplicates:c { g_svend_occurrences_#1_list_seq }
}
\cs_generate_variant:Nn \seq_gset_split:Nnn { c }
\cs_generate_variant:Nn \svend_occurrences_set_searchlist:nn { V }
\ExplSyntaxOff
\begin{document}
\setsearchlist{0 1 2 3 4 5 6 7}
\countoccurrences[name=new]{1 1 1 1 2 2 2 2}
\getoccurrences[new]{0}\quad
\getoccurrences[new]{1}\quad
\getoccurrences[new]{2}
\bigskip
\countoccurrences{1 2 4 0 3 1 0 0 2 1 7 1 4 2 3 0 0 6 5 2 1 2 3 0}
\begin{tabular}{cc}
0 & \getoccurrences{0} \\
1 & \getoccurrences{1} \\
2 & \getoccurrences{2} \\
3 & \getoccurrences{3} \\
4 & \getoccurrences{4} \\
5 & \getoccurrences{5} \\
6 & \getoccurrences{6} \\
7 & \getoccurrences{7} \\
\end{tabular}
\bigskip
\setsearchlist[alph]{a b c ce}
\countoccurrences[name=letters,list=alph]{a b c a d b b ce f}
\begin{tabular}{cc}
a & \getoccurrences[letters]{a} \\
b & \getoccurrences[letters]{b} \\
c & \getoccurrences[letters]{c} \\
ce & \getoccurrences[letters]{ce} \\
\end{tabular}
\bigskip
\countoccurrences[name=letters,self]{a b c a d b b ce f}
\begin{tabular}{cc}
a & \getoccurrences[letters]{a} \\
b & \getoccurrences[letters]{b} \\
c & \getoccurrences[letters]{c} \\
ce & \getoccurrences[letters]{ce} \\
d & \getoccurrences[letters]{d} \\
f & \getoccurrences[letters]{f} \\
\end{tabular}
\end{document}
允许控制序列的版本,只要它们扩展为字符即可。当控制序列预计包含在列表中时,分隔符必须用键指定sep=
(示例中为分号),因为控制序列后的空格会被忽略(除非你想将其输入为
\countoccurrences{
\fravaerElevEn\space
\fravaerElevTo\space
\fravaerElevTre\space
...
}
以下是示例
\documentclass{article}
\usepackage{xparse,l3regex}
\ExplSyntaxOn
\NewDocumentCommand{\countoccurrences}{ O{} m }
{
\group_begin:
\keys_set:nn { svend/occurrences } { #1 }
% if the self key appeared, make the list name equal to the sequence name
\bool_if:NT \l__svend_occurrences_self_bool
{
\tl_set_eq:NN \l__svend_occurrences_list_tl \l__svend_occurrences_name_tl
}
\svend_count_occurrences:x { #2 }
\group_end:
}
\NewDocumentCommand{\setsearchlist}{ O{default} m }
{
\svend_occurrences_set_searchlist:nn { #1 } { #2 }
}
\DeclareExpandableDocumentCommand{\getoccurrences}{ O{default} m }
{
\prop_item:cn { g_svend_occurrences_#1_prop } { #2 }
}
\keys_define:nn { svend/occurrences }
{
name .tl_set:N = \l__svend_occurrences_name_tl,
name .initial:n = default,
list .tl_set:N = \l__svend_occurrences_list_tl,
list .initial:n = default,
self .bool_set:N = \l__svend_occurrences_self_bool,
self .default:n = true,
self .initial:n = false,
sep .tl_set:N = \l__svend_occurrences_sep_tl,
sep .initial:n = {~},
}
\prop_new:N \g_svend_occurrences_default_prop
\seq_new:N \g_svend_occurrences_default_list_seq
\int_new:N \l__svend_occurrences_matches_int
\tl_new:N \l__svend_occurrences_input_tl
\cs_new_protected:Npn \svend_count_occurrences:n #1
{
\tl_set:Nn \l__svend_occurrences_input_tl { #1~ } % add a trailing space
\tl_replace_all:NVn \l__svend_occurrences_input_tl \l__svend_occurrences_sep_tl { ~ }
% create a new property list for storing the values for the current string
% or clear an existing one
\prop_gclear_new:c { g_svend_occurrences_ \l__svend_occurrences_name_tl _prop }
% populate the search list, if self is used
\bool_if:NT \l__svend_occurrences_self_bool
{
\svend_occurrences_set_searchlist:Vn \l__svend_occurrences_name_tl { #1 }
}
% map through the search list
\seq_map_inline:cn { g_svend_occurrences_ \l__svend_occurrences_list_tl _list_seq }
{
% store the current search item; using the token list in
% the regex search expression should avoid problems with
% special characters
\tl_set:Nn \l__svend_occurrences_temp_tl { ##1 }
% count the number of times “search item/space” appears
% (a trailing space is added) and store it in an integer variable
% (in a regex, \u{tl variable name} stands for the contents of the variable
\regex_count:nVN
{ \u{l__svend_occurrences_temp_tl}\s } % search expression
\l__svend_occurrences_input_tl % token list to search in
\l__svend_occurrences_matches_int % store the result here
% put the number of matches in the property list, corresponding to
% the current item as key
\prop_gput:cnx { g_svend_occurrences_ \l__svend_occurrences_name_tl _prop }
{ ##1 }
{ \int_to_arabic:n { \l__svend_occurrences_matches_int } }
}
}
\cs_generate_variant:Nn \tl_replace_all:Nnn { NV }
\cs_generate_variant:Nn \regex_count:nnN { nV }
\cs_generate_variant:Nn \svend_count_occurrences:n { x }
% populate a search list (with duplicates removed)
\cs_new_protected:Npn \svend_occurrences_set_searchlist:nn #1 #2
{
\seq_gclear_new:c { g_svend_occurrences_#1_list_seq }
\seq_gset_split:cnn { g_svend_occurrences_#1_list_seq } { ~ } { #2 }
\seq_gremove_duplicates:c { g_svend_occurrences_#1_list_seq }
}
\cs_generate_variant:Nn \seq_gset_split:Nnn { c }
\cs_generate_variant:Nn \svend_occurrences_set_searchlist:nn { V }
\ExplSyntaxOff
\begin{document}
\setsearchlist{0 1 2 3 4 5 6 7}
\countoccurrences[name=new]{1 1 1 1 2 2 2 2}
\getoccurrences[new]{0}\quad
\getoccurrences[new]{1}\quad
\getoccurrences[new]{2}
\bigskip
\countoccurrences{1 2 4 0 3 1 0 0 2 1 7 1 4 2 3 0 0 6 5 2 1 2 3 0}
\begin{tabular}{cc}
0 & \getoccurrences{0} \\
1 & \getoccurrences{1} \\
2 & \getoccurrences{2} \\
3 & \getoccurrences{3} \\
4 & \getoccurrences{4} \\
5 & \getoccurrences{5} \\
6 & \getoccurrences{6} \\
7 & \getoccurrences{7} \\
\end{tabular}
\bigskip
\setsearchlist[alph]{a b c ce}
\countoccurrences[name=letters,list=alph]{a b c a d b b ce f}
\begin{tabular}{cc}
a & \getoccurrences[letters]{a} \\
b & \getoccurrences[letters]{b} \\
c & \getoccurrences[letters]{c} \\
ce & \getoccurrences[letters]{ce} \\
\end{tabular}
\bigskip
\countoccurrences[name=letters,self]{a b c a d b b ce f}
\begin{tabular}{cc}
a & \getoccurrences[letters]{a} \\
b & \getoccurrences[letters]{b} \\
c & \getoccurrences[letters]{c} \\
ce & \getoccurrences[letters]{ce} \\
d & \getoccurrences[letters]{d} \\
f & \getoccurrences[letters]{f} \\
\end{tabular}
\bigskip
\def\fravaerElevEn{1}
\def\fravaerElevTo{2}
\def\fravaerElevTre{4}
\def\fravaerElevFire{0}
\def\fravaerElevFem{3}
\def\fravaerElevSeks{1}
\def\fravaerElevSyv{0}
\def\fravaerElevOtte{0}
\def\fravaerElevNi{2}
\def\fravaerElevTi{1}
\def\fravaerElevElleve{7}
\def\fravaerElevTolv{1}
\def\fravaerElevTretten{4}
\def\fravaerElevFjorten{2}
\def\fravaerElevFemten{3}
\def\fravaerElevSeksten{0}
\def\fravaerElevSytten{0}
\def\fravaerElevAtten{6}
\def\fravaerElevNitten{5}
\def\fravaerElevTyve{2}
\def\fravaerElevEnogtyve{1}
\def\fravaerElevToogtyve{2}
\def\fravaerElevTreogtyve{3}
\def\fravaerElevFireogtyve{0}
\setsearchlist{0 1 2 3 4 5 6 7}
\countoccurrences[sep={;}]{
\fravaerElevEn;
\fravaerElevTo;
\fravaerElevTre;
\fravaerElevFire;
\fravaerElevFem;
\fravaerElevSeks;
\fravaerElevSyv;
\fravaerElevOtte;
\fravaerElevNi;
\fravaerElevTi;
\fravaerElevElleve;
\fravaerElevTolv;
\fravaerElevTretten;
\fravaerElevFjorten;
\fravaerElevFemten;
\fravaerElevSeksten;
\fravaerElevSytten;
\fravaerElevAtten;
\fravaerElevNitten;
\fravaerElevTyve;
\fravaerElevEnogtyve;
\fravaerElevToogtyve;
\fravaerElevTreogtyve;
\fravaerElevFireogtyve;
}
\begin{tabular}{cc}
0 & \getoccurrences{0} \\
1 & \getoccurrences{1} \\
2 & \getoccurrences{2} \\
3 & \getoccurrences{3} \\
4 & \getoccurrences{4} \\
5 & \getoccurrences{5} \\
6 & \getoccurrences{6} \\
7 & \getoccurrences{7}
\end{tabular}
\end{document}
最后一张表与第一张表相同。
答案2
计数值保存为\csname c:<token>\endcsname
任意<token>
标记或标记字符串。\countthis
宏计算出现次数,并将\showcount
结果展开。
比较一下使用 TeX 基元时代码的紧凑性:
\newcount\tmpnum
\def\countthis#1{\countthisA #1 {} }
\def\countthisA#1 {\ifx^#1^\else \countthisB{#1}\expandafter\countthisA\fi}
\def\countthisB#1{%
\tmpnum=0\csname c:#1\endcsname\relax
\advance\tmpnum by1
\expandafter\edef\csname c:#1\endcsname{\the\tmpnum}%
}
\def\showcount#1{%
\expandafter\ifx\csname c:#1\endcsname\relax 0\else \csname c:#1\endcsname\fi}
\countthis{1 2 4 0 3 1 0 0 2 1 7 1 4 2 3 0 0 6 5 2 1 2 3 0}
test:
0:\showcount0, 1:\showcount1, 2:\showcount2, 3:\showcount3, 4:\showcount4,
5:\showcount5, 6:\showcount6, 7:\showcount7, 8:\showcount8, 9:\showcount9,
答案3
如果你要测试的整数值不是太多,那么这里有一个相当粗糙的方法可以达到目的:
\documentclass{article}
\usepackage{etoolbox}
\makeatletter
\newcommand\countoccurances[1]{\ae@count@occurances #1 \relax\@nil}
\def\ae@count@occurances#1 #2\@nil{%%
\def\ae@continue{}%%
\ifx\relax#2
\ae@increment@item{#1}%%
\else
\def\ae@continue{\ae@count@occurances#2\@nil}%%
\ae@increment@item{#1}%%
\fi
\ae@continue
}
\def\ae@increment@item#1{%%
\ifcsundef{ae@num@#1}
{\expandafter\edef\csname ae@num@#1\endcsname{1}}
{\expandafter\edef\csname ae@num@#1\endcsname{\number\numexpr\csname ae@num@#1\endcsname+1}}
}
\newcommand\aegetcount[1]{\csname ae@num@#1\endcsname}
\makeatother
\begin{document}
\countoccurances{1 2 4 0 3 1 0 0 2 1 7 1 4 2 3 0 0 6 5 2 1 2 3 0}
\begin{tabular}{cc}
1 & \aegetcount{1} \\
2 & \aegetcount{2} \\
3 & \aegetcount{3} \\
4 & \aegetcount{4} \\
5 & \aegetcount{5} \\
6 & \aegetcount{6} \\
7 & \aegetcount{7} \\
\end{tabular}
\end{document}
以下是上述内容的 LaTeX3 版本:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand\countoccurances{m}
{
\ae_count_occurences:n {#1}
}
\seq_new:N \l_count_integer_seq
\seq_new:N \l_count_integer_values_traced_seq
\cs_new_protected:Npn \ae_count_occurences:n #1
{
\seq_set_split:Nnn \l_count_integer_seq {~} {#1}
\seq_map_inline:Nn \l_count_integer_seq
{
\cs_if_free:cTF { __ae_count_integer_##1: }
{
\cs_new:cn { __ae_count_integer_##1: } { 1 }
\seq_put_right:Nn \l_count_integer_values_traced_seq
{ __ae_count_integer_##1: }
}
{ \cs_set:cx { __ae_count_integer_##1: }
{ \int_eval:n
{ \use:c { __ae_count_integer_##1: } + 1 } } }
}
}
\NewDocumentCommand\aegetcount{m}
{
\cs_if_free:cF { __ae_count_integer_#1: }
{ \use:c { __ae_count_integer_#1: }}
}
\NewDocumentCommand\aeclearcounts{}
{
\seq_map_inline:Nn \l_count_integer_values_traced_seq
{
\cs_undefine:c { ##1 }
}
\seq_clear:N \l_count_integer_values_traced_seq
}
\ExplSyntaxOff
\begin{document}
\countoccurances{1 2 4 0 3 1 0 0 2 1 7 1 4 2 3 0 0 6 5 2 1 2 3 0}
\begin{tabular}{cc}
1 & \aegetcount{1} \\
2 & \aegetcount{2} \\
3 & \aegetcount{3} \\
4 & \aegetcount{4} \\
5 & \aegetcount{5} \\
6 & \aegetcount{6} \\
7 & \aegetcount{7} \\
\end{tabular}
\vspace{1in}
\aeclearcounts
\countoccurances{1 2 4 0 3 1 0 0 2 1 7 1 4 2 3 0 0 6 5 2 1 2 3 0}
\begin{tabular}{cc}
1 & \aegetcount{1} \\
2 & \aegetcount{2} \\
3 & \aegetcount{3} \\
4 & \aegetcount{4} \\
5 & \aegetcount{5} \\
6 & \aegetcount{6} \\
7 & \aegetcount{7} \\
\end{tabular}
\end{document}
对于 LaTeX3 版本,我添加了清除各种整数计数的功能。我将其设为第二个命令,以便用户可以控制何时执行此操作。
答案4
这是一个使用的解决方案pgffor
:
\documentclass[varwidth,border=7]{standalone}
\usepackage{pgffor}
% the occurence macro using foreach
\newcounter{founded}
\def\occurence[#1]#2{%
\setcounter{founded}{0}%
\foreach \element in #2 {\ifnum \element = #1 \stepcounter{founded}\fi}%
\thefounded%
}
\begin{document}
% store the data
\newcommand{\data}{
3,4,0,3,0,4,3,7,7,3,
4,4,7,4,1,1,4,7,8,2,
9,3,4,1,3,3,5,7,9,5,
8,1,8,5,1,9,1,2,9,8,
8,7,0,0,9,1,9,5,7,8,
5,8,1,7,7,1,1,7,4,2,
7,9,0,5,4,2,5,9,4,8,42}
% count the data
\foreach \j in {0,...,9} {
\j : \occurence[\j]\data\par
}
42 : \occurence[42]\data
\end{document}