expl3 替换 \tex_lowercase:D 进行冒号解析

expl3 替换 \tex_lowercase:D 进行冒号解析

我是 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}

在此处输入图片描述

相关内容