LaTeX3 如何在标记列表/字符串中使用预定义命令的内容/值?

LaTeX3 如何在标记列表/字符串中使用预定义命令的内容/值?

首先,我想对于有经验的人来说,这将是一个非常简单的答案expl3。但对我来说,这是新的,我非常愿意学习这些东西以更好地理解 Latex3。所以我希望在这里得到一些专业的帮助。

我想要实现的目标如下:

首先是一个用户定义的命令,内容是一个简单的句子。假设\NewDocumentCommand{\testcommand}{}{A Test Sentence for expl3}

现在我想存储内容命令的标记列表或字符串。这样就可以打印/使用或计数。后者是必需的,因为我想在 if 条件中使用字符数,该条件根据总计数激活不同的命令。

我的 MWE 如下所示:

\documentclass[%
]{article}
\usepackage[T1]{fontenc}

\NewDocumentCommand{\testcommand}{}{A Test Sentence for expl3}

\ExplSyntaxOn
\tl_new:N \test_tl

\tl_set:Nn \test_tl {\testcommand}

\NewDocumentCommand{\showteststring}{}{
    \tl_use:N \test_tl \par
    \tl_count:N \test_tl
}

\NewDocumentCommand{\countteststring}{}{
    \tl_to_str:N \test_tl \par
    \str_count:N \test_tl
}
\ExplSyntaxOff

\begin{document}

    \showteststring
    
    \countteststring
    
\end{document}

\showteststring\testcommand正确使用打印出 的内容\tl_use:N,但\tl_count:N只算一个标记;当然这个标记就是\testcommand

for 也是一样\countteststring。它只将命令序列转换\testcommand为字符串,并计算命令序列本身的 13 个字符。

所以我需要\testcommand先扩展。但我到目前为止的尝试都没有取得任何成功。例如,我尝试过:

\tl_set:Nx \test_tl {\testcommand}(和X) 而不是\tl_set:Nn \test_tl {\testcommand}。它可以编译成功,但输出仍然相同。

我也尝试了一些变体\exp_args:N,但没有让它工作,因为我不完全理解将它放在哪里以及在expl3语法中使用哪个参数说明符。

我也想过/参数说明符,但无法使其工作。

我调查了接口3doc。但信息太多了,到目前为止我还没能找到正确的命令。此外,我搜索了 Tex.SE 并阅读了子月乡;也非常有用,但不是我正在寻找的具体解决方案(或者,当然,我可能忽略了一些东西)。

因此,我已经提前感谢任何帮助或提示!如果能得到解释,我也会非常感激,这样下次我就能更好地理解!

答案1

您已将其声明\testcommand为文档命令:这些命令受到保护,不会被扩展。这意味着\tl_set:Nx \l_test_tl { \testcommand }结果不会改变。我会将其声明\testcommand为可扩展命令并使用V-type 扩展:

\newcommand*\testcommand{A Test Sentence for expl3}
\tl_set:NV \l_test_tl \testcommand

ETC。

答案2

\NewDocumentCommand功能旨在提供比旧版更强大的参数解析功能\newcommand。它根本不适合定义“文本容器”。

如果您想要文本容器,请为它们定义一个基础结构。

\documentclass{article}

\ExplSyntaxOn

\NewDocumentCommand{\definecontainer}{mm}
 {
  \tl_clear_new:c { g_lukeflo_cont_#1_tl }
  \tl_gset:cn { g_lukeflo_cont_#1_tl } { #2 }
 }

\NewExpandableDocumentCommand{\usecontainer}{m}
 {
  \tl_use:c { g_lukeflo_cont_#1_tl }
 }

\NewExpandableDocumentCommand{\countcontainer}{sm}
 {
  \IfBooleanTF { #1 }
   {% count as string
    \str_count:e { \tl_to_str:v { g_lukeflo_cont_#2_tl } }
   }
   {% count as tl
    \tl_count:c { g_lukeflo_cont_#2_tl }
   }
 }

\ExplSyntaxOff

\definecontainer{test}{A Test Sentence for expl3}
\definecontainer{test2}{abc}

\begin{document}

`\usecontainer{test}' has \countcontainer{test} items

`\usecontainer{test}' has \countcontainer*{test} tokens

`\usecontainer{test2}' has \countcontainer{test2} items

`\usecontainer{test2}' has \countcontainer*{test2} tokens

\end{document}

在此处输入图片描述

请注意,\tl_count:N不会计算空格,而当标记列表第一次转换为字符串时会计算空格。

相关内容