我希望\crefname
用动态字符串来分配。使用\exp_args_generate:n { xVV }
,我最终得到了如下结果:
\exp_args:NxVV \crefname {\__my_countername: }
{\csname my@cref@\__my_countername:\csname\languagename ABBR\endcsname @name\endcsname}
{\csname my@cref@\__my_countername:\csname\languagename ABBR\endcsname @name@plural\endcsname}
这里\__my_countername:
是计数器的名称,例如theorem
。是从字符串到 的\csname\languagename ABBR\endcsname
转换。english
EN
但是,这会将参数扩展得太深,以至于字符串不再根据上下文动态变化。为了清楚起见,我希望将参数扩展为:
\crefname {theorem }
{\csname my@cref@theorem\csname\languagename ABBR\endcsname @name\endcsname}
{\csname my@cref@theorem\csname\languagename ABBR\endcsname @name@plural\endcsname}
也就是说,\__my_countername:
在保持\csname\languagename ABBR\endcsname
原样的情况下进行扩展,因为它应该从上下文中接收\languagename
。这可能吗?
我尝试使用\noexpand
,但可能使用不当,导致出现没有警告文本的错误。
(请原谅我将 expl3 和 LaTeX2e 代码混杂在一起,我对 expl3 不太熟悉,如果使用一点 LaTeX2e 代码来完成某些任务会容易得多)
答案1
评论太长了:
如果您想要扩展\__my_countername:
并且保持其他所有内容不扩展,那么您可以x
在所有参数中使用扩展,并保持其他标记不被扩展\exp_not:N
:
\exp_args:Nxxx \crefname { \__my_countername: }
{ \exp_not:N \use:c { my@cref@ \__my_countername: \exp_not:N \use:c { \exp_not:N \languagename ABBR } @name } }
{ \exp_not:N \use:c { my@cref@ \__my_countername: \exp_not:N \use:c { \exp_not:N \languagename ABBR } @name@plural } }
(我\csname ... \endcsname
用更多的expl3
-y替换\use:c { ... }
)。
上面的代码只会扩展这三个\__my_countername:
(听起来好像名字不对)。但这是做三次相同的工作,所以你可以定义一个辅助宏并\__my_countername:
只扩展一次,这样代码会快一点,而且很多更容易理解:
\cs_new_protected:Npn \__my_crefname_aux:n #1
{
% In this macro, #1 is \__my_countername: expanded
\crefname {#1}
{ \use:c { my@cref@#1 \use:c { \languagename ABBR } @name } }
{ \use:c { my@cref@#1 \use:c { \languagename ABBR } @name@plural } }
}
% then use it as:
\exp_args:Nx \__my_crefname_aux:n { \__my_countername: }