我尝试使用后端作为编程语言来计算文本文件中的符号总数expl3
。我的想法是首先计算文件行中的符号数:
\ior_get_str:NN \g_file_ior \l_line_tl
\tl_map_inline:Nn \l_line_tl { \int_incr:N \l__sergiokapone_count_int}
然后将其添加到收集器\l_total_int
\int_add:Nn \l_total_int {\l_count_int}
我认为可以从文件行跳到另一行\ior_if_eof:NTF \g_file_ior
\begin{filecontents*}{\jobname.dat}
bbb
wwww
rrrrr
\end{filecontents*}
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\ior_new:N \g_file_ior
\tl_new:N \l_line_tl
\int_new:N \l_line_count_int
\int_new:N \l_total_int
\NewDocumentCommand{\CharCount}{ m }
{
\ior_open:Nn \g_file_ior {#1}
\int_zero:N \l_line_count_int
\int_zero:N \l_total_int
\ior_if_eof:NTF \g_file_ior {} % jumping from line to line untill not eof
{
\ior_get_str:NN \g_file_ior \l_line_tl % Read line to \l_line_tl
\tl_map_inline:Nn \l_line_tl { \int_incr:N \l_line_count_int} % count number of symbols in \l_line_tl
\int_add:Nn \l_total_int {\l_line_count_int} % add current number of symbols to collector \l_total_int
}
\int_use:N \l_total_int
}
\ExplSyntaxOff
\begin{document}
\CharCount{\jobname.dat}
\end{document}
我总是得到3
正确的数字(12
在 MWE 情况下)。请帮助我理解。
答案1
该expl3
代码有一个实验性的功能(嗯,它从 2012 年就存在了),ior_map_inline
它读取一行又一行,并使用一些用户定义的宏来处理该行,这里称为\count_number_of_characters:n
使用行内容作为参数。
在这个宏中,我已经用来\tl_count:N
获取字符的数量。
\begin{filecontents*}{\jobname.dat}
bbb
wwww
rrrrr
\end{filecontents*}
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\ior_new:N \g_file_ior
\tl_new:N \l_line_tl
\int_new:N \l_line_count_int
\int_new:N \l_total_int
\cs_new:Nn \count_number_of_characters:n {%
\tl_set:Nn \l_tmpa_tl {#1}
\int_add:Nn \l_total_int {\tl_count:N \l_tmpa_tl}
}
\NewDocumentCommand{\CharCount}{ m }
{
\ior_open:Nn \g_file_ior {#1}
\int_zero:N \l_line_count_int
\int_zero:N \l_total_int
\ior_map_inline:Nn \g_file_ior {
\count_number_of_characters:n{##1}
}
\ior_close:N \g_file_ior
\int_use:N \l_total_int
}
\ExplSyntaxOff
\begin{document}
\CharCount{\jobname.dat}
\end{document}