是否有命令能够将输入转换为连续编号(并且当再次使用该输入时,该命令将调用之前分配的编号)?
背景:我讨论了各种科学实验。在源 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}