latex3:\tl_case 无法正确检测 token 的值

latex3:\tl_case 无法正确检测 token 的值

我正在创建一个具有不同内部函数的包,这些函数可以在包初始化期间使用提供的令牌进行设置。包内部的所有内容均使用 latex3 语法编写。

我在使用类似“switch-case”的命令(特别是使用 \tl_case:NnTF)评估标记时偶然发现了一个问题。调用我的命令 \checkStyle 时,我无法让它以正确的大小写输入,文档中的输出应该是 A、B 或 C。

我怀疑这是非常简单的事情,但是我对 latex3 的了解很少,无法找到来源。我在下面提供了一个最小的工作示例。

希望您能帮上忙。提前致谢。

排版.sty

\NeedsTeXFormat{LaTeX2e}[1994/06/01]
\ProvidesPackage{typeset}[2021/12/16 Typesetting Package]

% ------------------------  Load required packages
\RequirePackage{l3keys2e}

% ----------Trial
\ExplSyntaxOn

% Definition of the package options
\keys_define:nn { typeset }
{ 
% Create token list with opts
opt .tl_set:N = \l_typeset_opt_tl ,
deg .tl_set:N = \l_typeset_deg_tl ,
opt .initial:n = altern ,
deg .initial:n = other ,
}
\ExplSyntaxOff

% Process package options
\ExplSyntaxOn
\ProcessKeysOptions{ typeset }
\ExplSyntaxOff

% Create test case
\ExplSyntaxOn
\newcommand{ \test }
{
Content:~ \l_typeset_opt_tl ,  ~is~type~ \checkStyle{ \l_typeset_opt_tl }
\\
Content:~ \l_typeset_deg_tl , ~is~type~ \checkStyle{ \l_typeset_deg_tl } 
}
\ExplSyntaxOff 
 
 
% Token list switch-case 
\ExplSyntaxOn
\tl_new:N \l_mytoken_tl
\tl_const:Nn \c__altern_tl { altern }
\tl_const:Nn \c__nomin_tl { nomin }
\tl_const:Nn \c__other_tl { other }

\cs_new_protected:Npn \checkStyle #1 
{
    \tl_set:Nn \l_mytoken_tl { #1 }
    \tl_case:NnTF \l_mytoken_tl 
{
    \c__altern_tl {A}
    \c__nomin_tl {B}
    \c__other_tl {C}
}
  {}
  {None} 
  \\
  Input~to ~checkstyle~was: {#1}  
}
\ExplSyntaxOff

\endinput

主文本

\documentclass{article}
\usepackage[opt=nomin]{typeset}

\begin{document}
\test
\end{document}

输出:

在此处输入图片描述

答案1

你的问题是一个扩展问题。当你调用\checkStyle{\l_typeset_opt_tl}这个时会创建一个如下的 token 列表:

\tl_set:Nn \l_mytoken_tl { \l_typeset_opt_tl }

这会与包含 或类似内容的内容进行比较altern,这显然是不一样的。相反,您应该在转发之前扩展您的令牌列表。但总而言之,我认为对于您的用例,您不应该使用\tl_case:Nnbut \str_case:nn

此外,你的包使用了相当混乱的命名风格。在expl3-syntax中全部您的变量、常量和宏应该遵循的命名约定expl3,即不要使用\l_mytoken_tl而是使用\l_typeset_mytoken_tl或类似的名称(始终包含模块名称)。

我将使用以下代码来处理您的包:

\NeedsTeXFormat{LaTeX2e}
\ProvidesExplPackage{typeset}{2021/12/16}{0.0}{Typesetting Package}

% ------------------------  Load required packages
\RequirePackage{l3keys2e}

% ----------Trial

% Definition of the package options
\keys_define:nn { typeset }
  {
    % Create string with opts
    opt .str_set:N = \l__typeset_opt_str ,
    deg .str_set:N = \l__typeset_deg_str ,
    opt .initial:n = altern ,
    deg .initial:n = other ,
  }

% Process package options
\ProcessKeysOptions{ typeset }

% Create test case
\NewDocumentCommand \test {}
  {
    Content:~ \str_use:N \l__typeset_opt_str ,  ~is~type~
      \typeset_check_style:V \l__typeset_opt_str
    \\
    Content:~ \str_use:N \l__typeset_deg_str , ~is~type~
      \typeset_check_style:V \l__typeset_deg_str 
  }
\cs_new_protected:Npn \typeset_check_style:n #1
  {
    \str_case:nnF {#1}
      {
        { altern } {A}
        { nomin  } {B}
        { other  } {C}
      }
      {None}
    \\
    Input~to ~checkstyle~was: #1
  }
\cs_generate_variant:Nn \typeset_check_style:n { V }

\endinput

答案2

你想测试内容变量,而不是变量。

typeset.sty

\NeedsTeXFormat{LaTeX2e}[1994/06/01]
\ProvidesPackage{typeset}[2021/12/16 Typesetting Package]

% ------------------------  Load required packages
\RequirePackage{l3keys2e}

% ----------Trial
\ExplSyntaxOn

% Definition of the package options
\keys_define:nn { typeset }
 {
  % Create token list with opts
  opt .tl_set:N = \l_typeset_opt_tl ,
  deg .tl_set:N = \l_typeset_deg_tl ,
  opt .initial:n = altern ,
  deg .initial:n = other ,
}
\ExplSyntaxOff

% Process package options
\ExplSyntaxOn
\ProcessKeysOptions{ typeset }
\ExplSyntaxOff

% Create test case
\ExplSyntaxOn
\newcommand{ \test }
  {
    Content:~ \l_typeset_opt_tl ,  ~is~type~ \typeset_checkstyle:V \l_typeset_opt_tl
    \\
    Content:~ \l_typeset_deg_tl , ~is~type~ \typeset_checkstyle:V \l_typeset_deg_tl
  }
\ExplSyntaxOff 
 
 
% Token list switch-case 
\ExplSyntaxOn
\tl_new:N \l_mytoken_tl
\tl_const:Nn \c__altern_tl { altern }
\tl_const:Nn \c__nomin_tl { nomin }
\tl_const:Nn \c__other_tl { other }

\cs_new_protected:Npn \typeset_checkstyle:n #1 
  {
    \tl_set:Nn \l_mytoken_tl { #1 }
    \tl_case:NnF \l_mytoken_tl 
      {
        \c__altern_tl {A}
        \c__nomin_tl {B}
        \c__other_tl {C}
      }
      {None} 
  \\
  Input~to ~checkstyle~was: {#1}  
}
\cs_generate_variant:Nn \typeset_checkstyle:n { V }
\ExplSyntaxOff

\endinput

`测试.tex

\documentclass{article}
\usepackage[opt=nomin]{typeset}

\begin{document}
\test
\end{document}

输出

在此处输入图片描述

相关内容