我正在尝试编写一些代码来替换标记列表中的几个占位符标记,但由于我对 latex3 还很陌生,所以遇到了障碍。
目前,我没有得到任何结果,也没有错误,所以我怀疑我应该使用除标记列表之外的其他东西作为占位符标记......
\documentclass{article}
\begin{document}
\ExplSyntaxOn
% placeholder tokens
\tl_new:N \VALUE
\tl_new:N \SYMBOL
\cs_set:Npn \test:nnnn #1#2#3#4
{
\tl_clear:N #4
\tl_set_eq:NN #4 #1
\tl_replace_all:Nnn #4 { \VALUE } { #2 }
\tl_replace_all:Nnn #4 { \SYMBOL } { #3 }
}
\tl_new:N \l_result_tl
\test:nnnn { \VALUE ~ \SYMBOL } { 300 } { EUR } \l_result_tl
result ~ should ~ be ~ "300 ~ EUR": ~ \tl_use:N \l_result_tl
\ExplSyntaxOff
\end{document}
答案1
您正在定义\test:nnnn
,因此\test
未定义。
另一方面,\test
最好用 来定义\NewDocumentCommand
,因为它是用户级命令,并且它调用的内部函数应该受到保护,因为它进行赋值。
你也想要\tl_set:Nn #4 { #1 }
。
并且一切都应在序言中完成。不要滥用\cs_set(_protected)
。
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\test}{mmmm}
{
\meide_test:nnnn { #1 } { #2 } { #3 } { #4 }
}
% placeholder tokens
\tl_new:N \VALUE
\tl_new:N \SYMBOL
% a suitable user level token list
\tl_new:N \RESULT
\cs_new_protected:Npn \meide_test:nnnn #1#2#3#4
{
\tl_set:Nn #4 { #1 }
\tl_replace_all:Nnn #4 { \VALUE } { #2 }
\tl_replace_all:Nnn #4 { \SYMBOL } { #3 }
}
\ExplSyntaxOff
\begin{document}
\test{\VALUE\ \SYMBOL}{300}{EUR}\RESULT
result should be "300 EUR": \RESULT
\end{document}
\tl_set_eq:NN #4 #1
在所呈现的用例中,您的尝试会产生
\tl_set_eq:NN \tl_result_tl \VALUE ~ \SYMBOL
当然,在最终输出中你什么也得不到,因为\VALUE
是空的,所以替换根本不会发生;空格实际上并不存在,因为它跟随(在 的参数中\test:nnnn
)它跟随一个控制序列名称;最后\SYMBOL
什么也不产生,因为它是空的。