我有一个包含类似 的 LaTeX3 字符串Hello \macro
,我想将其扩展为另一个字符串,这样如果\macro
定义为Alice
,则结果应该是Hello Alice
。我尝试使用 rescan 和 的混合来实现:x
,但它会删除空格。你知道我做错了什么吗?是因为 LaTeX3 的评估忽略了空格吗?如果是这样,我可以使用 LaTeX2 标准以某种方式对其进行评估吗?
\documentclass{article}
\begin{document}
\ExplSyntaxOn
\NewDocumentCommand{\defMyString}{m}{
\str_set:Nn \l_mystr_str {#1}
}
\ExplSyntaxOff
\defMyString{Hello \macro}
\def\macro{Alice}
\ExplSyntaxOn
\tl_set_rescan:Nnx \l_new_tl {} {\l_mystr_str}
\str_set:Nx \l_new_str {\l_new_tl }
\l_new_str
\ExplSyntaxOff
\end{document}
答案1
您可以使用第一个参数\tl_set_rescan:nn
,它就是为此目的而考虑的。
\documentclass{article}
\begin{document}
\ExplSyntaxOn
\NewDocumentCommand{\defMyString}{m}{
\str_set:Nn \l_mystr_str {#1}
}
\ExplSyntaxOff
\defMyString{Hello \macro}
\def\macro{Alice}
\ExplSyntaxOn
\tl_set_rescan:Nnx \l_new_tl { \char_set_catcode_space:N \ } {\l_mystr_str}
\str_set:Nx \l_new_str {\l_new_tl }
\l_new_str
\ExplSyntaxOff
\end{document}
对你的应用程序来说更好的做法应该是选择合适的 catcode 表:
\documentclass{article}
\begin{document}
\ExplSyntaxOn
\NewDocumentCommand{\defMyString}{m}{
\str_set:Nn \l_mystr_str {#1}
}
\ExplSyntaxOff
\defMyString{Hello \macro}
\def\macro{Alice}
\ExplSyntaxOn
\tl_set_rescan:Nnx \l_new_tl { \cctab_select:N \c_document_cctab } {\l_mystr_str}
\str_set:Nx \l_new_str {\l_new_tl }
\l_new_str
\ExplSyntaxOff
\end{document}
答案2
感谢 Phelype 的评论,我需要将重新扫描放在段外调用的命令中\ExplSyntax…
:
\documentclass{article}
\begin{document}
\ExplSyntaxOn
\NewDocumentCommand{\defMyString}{m}{
\str_set:Nn \l_mystr_str {#1}
}
\ExplSyntaxOff
\defMyString{Hello \macro}
\def\macro{Alice}
\ExplSyntaxOn
\NewDocumentCommand{\test}{}{
\tl_set_rescan:Nnx \l_new_tl {} {\l_mystr_str}
\str_set:Nx \l_new_str {\l_new_tl }
}
\ExplSyntaxOff
\test
\ExplSyntaxOn
\l_new_str
\ExplSyntaxOff
\end{document}