在自定义宏中,我定义了另一个命令,该命令可用于生成包含文本字母编号的表格。我已大大精简了宏,以便只显示与我的问题相关的重要条目。
因为分组和扩展的需要,我选择了\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}