可扩展的、L3 中宏内带有参数的全局定义

可扩展的、L3 中宏内带有参数的全局定义

在自定义宏中,我定义了另一个命令,该命令可用于生成包含文本字母编号的表格。我已大大精简了宏,以便只显示与我的问题相关的重要条目。

因为分组和扩展的需要,我选择了\xdef

\xdef\LetterQa{\seq_item:Nn\l_th_letter_qty_out_seq{1}}

我怀疑这不是 L3 的正确语法。

我的问题是:如何定义一个命令,以便可以传递一个参数,即原理(不起作用):

\xdef\LetterQ##1{\seq_item:Nn\l_th_letter_qty_out_seq{##1}}

获取每个可能字母的输出,而无需为每个字母定义一个额外的命令。

提前致谢。

在此处输入图片描述

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{siunitx,xfp,xintexpr}

\ExplSyntaxOn

   \int_new:N \l_thomas_Text_ABCabc_int
   \seq_new:N \l_th_letter_All_seq
   \seq_new:N \l_th_letter_qty_out_seq
   \seq_new:N \l_th_letter_rel_qty_out_seq

   \cs_generate_variant:Nn \regex_count:nnN { xnc }

\NewDocumentCommand{ \CountLetter }{ m }
{
  \group_begin:
  \regex_count:nnN { [A-Za-z]|ü|Ü|ä|Ä|ö|Ö|ß } { #1 } \l_thomas_Text_ABCabc_int

  \seq_set_from_clist:Nn \l_th_letter_All_seq { a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,ä,ö,ü,ß }
  \seq_clear:N \l_th_letter_qty_out_seq
  \seq_clear:N \l_th_letter_rel_qty_out_seq
  \seq_map_inline:Nn \l_th_letter_All_seq
    {
     \int_zero_new:c { l_thomas_txt_ \tl_to_str:n {##1} _int }
     \regex_count:xnc { \tl_lower_case:n {##1} | \tl_upper_case:n {##1} }
                        { #1 } { l_thomas_txt_ \tl_to_str:n {##1} _int }
     \seq_put_right:Nx \l_th_letter_qty_out_seq
             { \fp_eval:n { \use:c{ l_thomas_txt_ \tl_to_str:n {##1} _int } } }
     \seq_put_right:Nx \l_th_letter_rel_qty_out_seq
             { \fp_eval:n { \use:c { l_thomas_txt_ \tl_to_str:n {##1} _int } / \l_thomas_Text_ABCabc_int } }
    }

  \xdef\LetterAll{ \fp_eval:n { \l_thomas_Text_ABCabc_int } }

  \xdef\LetterQa{ \seq_item:Nn \l_th_letter_qty_out_seq{1} }

\group_end:
}

\ExplSyntaxOff

\parindent0pt

\begin{document}

\CountLetter{Das ist ein ziemlich sinnloser Text ohne Hand und Fuß. Er lachte höhnisch, \dots }

\bigskip
In dem Text sind \LetterAll{} Buchstaben. Davon kommt das a \LetterQa{}-mal vor.

\end{document}

答案1

我将使用属性列表而不是序列:

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{siunitx,xfp,xintexpr}

\ExplSyntaxOn

   \int_new:N \l_thomas_Text_ABCabc_int
   \seq_new:N \l_th_letter_All_seq
   \seq_new:N \l_th_letter_qty_out_seq
   \seq_new:N \l_th_letter_rel_qty_out_seq
   \prop_new:N \l_th_letter_qty_out_prop


   \cs_generate_variant:Nn \regex_count:nnN { xnc }

\NewDocumentCommand{ \CountLetter }{ m }
{
  \group_begin:
  \regex_count:nnN { [A-Za-z]|ü|Ü|ä|Ä|ö|Ö|ß } { #1 } \l_thomas_Text_ABCabc_int

  \seq_set_from_clist:Nn \l_th_letter_All_seq { a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,ä,ö,ü,ß }
  \seq_clear:N \l_th_letter_qty_out_seq
  \seq_clear:N \l_th_letter_rel_qty_out_seq
  \seq_map_inline:Nn \l_th_letter_All_seq
    {
     \int_zero_new:c { l_thomas_txt_ \tl_to_str:n {##1} _int }
     \regex_count:xnc { \tl_lower_case:n {##1} | \tl_upper_case:n {##1} }
                        { #1 } { l_thomas_txt_ \tl_to_str:n {##1} _int }
     \seq_put_right:Nx \l_th_letter_qty_out_seq
             { \fp_eval:n { \use:c{ l_thomas_txt_ \tl_to_str:n {##1} _int } } }
     \seq_put_right:Nx \l_th_letter_rel_qty_out_seq
           {\fp_eval:n { \use:c { l_thomas_txt_ \tl_to_str:n {##1} _int } / \l_thomas_Text_ABCabc_int } }  
     \prop_gput:Nnx  \l_th_letter_qty_out_prop 
      { ##1 }
      { 
       { \fp_eval:n { \use:c{ l_thomas_txt_ \tl_to_str:n {##1} _int } } }
      }
    }
     \prop_gput:Nnx  \l_th_letter_qty_out_prop {All}
     {\fp_eval:n { \l_thomas_Text_ABCabc_int}}
  \group_end:
}

\NewDocumentCommand{ \ShowCountLetter }{ m }
{ \prop_item:Nn\l_th_letter_qty_out_prop { #1 }}
\ExplSyntaxOff

\parindent0pt

\begin{document}

\CountLetter{Das ist ein ziemlich sinnloser Text ohne Hand und Fuß. Er lachte höhnisch, \dots }

\bigskip
In dem Text sind \ShowCountLetter{All} Buchstaben. Davon kommt das a \ShowCountLetter{a}-mal vor.

a: \ShowCountLetter{a}, ö: \ShowCountLetter{ö}
\end{document}

在此处输入图片描述

相关内容