将输入转换为连续编号的命令

将输入转换为连续编号的命令

是否有命令能够将输入转换为连续编号(并且当再次使用该输入时,该命令将调用之前分配的编号)?

背景:我讨论了各种科学实验。在源 TEX 文件中,我使用了实验室笔记本中引用的实验编号,但在最终的 PDF 中,我希望它们按顺序编号。显然,我希望对同一个实验使用相同的编号。第一次提到实验时,它应该收到一个新的渐进编号,否则它应该回忆起分配给它的编号。

% the \magicnumbering is a command name that I invented for this purpose!

\documentclass{report}

\begin{document}

I did \magicnumbering{experimentA} before \magicnumbering{experimentB}, but \magicnumbering{experimentC} was done even before \magicnumbering{experimentA}.

\end{document}

我希望打印出这个 MWE:

我先做 1 然后再做 2,但是 3 甚至在 1 之前就完成了。

我确信有一个非常简单的解决方案,但我找不到。对不起,我的无知,希望你能帮忙。

答案1

下面通过将键存储在属性列表中(使用expl3)来实现此目的。要更改输出的格式,可以更改的定义\magicnumbering_output:n

\documentclass[]{report}

\ExplSyntaxOn
\prop_new:N \g_magicnumbering_numbers_prop
\int_new:N \g_magicnumbering_current_int
\tl_new:N \l_magicnumbering_output_tl
\cs_new_protected:Npn \magicnumbering_output:n #1
  {
    #1
  }
\cs_generate_variant:Nn \magicnumbering_output:n { V }
\cs_new_protected:Npn \magicnumbering_parse:n #1
  {
    \prop_get:NnNTF
      \g_magicnumbering_numbers_prop {#1} \l_magicnumbering_output_tl
      { \magicnumbering_output:V \l_magicnumbering_output_tl }
      {
        \int_gincr:N \g_magicnumbering_current_int
        \prop_put:NnV
          \g_magicnumbering_numbers_prop {#1} \g_magicnumbering_current_int
        \magicnumbering_output:V \g_magicnumbering_current_int
      }
  }
\NewDocumentCommand \magicnumbering { m } { \magicnumbering_parse:n {#1} }
\ExplSyntaxOff

\begin{document}
I did \magicnumbering{experimentA} before \magicnumbering{experimentB}, but
\magicnumbering{experimentC} was done even before
\magicnumbering{experimentA}.
\end{document}

在此处输入图片描述

相关内容