![如何在评估之前扩展 \IfEqCase 上的条件?](https://linux22.com/image/390065/%E5%A6%82%E4%BD%95%E5%9C%A8%E8%AF%84%E4%BC%B0%E4%B9%8B%E5%89%8D%E6%89%A9%E5%B1%95%20%5CIfEqCase%20%E4%B8%8A%E7%9A%84%E6%9D%A1%E4%BB%B6%EF%BC%9F.png)
我正在尝试完成一个简单的任务(如下面的 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}
打印结果为: