expl3 — 在 \use:c 之前完全展开

expl3 — 在 \use:c 之前完全展开

考虑

\def\niii{10}
\def\niiii{21}

我可以轻松通过以下方式获得

\use:c {niii} % 10
\use:c {niiii} % 21

但是我想使用 动态创建 csname \int_step_inline:nn {4} {i}。我尝试了以下方法,但都没有奏效

\use:c { n\int_step_inline:nn {4} {i} }
\exp_args:Nx \use:c { n\int_step_inline:nn {4} {i} }

\tl_set:Nx \l_tempa_tl { n\int_step_inline:nn {4}{i} }
\use:c {\tl_use:N \l_tempa_tl}

答案1

参数\use:c必须仅扩展为字符标记。由于\int_step_inline:nn不能完全扩展(手册中旁边没有星号或空心星号),因此不能在这样的地方使用它。

可以使用\int_step_function:nN类似

\cs_new:Nn \__antshar_makei:n { i }

\use:c { note \int_step_function:nN { 3 } \__antshar_makei:n }

但如果目的是获得四个字符串i,则使用更简单\prg_replicate:nn

\use:c { note \prg_replicate:nn { 3 } { i } }

但也许你想要创建\notei\noteii等等\noteiii。您可以使用以下方式定义数值数组

\intarray_new:Nn \g_antshar_note_intarray {100}

这将分配一个长度为 100 的数组。如果您想在数组中存储值(该数组初始化为所有 0 条目)

\intarray_gset:Nnn \g_antshar_note_intarray { 3 } { 10 }
\intarray_gset:Nnn \g_antshar_note_intarray { 4 } { 21 }

并且你可以(扩展地)使用以下方式检索值

\intarray_item:Nn \g_antshar_note_intarray { 3 }

答案2

该命令\int_to_roman:n可以在 内部使用\use:c

在此处输入图片描述

\documentclass[border=6pt,varwidth]{standalone}
\begin{document}
\ExplSyntaxOn
\def\niii{10}
\def\nxxiv{21}
\use:c { n \int_to_roman:n { 3 } }\\
\use:c { n \int_to_roman:n { 24 } }
\ExplSyntaxOff
\end{document}

相关内容