`\tl_analysis_map_inline:nn` 似乎丢弃了原始标记值(但迭代了正确数量的标记)

`\tl_analysis_map_inline:nn` 似乎丢弃了原始标记值(但迭代了正确数量的标记)

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}

相关内容