替换标记列表中的占位符标记

替换标记列表中的占位符标记

我正在尝试编写一些代码来替换标记列表中的几个占位符标记,但由于我对 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什么也不产生,因为它是空的。

相关内容