LaTeX3:在将哈希值存储在字符串中时,LaTeX 将哈希值的数量加倍

LaTeX3:在将哈希值存储在字符串中时,LaTeX 将哈希值的数量加倍

我有一些代码可以将一些宏转换为字符串来编写,但不幸的是,当输入字符 # 时,它会变成 ##。我尝试使用 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}

相关内容