我使用 `\tl_case:Nn ...` 做错了什么?

我使用 `\tl_case:Nn ...` 做错了什么?

当使用文档命令参数进行大小写区分时,我经常使用函数\str_case:nn,从命令的输出可以看出,该函数运行良好\myStrCase。当尝试使用该\tl_case:Nn函数时,通过将参数加载到_tl类型变量中,事情就变得非常糟糕。变量似乎加载了正确的值,并且就函数而言被标记为正确\tl_case:Nn,但相应的代码并未执行。为什么?

\documentclass{article}
%=======================
\usepackage[check-declarations,log-functions]{expl3}
\usepackage{xparse}
%-----------------------
\ExplSyntaxOn
\tl_new:N \l_rn_Aux_tl
\NewDocumentCommand\myStrCase{O{emph}m}
  {
    \str_case:nnTF {#1}
      {
        {emph}{\textit{#2}}
        {Emph}{\textbf{\textit{#2}}}
        {uline}{\underline{#2}}
      }
      {}
      {!~ERROR:~parameter~\#1~=~#1~invalid}
  }  %  \myStrCase
\NewDocumentCommand\myTlCase{O{emph}m}
  {
    \tl_set:Nx \l_rn_Aux_tl {#1}
checking~what~was~passed:~\l_rn_Aux_tl \\
    \tl_case:NnTF \l_rn_Aux_tl
      {
        emph {\textit{#2}}
        Emph {\textbf{\textit{#2}}}
        uline {\underline{#2}}
      }
      {parameter~\#1~=~#1~valid}
      {!~ERROR:~parameter~\#1~=~#1~invalid}
  }  %  \myTlCase
\ExplSyntaxOff
%-----------------------
\begin{document}
\subsection{using str\_case:}
  \myStrCase{Hi There}\\
  \myStrCase[emph]{Hi There}\\
  \myStrCase[Emph]{Hi There}\\
  \myStrCase[uline]{Hi There}\\
  \myStrCase[xxx]{Hi There}
\subsection{using tl\_case:}
  \myTlCase[emph]{Hi There}\\
  \myTlCase[xxx]{Hi There}
\end{document}

答案1

文档(interface3)已经包含您的答案:

\tl_case:NnTF <test token list variable>
{
<token list variable case1> {<code case1>}
<token list variable case2> {<code case2>}
...
<token list variable casen> {<code casen>}
}
{<true code>}
{<false code>}

您将在其中找到“标记列表变量”而不是“标记列表”。因此,要求您提供一个标记(变量/N 类型参数)。因此,要使用此构造,您需要将选项保存到变量中并在 中使用这些选项\tl_case

相关内容