我尝试使用clist
来作为函数的参数。然而,一个参数还可以包含函数的其他可选参数。
我怎样才能做到这一点?
\documentclass{article}
\ExplSyntaxOn
\cs_generate_variant:Nn \regex_extract_all:nnN { nx }
\seq_new:N \l__ghs_tmpA_seq
\seq_new:N \l__ghs_tmpB_seq
\NewDocumentCommand{\HPsatz}{mO{}O{}}{
\regex_extract_all:nxN {([HP+\d]*)} {#1} \l__ghs_tmpA_seq
\regex_extract_all:nxN {\[(.*)\]} {#1} \l__ghs_tmpB_seq
% \seq_use:Nn \l__ghs_tmpB_seq {,}
#1:~
\str_case_e:nnF { \seq_item:Nn \l__ghs_tmpA_seq { 1 } } {
{ H123 }{ First~sentence. }
{ H124 }{ Second~sentence. }
{ H125 }{ Third\seq_item:Nn \l__ghs_tmpB_seq { 1 }~sentence. }
}
{not found}
\\
}
\newcommand {\GHStext}[1]
{
\clist_map_function:nN {#1} \HPsatz
}
\ExplSyntaxOff
\begin{document}
\GHStext{H123, H125[~best][really]}
\end{document}
这是regex
最干净的方法吗?为什么它一直将[
and]
放在正则表达式的匹配中,尽管它位于括号之外?
答案1
您可以使用基于正则表达式的方法,但不需要像 那样花哨的东西\regex_extract:nnN
。您只需将 a 之前的内容括起来[
(如果有的话)。
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\HPsatz}{mO{}O{}}
{
#1:~
\str_case_e:nnF { #1 }
{
{ H123 }{ First~sentence. }
{ H124 }{ Second~sentence. }
{ H125 }{ Third~sentence#2#3. }
}
{not found}
\par
}
\NewDocumentCommand{\GHStext}{m}
{
\clist_map_function:nN {#1} \__ghs_split:n
}
\tl_new:N \l__ghs_tmp_tl
\cs_new_protected:Nn \__ghs_split:n
{
\tl_set:Nn \l__ghs_tmp_tl { #1 }
\regex_replace_once:nnN { ([^\[]*) } { \{\1\} } \l__ghs_tmp_tl
\exp_last_unbraced:NV \HPsatz \l__ghs_tmp_tl
}
\ExplSyntaxOff
\begin{document}
\GHStext{H123, H125[~best][really]}
\end{document}
我只是以某种方式使用了可选参数。
答案2
棘手的是将其转换H125[ best]
为{H125}[ best]
您的命令的正确参数形式。
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\HPsatz}{mO{}O{}}{
#1:~
\str_case_e:nnF { #1 } {
{ H123 }{ First~sentence. }
{ H124 }{ Second~sentence. }
{ H125 }{ Third#2~sentence. }
}
{not found}
\par
}
\cs_new:Npn\HP_grab:w#1[#2]#3\scan_stop:{\HPsatz{#1}[#2]}
\seq_new:N \l__ghs_seq_numbers
\newcommand {\GHStext}[1]
{
\clist_map_inline:nn {#1} {\HP_grab:w##1[]\scan_stop:}
}
\ExplSyntaxOff
\begin{document}
\GHStext{H123, H125[~best]}
\end{document}
答案3
以下代码可为您的输入实现合理稳定的解析,前提是可选部分放在前面,而不是放在键后面。它允许相当灵活的输入,但无法处理嵌套[]
在可选参数中且没有额外括号的情况(因此,[a[b]c]
将其读a[b
作可选参数,[{a[b]c}]
可以正常工作并读取a[b]c
)。
\documentclass{article}
\ExplSyntaxOn
\cs_new:Npn \__ghs_oarg:Nn #1#2
{ \use:e { \exp_not:N #1 \__ghs_oarg_search:n {#2} } }
\cs_new:Npn \__ghs_oarg_search:n #1
{
\tl_if_head_eq_meaning:nNTF {#1} [
{ \if_false: { \fi: \__ghs_oarg_collect:w #1 } }
{ {} { \exp_not:n {#1} } }
}
\cs_new:Npn \__ghs_oarg_collect:w [#1]
{
{ \exp_not:n {#1} }
\exp_after:wN \__ghs_oarg_collect_aux:n
\exp_after:wN { \if_false: } \fi:
}
\cs_new:Npn \__ghs_oarg_collect_aux:n #1
{
\tl_if_single:nTF {#1}
{ \tl_trim_spaces:n {#1} }
{ { \tl_trim_spaces:n {#1} } }
}
\cs_generate_variant:Nn \regex_extract_all:nnN { nx }
\NewExpandableDocumentCommand \GHStext { m }
{ \clist_map_function:nN {#1} \__ghs_hpsatz_wrapper:n }
\cs_new:Npn \__ghs_hpsatz_wrapper:n #1
{ \__ghs_oarg:Nn \__ghs_hpsatz:nn {#1} }
\NewDocumentCommand{\HPsatz}{mO{}}
{ \__ghs_hpsatz:nn {#2} {#1} }
\cs_new:Npn \__ghs_hpsatz:nn #1#2
{
#2:~
\str_case_e:nnF {#2} {
{ H123 }{ First~sentence. }
{ H124 }{ Second~sentence. }
{ H125 }{ Third#1~sentence. }
}
{not~ found}
\\
}
\ExplSyntaxOff
\begin{document}
\GHStext
{
H123,
[~test1]H125,
[~test2] H125,
[~test3]{H125},
[~test4] {H125}
}
\end{document}