使用 xstring IfStrEqCase 和下划线导致问题

使用 xstring IfStrEqCase 和下划线导致问题

我使用xstring(和\IfStrEqCase) 从一组文件路径中进行选择(如下例所示)。我有两个问题:

  1. 即使软件包文档指出允许使用下划线,如果我引入它,宏也不起作用(需要转义\)。(示例案例 1)。

  2. 如果我尝试使用该命令\dothis{0}作为写入的参数,则会出现错误(缺失})。

谁可以帮我这个事?

\documentclass{article}

\usepackage[T1]{fontenc}
\usepackage{xstring}

\newcommand{\dothis}[1]{%
    \IfStrEqCase{#1}{
        {0}{c:/Temp/myfile.txt}
        {1}{c:/Temp\_new/myfile.txt}    %require \ for underscore!!!
        {2}{c:/Temp/my-1file.txt}
        {3}{c:/Temp\_2/my-some-\_file2.txt}
        {4}{me@somewhere}
        }
    [nope]
}



\begin{document}

    % Test each option
    \dothis{0} \newline
    \dothis{1} \newline
    \dothis{2} \newline
    \dothis{3} \newline
    \dothis{4} \newline


\immediate\write18{copy /y c:/Temp/myfile.txt  c:/Temp/newtmp0.temp}

% Command not working:
%\immediate\write18{copy /y \dothis{0}  c:/Temp/newtmp1.temp


\end{document}

答案1

您的评估是基于整数的,从 0 开始。因此,它提供了一个理想的机会来使用可扩展 \ifcase转变:

\documentclass{article}

\newcommand{\dothis}[1]{%
  \ifcase#1 %
        c:/Temp/myfile.txt%             0
    \or c:/Temp\_new/myfile.txt%        1
    \or c:/Temp/my-1file.txt%           2
    \or c:/Temp\_2/my-some-\_file2.txt% 3
    \or me@somewhere%                   4
    \else nope%                         other
  \fi
}

\begin{document}

% Test each option
\dothis{0} \newline
\dothis{1} \newline
\dothis{2} \newline
\dothis{3} \newline
\dothis{4} \newline

\immediate\write17{copy /y c:/Temp/myfile.txt c:/Temp/newtmp0.temp}

\immediate\write17{copy /y \dothis{0} c:/Temp/newtmp1.temp}

\end{document}

日志输出:

复制/yc:/Temp/myfile.txt c:/Temp/newtmp0.temp
复制/yc:/Temp/myfile.txt c:/Temp/newtmp1.temp

我习惯于\write17执行\typeout。但是,因为\write18你不应该逃避_,因此使用

\newcommand{\dothis}[1]{%
  \ifcase#1 %
        c:/Temp/myfile.txt%           0
    \or c:/Temp_new/myfile.txt%       1
    \or c:/Temp/my-1file.txt%         2
    \or c:/Temp_2/my-some-_file2.txt% 3
    \or me@somewhere%                 4
    \else nope%                       other
  \fi
}

等效的 LaTeX3 实现:

\usepackage{xparse}

\ExplSyntaxOn
\DeclareExpandableDocumentCommand{\dothis}{m}{%
  \int_case:nnF { #1 }
  {
    { 0 } { c:/Temp/myfile.txt }
    { 1 } { c:/Temp_new/myfile.txt }
    { 2 } { c:/Temp/my-1file.txt }
    { 3 } { c:/Temp_2/my-some-_file2.txt }
    { 4 } { me@somewhere }
  }
  { nope }
}
\ExplSyntaxOff

既然_下已经受到区别对待\ExplSyntaxOn,就没有必要逃避它。

答案2

  1. 比较的字符串中允许使用下划线。其余的只是普通的 TeX 文本,因此下划线必须进行转义,就像$&#一样。

  2. \IfStrEqCase,与包中的大多数 if 宏一样,不可扩展,因此不能在 中使用\write。因此,您必须重写宏以将结果存储在宏中(可以将其作为第二个参数传递)。然后在写入中使用它。

\newcommand{\dothis}[2]{%
  \IfStrEqCase{#1}{
    {0}{\def#2{c:/Temp/myfile.txt}}
    {1}{\def#2{c:/Temp\_new/myfile.txt}}
    {2}{\def#2{c:/Temp/my-1file.txt}}
    {3}{\def#2{c:/Temp\_2/my-some-\_file2.txt}}
    {4}{\def#2{me@somewhere}}
    }
  [\def#2{nope}]
}

\dothis{0}{\Result}
\immediate\write18{copy /y \Result\space  c:/Temp/newtmp1.temp}

相关内容