首先,我想对于有经验的人来说,这将是一个非常简单的答案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
不会计算空格,而当标记列表第一次转换为字符串时会计算空格。