我是 expl3 编程的新手,在冒号(:
)解析方面遇到了一个问题。
对于一些与 TikZ 相关的代码,我必须将其拆分#1:#2
成几部分。我在这个方向上找到了几个问题,但我无法找到合适的解决方案。
我能够重现小写字母技巧,但其中包括已弃用的\tex_lowercase:D
。这是我当前正在使用但已弃用的代码:
\documentclass{article}
\usepackage{expl3,xparse}
\ExplSyntaxOn
\cs_set_nopar:Npn \__example_point:nn #1#2
{
Example~with~#1~and~#2.
}
\group_begin:
\char_set_lccode:nn { `? } { `: }
\tex_lowercase:D {
\group_end:
\cs_set_nopar:Npn \__example_point:w #1 ? #2 \q_stop
}{
\__example_point:nn {#1}{#2}
}
\cs_set_nopar:Npn \__example_point:n #1
{
\__example_point:w #1 \q_stop
}
\DeclareDocumentCommand{\myexample}{ m }{ \__example_point:n {#1} }
\ExplSyntaxOff
\begin{document}
\myexample{34.2:47.9}
\end{document}
输出为
以 34.2 和 47.9 为例。
我正在寻找\tex_lowercase:D
我的当前的替代品\__example_point:w
。
我猜想有一些使用扩展的聪明方法,但我无法找到它。
答案1
你可以利用\use:x
\documentclass{article}
\usepackage{expl3,xparse}
\ExplSyntaxOn
\cs_new_nopar:Npn \__example_point:nn #1#2
{
Example~with~#1~and~#2.
}
\use:x
{
\cs_new_nopar:Npn \exp_not:N \__example_point:w ##1 \c_colon_str ##2 \exp_not:N \q_stop
}
{
\__example_point:nn {#1}{#2}
}
\cs_new_nopar:Npn \__example_point:n #1
{
\__example_point:w #1 \q_stop
}
\NewDocumentCommand{\myexample}{ m }{ \__example_point:n {#1} }
\ExplSyntaxOff
\begin{document}
\myexample{34.2:47.9}
\end{document}
注意\cs_new…
,哪种做法比哪种更好\cs_set…
。
这也有效:
\ExplSyntaxOn
\cs_new_nopar:Npn \__example_point:nn #1#2
{
Example~with~#1~and~#2.
}
\tl_set:Nx \l_tmpa_tl { ##1 \c_colon_str ##2 }
\exp_last_unbraced:NNV \cs_new_nopar:Npn \__example_point:w \l_tmpa_tl \q_stop
{
\__example_point:nn {#1}{#2}
}
\cs_new_nopar:Npn \__example_point:n #1
{
\__example_point:w #1 \q_stop
}
\NewDocumentCommand{\myexample}{ m }{ \__example_point:n {#1} }
\ExplSyntaxOff
答案2
你可以\seq_set_split:Nnn
这样使用:
\documentclass{article}
\usepackage{expl3,xparse}
\ExplSyntaxOn
\cs_set_nopar:Npn \__example_point:nn #1#2
{
Example~with~#1~and~#2.
}
\cs_generate_variant:Nn \seq_set_split:Nnn {NVn}
\cs_set_nopar:Npn \__example_point:n #1
{
\seq_set_split:NVn \l_tmpa_seq \c_colon_str {#1}
\__example_point:nn {\seq_item:Nn\l_tmpa_seq {1}}{\seq_item:Nn\l_tmpa_seq {2}}
}
\DeclareDocumentCommand{\myexample}{ m }{ \__example_point:n {#1} }
\ExplSyntaxOff
\begin{document}
\myexample{34.2:47.9}
\end{document}