\str_case:nnF 未找到匹配项

\str_case:nnF 未找到匹配项

我使用 expl3 编写了一个命令,如果可选参数指定为 * 或 **,则该命令的行为会有所不同。该命令适用于数学环境,并且应该根据第一个参数使用直立下划线呈现第二个参数。我发现此命令的行为存在三个问题:

  1. * 和 ** 无法识别
  2. 显示多余的连字符 (-)
  3. 显示多余的引号(“)

\documentclass{article}
\usepackage{mathtools}
\usepackage{xparse}

\ExplSyntaxOn

% Render underscored with some variation of strict
\NewDocumentCommand{\strict}{O{strict} m}
  {
    \str_if_eq:eeTF {\str_item:nn {#1} {-1}} {-}
      {
        \show_strict:nn {{#1}strict} {#2}
      }
      {
        \show_strict:nn {#1} {#2}
      }
  }

\cs_new_protected:Npn \show_strict:nn #1 #2
  {
   \msg_term:n {show_strict \ P1 \ = \ #1}
   \msg_term:n {show_strict \ P2 \ = \ #2}
    \str_set:Nn \l_tmpa_str {#1}
    \str_set:Nn \l_tmpb_str {#2}
    \msg_term:n {\l_tmpa_str =  \l_tmpa_str}
    \str_case:nnF {\l_tmpa_str}
      {
        {
          {*}
          {  \underset {\mathrm{(semi-strict,strict)}} {#2} }
        }
        {
          {**}
          { \underset {\mathrm{semi-strict (strict)}} {#2} }
        }
      }
      {
        \underset {\mathrm{\l_tmpa_str}} {\l_tmpb_str}
      }
  }

\ExplSyntaxOff

\begin{document}

\begin{enumerate}
\item Test $\strict{{default}}$ \\*
      expect underset with upright "strict" 
\item Test $\strict[semi-]{{hyphen}}$
      expect underset with upright "semi-strict"
\item Test $\strict[*]{{star}}$
      expect underset with upright "(semi-strict,strict)"
\item Test $\strict[**]{{starstar}}$
      expect underset with upright "semi-strict (strict)"
\end{enumerate}
\foo

\end{document}

答案1

你的语法是\str_case:nnF错误的;第一个参数是要查找匹配的字符串;第二个参数应该是这样的形式

{<string-a>}{<code>}
{<string-b>}{<code>}
...

并且您还佩戴了错误的附加牙套。

\documentclass{article}
\usepackage{mathtools}
\usepackage{xparse}

\ExplSyntaxOn

% Render underscored with some variation of strict
\NewDocumentCommand{\strict}{O{strict} m}
  {
    \str_if_eq:eeTF {\str_item:nn {#1} {-1}} {-}
      {
        \show_strict:nn {{#1}strict} {#2}
      }
      {
        \show_strict:nn {#1} {#2}
      }
  }

\cs_new_protected:Npn \show_strict:nn #1 #2
  {
   \iow_term:n {show_strict ~ P1 ~ = ~ #1}
   \iow_term:n {show_strict ~ P2 ~ = ~ #2}
    \str_case:nnF {#1}
      {
       {*}  { \underset {\textup{(semi-strict,~strict)}} {#2} }
       {**} { \underset {\textup{semi-strict~(strict)}} {#2} }
      }
      {
        \underset {\textup{#1}} {#2}
      }
  }

\ExplSyntaxOff

\begin{document}

\begin{enumerate}
\item Test $\strict{{default}}$ \\*
      expect underset with upright "strict" 
\item Test $\strict[semi-]{{hyphen}}$
      expect underset with upright "semi-strict"
\item Test $\strict[*]{{star}}$
      expect underset with upright "(semi-strict,strict)"
\item Test $\strict[**]{{starstar}}$
      expect underset with upright "semi-strict (strict)"
\end{enumerate}

\end{document}

在此处输入图片描述

而不是\mathrm您应该使用\textup(否则连字符将是减号并且空格将被忽略)。

这是控制台输出:

*************************************************
* show_strict P1 = strict
*************************************************
*************************************************
* show_strict P2 = {default}
*************************************************
*************************************************
* show_strict P1 = {semi-}strict
*************************************************
*************************************************
* show_strict P2 = {hyphen}
*************************************************
*************************************************
* show_strict P1 = *
*************************************************
*************************************************
* show_strict P2 = {star}
*************************************************
*************************************************
* show_strict P1 = **
*************************************************
*************************************************
* show_strict P2 = {starstar}
*************************************************

答案2

当你这样做

\str_set:Nn \l_tmpa_str {#1}
\str_set:Nn \l_tmpb_str {#2}

您正在将变量设置为 TeX 字符串,从而删除标记的含义。特别是,{}不再是“特殊”的,而是以您看到的“随机”引号/连字符的形式出现。在您的示例中,根本没有理由存储这些,但如果您这样做,请使用tl

第二个问题是

\str_case:nnF {\l_tmpa_str}

比较确切地文本\l_tmpa_str与每个案例。它们永远不会匹配,所以你得到了分支F。你想看看文本本身,最简单的方法是

\str_case:nnF {#2}

或者如果你真的或许想储存它

\cs_generate_variant:Nn \str_case:nnF { V }

...

\str_case:VnF \l_tmpb_str

访问价值变量。同样,我怀疑你在这里想要一个标记列表测试,而不是字符串测试:

\tl_set:Nn \l_tmpb_tl {#2}
\tl_case:NnF \l_tmpb_tl

尽管如前所述,我认为没有必要存储输入。

相关内容