字符串扩展:删除空格

字符串扩展:删除空格

我有一个包含类似 的 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}

相关内容