我有一些代码可以将一些宏转换为字符串来编写,但不幸的是,当输入字符 # 时,它会变成 ##。我尝试使用 catcodes,但似乎没有效果:
以下代码显示:
Hey \notexistingbutnoproblem ##
代替
Hey \notexistingbutnoproblem #
梅威瑟:
\documentclass[]{article}
\begin{document}
\ExplSyntaxOn
\NewDocumentCommand{\defineString}{m}{
\char_set_catcode_letter:N \#
\str_set:Nn \l_test_str {#1}
% My failed other try:
% \tl_set_rescan:Nnn \l_test_str {\char_set_catcode_letter:N \#}{#1}
% \tl_to_str:n \l_test_str
w}
\NewDocumentCommand{\showString}{}{
\show\l_test_str
}
\ExplSyntaxOff
\defineString{Hey \notexistingbutnoproblem #}
\showString
\end{document}
答案1
你的\char_set_catcode_letter:N
命令并没有起到什么作用;事实上它确实有害,因为从第一次使用你的\defineString
命令开始,#
就会变成类别代码 11(尊重分组)。
您想将双重哈希值替换为单个哈希值。
\documentclass{article}
\begin{document}
\ExplSyntaxOn
\cs_generate_variant:Nn \str_replace_all:Nnn { Nnx }
\NewDocumentCommand{\defineString}{m}
{
\str_set:Nn \l_test_str {#1}
\str_replace_all:Nnx \l_test_str { ## } { \c_hash_str }
}
\NewDocumentCommand{\showString}{}{
\str_show:N \l_test_str
}
\ExplSyntaxOff
\defineString{Hey \notexistingbutnoproblem #}
\showString
\end{document}
你得到
> \l_test_str=Hey \notexistingbutnoproblem #.
答案2
感谢@user202729 的评论,我想出了这个更“强大”(我希望?)的定义:
\cs_set:Nn \str_set_hash_robust:Nn {
\tl_set:Nn \l_test_str { #2 }
\regex_replace_all:nnN { \cP\# } { \cO\# } \l_test_str
\tl_to_str:N {#1}
}
\documentclass[]{article}
\usepackage{tikz}
\begin{document}
\ExplSyntaxOn
%% See also https://tex.stackexchange.com/questions/695432/latex3-latex-doubles-the-number-of-hashes-when-storing-them-in-string/695460#695460
\cs_set:Nn \str_set_hash_robust:Nn {
\tl_set:Nn \l_test_str { #2 }
\regex_replace_all:nnN { \cP\# } { \cO\# } \l_test_str
\tl_to_str:N {#1}
}
\NewDocumentCommand{\defineString}{m}{
\str_set_hash_robust:Nn \l_test_str {#1}
% \char_set_catcode_letter:N \#
% \str_set:Nn \l_test_str {#1}
% My failed other try:
% \tl_set_rescan:Nnn \l_test_str {\char_set_catcode_letter:N \#}{#1}
% \tl_to_str:n \l_test_str
}
\NewDocumentCommand{\showString}{}{
\show \l_test_str
}
\ExplSyntaxOff
\defineString{Hey \notexistingbutnoproblem #}
\showString
\pgfkeys{
test/.style={
/utils/exec={% Goal 2: can I avoid escaping the # here?
\defineString{Foo \notexistingbutnoproblem ##}
\showString
}
},
test
}
\end{document}