如何在评估之前扩展 \IfEqCase 上的条件?

如何在评估之前扩展 \IfEqCase 上的条件?

我正在尝试完成一个简单的任务(如下面的 MWE 所示)。当给定文本(文件名)时,它会输出给定的颜色。

要按我的预期工作,\IfEqCase应该只评估文件扩展名,如注释行所示。不幸的是,\IfEqCase当我尝试添加其他命令作为参数时,它似乎中断了。

你能帮忙吗?

此致

\documentclass{article}

% General settings
\usepackage[utf8]{inputenc}     % Input encoding
\usepackage[T1]{fontenc}        % Output encoding
\usepackage{xstring}
\usepackage{xparse}


\newcommand{\selColor}[1]{%
        \IfEqCase{#1}{%
%       \IfEqCase{\StrGobbleLeft{#1}{\StrPosition{#1}{.}}}{%
        {Snip00.tex}{black}%
        {Snip00.doc}{red}%
%       {tex}{black}%
%       {doc}{red}% 
    }[\PackageError{colorErr}{Undefined color option: #1}{}]%
}

\begin{document}

    Start document here 

    \selColor{Snip00.tex}
    \selColor{Snip00.doc}

    End the document

\end{document}

答案1

这些xstring命令不可扩展,因此无法轻松地将它们作为参数传递给其他命令。相反,该包允许您使用尾随可选参数来保存宏的结果:

\documentclass{article}
\usepackage{xstring}

\newcommand{\selColor}[1]{%
  \StrPosition{#1}{.}[\tempa]%
  \StrGobbleLeft{#1}{\tempa}[\tempb]%
  \IfEqCase{\tempb}{%
    {tex}{black}%
    {doc}{red}% 
  }[\PackageError{colorErr}{Undefined color option: #1}{}]%
}

\begin{document}

Start document here

\selColor{Snip00.tex}
\selColor{Snip00.doc}

End the document

\end{document}

这将打印:

在此处输入图片描述

没有错误信息。


另一种方法expl3不需要在中间步骤中保存命令:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand\selColor{m}
  { \__acombo_sel_color:n {#1} }
\cs_new:Npn \__acombo_sel_color:n #1
  {
    \str_case:fnF { \__acombo_extension:n {#1} }
      {
        { tex } { black }
        { doc } { red }
      }
      { \PackageError{colorErr}{Undefined~color~option:~#1}{} }
  }
\cs_generate_variant:Nn \str_case:nnF { f }
\cs_new:Npn \__acombo_extension:n #1
  { \__acombo_extension:w #1 \q_stop }
\cs_new:Npn \__acombo_extension:w #1 . #2 \q_stop {#2}
\ExplSyntaxOff

\begin{document}

Start document here

\selColor{Snip00.tex}
\selColor{Snip00.doc}

End the document

\end{document}

这里我使用了一个命令\__acombo_extension:n,它将排除第一个之前的所有内容.,然后将其传递给\str_case:fnF它将尝试将其与您提供的每个扩展名进行匹配。如果找不到匹配项,则会引发错误。


对于这两种方法(xstring和),当的参数中有多个或没有expl3时,行为是未定义的。这是一个版本:..\SelColor

  • 如果没有点,则使用的字符串是整个参数(IE: \selColor{tex}是相同的\selColor{Snip00.tex});

  • 如果有多个点,则使用的扩展名是从最后一个点开始的扩展名(IE: \selColor{Snip00.hello.doc}是相同的\selColor{Snip00.doc});

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand\selColor{m}
  { \__acombo_sel_color:n {#1} }
\cs_new:Npn \__acombo_sel_color:n #1
  {
    \str_case:fnF { \__acombo_extension:n {#1} }
      {
        { tex } { black }
        { doc } { red }
      }
      { \PackageError{colorErr}{Undefined~color~option:~#1}{} }
  }
\cs_generate_variant:Nn \str_case:nnF { f }
\cs_new:Npn \__acombo_extension:n #1
  { \__acombo_extension:w #1 . \q_stop }
\cs_new:Npn \__acombo_extension:w #1 . #2 \q_stop
{
  \tl_if_empty:nTF {#2}
    {#1}
    { \__acombo_extension:w #2 \q_stop }
}
\ExplSyntaxOff

\begin{document}
\pagestyle{empty}

Start document here

\selColor{Snip00.tex}
\selColor{Snip00.doc}
\selColor{tex}
\selColor{Snip00.hello.doc}

End the document

\end{document}

打印结果为:

在此处输入图片描述

相关内容