我尝试使用提供的常量测试 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
本身就是非常不同的东西。