使用 \str_case:nnF 对多个匹配项进行分组

使用 \str_case:nnF 对多个匹配项进行分组

考虑以下:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\demo}{m}{
\str_case:nnF{#1}
{
    {a} {Run case 1\\ % Actually super long code
    }
    {b} {Run case 1\\ % Actually super long code
    }

}
{
    % False code
 }
}
\ExplSyntaxOff

\begin{document}
    \demo{a}
    \demo{b}
\end{document}

有什么方法可以定义“ b”案例而不必复制所有“实际上超长的代码”?

答案1

使用提供非常长代码的函数。建议\New(Expandable)DocumentCommand仅用于解析参数,然后将控制权传递给函数。

当您拥有作为其他代码一部分的长代码时,最好制作辅助函数。

\documentclass{article}

\ExplSyntaxOn

\NewDocumentCommand{\demo}{m}
 {
  \clement_code_cases:n { #1 }
 }

\cs_new:Nn \clement_code_cases:n
 {
  \str_case:nnF{#1}
   {
    {a} { \__clement_code_superlong: }
    {b} { \__clement_code_superlong: }
    {c} { Simpler~code }
   }
   {
    False~code
   }
 }

\cs_new:Nn \__clement_code_superlong: { Some~very~long~code }

\ExplSyntaxOff

\begin{document}

\demo{a}

\demo{b}

\demo{c}

\demo{d}

\end{document}

在此处输入图片描述

\cs_new_protected:(...)当代码包含不可扩展的功能时记得使用。

答案2

更改ba测试之前

\documentclass{article}


\ExplSyntaxOn
\cs_generate_variant:Nn\str_case:nnF{e}
\NewDocumentCommand{\demo}{m}{
\str_case:enF{
  \str_case:enF{#1}{
    {b}{a}
  }
  {#1}
}
{
    {a} {Run case 1\par % Actually super long code
    }

}
{
    % False code
 }
}
\ExplSyntaxOff

\begin{document}
    \demo{a}
    \demo{b}
\end{document}

答案3

\regex_match_case:nnF您可以尝试正则表达式,如以下示例所示(请注意,和之间两个前参数的顺序不同\str_case:nnF):

\documentclass{article}

\ExplSyntaxOn
\NewDocumentCommand{\demo}{m}{
    \regex_match_case:nnF{
        {\A[ab]\Z} {Run case 1\\ % Actually super long code
        }
    }{#1}{
        % false code
    }
}
\ExplSyntaxOff

\begin{document}
    \demo{a}
    \demo{b}
\end{document}

答案4

我发现的最简单的解决方案是使用另一个参数再次调用该宏,如下所示:

\documentclass{article}

\ExplSyntaxOn
\NewDocumentCommand{\demo}{m}{
    \str_case:nnF{#1}
    {
        {a} {Run case 1\\ % Actually super long code
        }
        {b} {
            \demo{a}
        }
        
    }
    {
        % False code
    }
}
\ExplSyntaxOff

\begin{document}
    \demo{a}
    \demo{b}
\end{document}

它可能仅限于我的特定用例,但它运行良好。

相关内容