我使用xstring
(和\IfStrEqCase
) 从一组文件路径中进行选择(如下例所示)。我有两个问题:
即使软件包文档指出允许使用下划线,如果我引入它,宏也不起作用(需要转义
\
)。(示例案例 1)。如果我尝试使用该命令
\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
比较的字符串中允许使用下划线。其余的只是普通的 TeX 文本,因此下划线必须进行转义,就像
$
、&
等#
一样。\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}