如何将诸如 \emph{\arabic*)} 的表达式映射到 \emph{\arabic{#1})}?

如何将诸如 \emph{\arabic*)} 的表达式映射到 \emph{\arabic{#1})}?

label=问题陈述:将列表选项 () 中找到的适合 rhs 的输入表达式作为输入enumitem,例如\arabic*)(item a) 或\emph{\arabic*)}(item b),用 替换*{#1}并将其用作名为 的函数的替换表达式\g__erw_format:n。对于项目 a,我可以使用特殊的w-函数解决此问题。项目 b 是使用正则表达式正在进行的工作。因此我的问题是:如何解决指定的任意表达式的问题?

\documentclass{report}
\usepackage{xparse}
\usepackage{hyperref}

\ExplSyntaxOn

\newcounter{foo}

\cs_new_protected:Npn \g__erw_format:n #1{}
\cs_new_protected:Npn \g__erw_star_a:w #1*#2 \q_stop{\cs_gset:Nn\g__erw_format:n{#1{##1}#2}}
\cs_new_protected:Nn \g__erw_star_a:n {\g__erw_star_a:w#1\q_stop}

\cs_new_protected:Nn \g__erw_star_b:n
{
  \cs_gset:Nn\g__erw_format:n{
    \tl_set:Nn\l_tmpa_tl{#1}
    \regex_replace_once:nnN { * } { {##1} } \l_tmpa_tl
%    \tl_to_str:N\l_tmpa_tl
    \token_to_meaning:N\l_tmpa_tl
%    \tl_use:N\l_tmpa_tl%%ERROR: Missing number, treated as zero.
%%--- TeX said ---
%%<to be read again> 
%%                   \c@{ 
%%l.49 \g__erw_format:n{foo}    
  }
}

%https://tex.stackexchange.com/questions/584509/testing-for-foo-vs-foo

\ExplSyntaxOff

\begin{document}

\ExplSyntaxOn

\refstepcounter{foo}
\g__erw_star_a:n{\arabic*)}
\g__erw_format:n{foo}\\
%\g__erw_star_a:n{\emph{\arabic*)}} % ERROR File ended while scanning use of \g__erw_star_a:w
%\g__erw_format:n{foo}
\g__erw_star_b:n{\emph{\arabic*)}}
\g__erw_format:n{foo}

\ExplSyntaxOff

\end{document}

在此处输入图片描述

答案1

首先必须将参数保存在带有

\tl_set:Nn \l__erw_tmpa_tl {#1}

然后执行正则表达式替换(请注意,您必须转义,*因为它是一个正则表达式量词):

\regex_replace_once:nnN { \* } { \cB{\cP\#1\cE} } \l__erw_tmpa_tl

然后才在定义中插入改变后的标记列表:

\exp_args:NNo \cs_gset:Nn \erw_format:n { \l__erw_tmpa_tl }

但请注意,这将取代全部 *,因此{#1}您可能需要检查*前面是否有\arabic\roman之类的东西。您可以通过循环遍历可能的命令列表并尝试进行替换来轻松完成此操作:

\tl_const:Nn \c__erw_count_formats_tl
  { { arabic } { roman } { Roman } { alph } { Alph } }
\cs_new_protected:Nn \erw_star_b:n
  {
    \tl_set:Nn \l__erw_tmpa_tl {#1}
    \tl_map_inline:Nn \c__erw_count_formats_tl
      { \regex_replace_once:nnN { \c{##1}\* } { \c{##1}\cB{\cP\#1\cE} } \l__erw_tmpa_tl }
    \exp_args:NNo \cs_gset:Nn \erw_format:n { \l__erw_tmpa_tl }
  }

另请注意\g__...\l__...\c__...前缀用于变量,而不是函数。如果函数是公共的(例如\erw_something:n),则没有前缀;\__如果函数是私有的(例如\__erw_something:n),则有前缀。

这是两个版本的 MWE(我建议您使用版本 2):

\documentclass{report}
\usepackage{xparse}
\usepackage{hyperref}

\ExplSyntaxOn

\newcounter{foo}

\tl_new:N \l__erw_tmpa_tl
\cs_new_protected:Npn \erw_format:n #1 { }

% Version 1:
% \cs_new_protected:Nn \erw_star_b:n
%   {
%     \tl_set:Nn \l__erw_tmpa_tl {#1}
%     \regex_replace_once:nnN { \* } { \cB{\cP\#1\cE} } \l__erw_tmpa_tl
%     \exp_args:NNo \cs_gset:Nn \erw_format:n { \l__erw_tmpa_tl }
%   }

% Version 2:
\tl_const:Nn \c__erw_count_formats_tl
  { { arabic } { roman } { Roman } { alph } { Alph } }
\cs_new_protected:Nn \erw_star_b:n
  {
    \tl_set:Nn \l__erw_tmpa_tl {#1}
    \tl_map_inline:Nn \c__erw_count_formats_tl
      { \regex_replace_once:nnN { \c{##1}\* } { \c{##1}\cB{\cP\#1\cE} } \l__erw_tmpa_tl }
    \exp_args:NNo \cs_gset:Nn \erw_format:n { \l__erw_tmpa_tl }
  }

%https://tex.stackexchange.com/questions/584509/testing-for-foo-vs-foo

\ExplSyntaxOff

\begin{document}

\ExplSyntaxOn

\refstepcounter{foo}

\erw_star_b:n {\arabic*)}
\erw_format:n {foo}

\par

\erw_star_b:n {\emph{\arabic*)}}
\erw_format:n {foo}

\ExplSyntaxOff

\end{document}

相关内容