使用控制序列作为属性列表中键名的一部分

使用控制序列作为属性列表中键名的一部分

改编约瑟夫的回答从文本中提取数字和非数字部分计算文本中的非数字部分。我的方法背后的想法是使用正则表达式将文本中的数字和符号部分分开(如答案中所示),并将符号和数字部分分别作为键名和值存储在属性列表中。这工作得很好。我遇到的问题是当输入是控制序列(如\alpha和 sub/superscipt_和)时^。代码显示了这个问题,例如\test{\alpha}不产生\alpha(符号)。

\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\test}{ m }
{
    \simon_test:n {#1}
}

\cs_new:Npn \simon_test:n #1
{
    \prop_clear:N \l_tmpa_prop
    \exp_args:NNn \prop_put:Nnn \l_tmpa_prop {#1} {} % the value is of no importance for the mwe

    \prop_map_inline:Nn \l_tmpa_prop
    {
        ##1
    }
}
\ExplSyntaxOff

\begin{document}
$\test{a_n}$ should be $a_n$

$\test{b^2}$ should be $b^n$

$\test{\alpha}$ should be $\alpha$
\end{document}

在此处输入图片描述

我相信这是因为 l3prop 将键名存储为字符串。

以这种方式使用属性列表是我代码的核心部分(我可以重写它以使用两个序列,但我发现属性列表更易于使用)。有没有办法克服这个问题,还是我必须重写我的代码?

答案1

属性列表背后的想法是,它存储键值对,并且键被视为字符串(从expl3技术意义上讲)。将键用作值从一开始就是错误的。

此外,使用\prop_map_inline:Nn不能保证精确的顺序,因此应该使用它来其他内容,一般不用于排版(除非您不关心顺序或一旦设置就不会修改值prop)。

使用\tl_rescan:nn,但请记住可能会存在一些次要问题。

\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\test}{ m }
{
    \simon_test:n {#1}
}

\cs_new:Npn \simon_test:n #1
{
    \prop_clear:N \l_tmpa_prop
    \prop_put:Nnn \l_tmpa_prop {#1} {} % the value is of no importance for the mwe

    \prop_map_inline:Nn \l_tmpa_prop
    {
      \tl_rescan:nn { } { ##1 }
    }
}
\ExplSyntaxOff

\begin{document}
$\test{a_n}$ should be $a_n$

$\test{b^2}$ should be $b^n$

$\test{\alpha}$ should be $\alpha$
\end{document}

我删除了\exp_args:Nnn那个什么都不做的东西。它的存在是出于技术原因,但甚至没有记录。

在此处输入图片描述

或者,您可以设置辅助属性列表:

\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\test}{ m }
 {
  \simon_test:n {#1}
 }

\cs_new:Npn \simon_test:n #1
 {
  \prop_clear:N \l_tmpa_prop
  \prop_clear:N \l_tmpb_prop
  \prop_put:Nnn \l_tmpa_prop {#1} {} % the value is of no importance for the mwe
  \prop_put:Nnn \l_tmpb_prop {#1} {#1}
    \prop_map_inline:Nn \l_tmpa_prop
    {
      \prop_item:Nn \l_tmpb_prop { ##1 }
    }
}
\ExplSyntaxOff

\begin{document}
$\test{a_n}$ should be $a_n$

$\test{b^2}$ should be $b^n$

$\test{\alpha}$ should be $\alpha$
\end{document}

答案2

我将使用一个序列来存储“符号”

\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\test}{ m }
{ \simon_test:n {#1} }

\seq_clear:N \l_tmpa_seq

\cs_new_protected:Npn \simon_test:n #1
  {
    \seq_put_right:Nn \l_tmpa_seq {#1}
    \seq_map_inline:Nn \l_tmpa_seq {##1}
}
\ExplSyntaxOff

\begin{document}
$\test{a_n}$ should be $a_n$

$\test{b^2}$ should be $b^n$

$\test{\alpha}$ should be $\alpha$
\end{document}

尽管也可以将数据本身放入属性列表中(更复杂,并且可能需要完整的用例才能确定它是否是最佳计划)。

相关内容