計算具有特定值的條目數

計算具有特定值的條目數

假設我有一個包含相當多條目的列表(所有整數值,如果相關的話),例如,

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、...、 '的數量嗎?7

PS 所有解決方案都可以接受,但首選 LaTeX 3 版本。

更新

使用埃格格的程式碼,為什麼以下僅返回0s 以及我如何(如果可能)仍然使用所有\defs 並獲得正確的結果?

\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名稱中指定。

如果可選參數\countoccurrencescontains 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}

在此輸入影像描述

這個想法類似於https://tex.stackexchange.com/a/216376/9335

相關內容