我想提取存储在宏中的一组 n 个字符,如下所示:
\def\foo{bar}
\extract{\foo}{1}
打印:b
使用 expl3。
我有以下代码:
\DeclareExpandableDocumentCommand{\extract}{mm}{%
\tl_item:nn { #1 } { #2 }%
}
它适用于文字字符串:\extract{foo}{2}
打印fo
,但在使用宏时不起作用。更具体地说,存储在 pgfkeys 中的字符串。
最终结果应该是完全扩展的,而不是最有可能给出所需特征的东西(参见:xstring
包装)。
完整 MWE:
\documentclass{article}
\usepackage{xparse}
\usepackage{tikz}
\ExplSyntaxOn
\DeclareExpandableDocumentCommand{\extract}{mm}{%
Extracted: \tl_item:nn { #1 } { #2 }%
}
\ExplSyntaxOff
\begin{document}
\extract{foo}{2} % output: fo as expected
\def\foo{bar}
\extract{\foo}{2} % output: nothing
\pgfkeys{/foo/.is family,
/foo/.unknown/.style = %
{\pgfkeyscurrentpath/\pgfkeyscurrentname/%
.initial = #1}}
\pgfkeys{/foo/bar = some text here}
\pgfkeysvalueof{/foo/bar}
\extract{\pgfkeysvalueof{/foo/bar}}{2} % output: /foo/bar
\end{document}
答案1
\ExplSyntaxOn
\cs_generate_variant:Nn \tl_item:nn { f }
\DeclareExpandableDocumentCommand \extract { m m }
{
Extracted: ~ \tl_item:fn { #1 } { #2 }
}
\ExplSyntaxOff