특정 값을 가진 항목 수 계산

특정 값을 가진 항목 수 계산

꽤 많은 항목(관련된 경우 모든 정수 값)이 포함된 목록이 있다고 가정합니다. 예:

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 버전이 선호됩니다.

업데이트

사용egreg의 코드, 다음은 0'만 반환하는 이유는 무엇이며 (가능한 경우) 여전히 모든 \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이름으로 지정되어야 합니다.

에 대한 선택적 인수가 \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}

여기에 이미지 설명을 입력하세요

아이디어는 비슷해요https://tex.stackexchange.com/a/216376/9335.

관련 정보