使用标记列表常量测试标记列表变量中的项目是否包含特殊字符

使用标记列表常量测试标记列表变量中的项目是否包含特殊字符

我尝试使用提供的常量测试 tokenlist 变量中的各个项目的特殊字符,但interface3 VII.9: Constant token lists失败了。将特殊字符作为参数传递,将其加载到变量中,然后进行比较,效果很好。但至于使用常量获得正确的语法——失败了。我做错了什么?

\documentclass{article}
% RN. 17 November 2018
%=======================
\usepackage[check-declarations,log-functions]{expl3}
\usepackage{xparse}
%-----------------------
\ExplSyntaxOn
\tl_new:N \l_rn_auxOne_tl
\tl_new:N \l_rn_auxTwo_tl

\NewDocumentCommand\myTestTokenlist{mO{\#}}
    {
      \tl_set:Nn \l_rn_auxOne_tl {#1}
      \tl_set:Nn \l_rn_auxTwo_tl {#2}
      \textbf{\#1~argument~received:}~\tl_use:N \l_rn_auxOne_tl\\
      \textbf{\#2~argument~received:}~\tl_use:N \l_rn_auxTwo_tl\\
      Compare~variables:~
      \tl_if_eq:NNTF  \l_rn_auxOne_tl \l_rn_auxTwo_tl
        {\textbf{match}\\}
        {\textbf{NO~match}\\}
      Test~for~\str_use:N \c_hash_str :~
      % Testing for specific special characters using the string constants
      % \c_ampersand_str, \c_atsign_str, \c_backslash_str, etc. returns consistently
      % the FALSE result
      \tl_if_eq:NNTF  \l_rn_auxOne_tl \c_hash_str 
        {\textbf{match}\\}
        {\textbf{NO~match}\\}
    }   %   \myTestTokenlist
\ExplSyntaxOff
%-----------------------
\begin{document}
\verb+\myTestTokenlist{\#}+\\
\myTestTokenlist{\#}

\verb+\myTestTokenlist{\$}[\textbackslash]+\\
\myTestTokenlist{\$}[\textbackslash]

\verb+\myTestTokenlist{\$}[\$]+\\
\myTestTokenlist{\$}[\$]
\end{document}

答案1

如果你从 shell 运行

latexdef \#

答案是

\#:
\char"23

确实latex.ltx定义\#\chardef\#=`\#。因此

\tl_set:Nn \l_rn_auxOne_tl { \# }
\tl_set:Nn \l_rn_auxTwo_tl { \# }
\tl_if_eq:NNTF \l_rn_auxOne_tl \l_rn_auxTwo_tl

显然返回 true,但是

\tl_if_eq:NNTF \l_rn_auxOne_tl \c_hash_str

返回 false。对于\$和,\textbackslash它甚至更加复杂,因为\$扩展为

\x@protect\$\protect\$

\textbackslash

\OMS-cmd \textbackslash \OMS\textbackslash

撇开含义的问题不谈,包含\#和的标记列表\c_hash_str本身就是非常不同的东西。

相关内容