从https://mirror.mwt.me/ctan/macros/latex/contrib/l3kernel/interface3.pdf:
\tl_analysis_map_inline:nn {⟨token list⟩} {⟨inline function⟩}
Applies the ⟨inline function⟩ to each individual ⟨token⟩ in the ⟨token list⟩. The ⟨inline function⟩ receives three arguments as explained above.
这 3 个参数是<token>
、<char code>
、<catcode>
。
当使用时\tl_analysis_map_inline:nn
,它似乎迭代了正确的次数(第一个参数中的输入标记数),但它们的标记值似乎没有正确转发到inline function
:
\documentclass[11pt]{article}
\usepackage{fancyvrb}
\ExplSyntaxOn
\NewDocumentCommand{\myprependWithX}{mO{}O{}}
{
X#1
}
\ExplSyntaxOff
\begin{document}
\myprependWithX{a} % Expect Xa (and get it)
\myprependWithX{a}{}{} % Expect Xa (and get it)
\ExplSyntaxOn
\tl_analysis_map_inline:nn{ x y z }{ \myprependWithX } % Expect XxXyXz (but get XXX)
\ExplSyntaxOff
\end{document}
我们为何不离开XxXyXz
这里\tl_analysis_map_inline:nn
?
答案1
expl3
您误解了“内联函数”。名称中包含的函数inline
期望您在最后一个参数中提供代码,就像对 所做的那样。因此,您需要使用、和\cs_set:Nn
等参数访问值(在 的情况下)。#1
#2
#3
\tl_analysis_map_inline:nn
另外,您对用 定义的可选参数的理解O
是错误的,它们期望的是 中的参数[]
,而不是 中的可选参数{}
。为了表明它们没有按照您的期望执行,我将替换文本更改为,X#3#2#1
因此您会发现您的用法不起作用。
\documentclass[11pt]{article}
\usepackage{fancyvrb}
\ExplSyntaxOn
\NewDocumentCommand{\myprependWithX}{mO{}O{}}
{
X#3#2#1
}
\ExplSyntaxOff
\begin{document}
\myprependWithX{a}{b}{c} % wrong usage
\myprependWithX{a}[b][c] % right usage
\ExplSyntaxOn
\tl_analysis_map_inline:nn{ x y z }{ X#1 } ~ % Expect XxXyXz
\tl_analysis_map_inline:nn { x y z } { \myprependWithX{#1} }
\ExplSyntaxOff
\end{document}