解析 expl3 中的文件名时出现问题

解析 expl3 中的文件名时出现问题

我正在尝试解析 expl3 中用户指定路径的文件扩展名。我已获得文件扩展名,但无法将其与预期的文件扩展名进行比较。我的 MWE 是

\documentclass[]{article}
\usepackage{expl3}
\usepackage{xparse}

\ExplSyntaxOn
\ior_new:N \g_slo_input_stream_ior
\tl_new:N \l_slo_input_dir_tl
\tl_new:N \l_slo_input_base_tl
\tl_new:N \l_slo_input_ext_tl
\cs_generate_variant:Nn \tl_if_eq:nnTF { V }

\cs_new:Nn \slo_open_file:n {
    \file_parse_full_name:nNNN { #1 } \l_slo_input_dir_tl \l_slo_input_base_tl \l_slo_input_ext_tl

    \tl_if_eq:VnTF \l_slo_input_ext_tl { .abc } { 
        #1~is~.abc-file.
    } { 
        #1~is~\l_slo_input_ext_tl-file,~expected~.abc-file.
    }
}
\NewDocumentCommand { \abcfile } { m } { \slo_open_file:n { #1 } }
\ExplSyntaxOff

\begin{document}
    \abcfile{example.test} \par
    \abcfile{filename.abc}
\end{document}

产生

example.test is .test-file, expected .abc-file.
filename.abc is .abc-file, expected .abc-file.

我原本以为

example.test is .test-file, expected .abc-file.
filename.abc is .abc-file

据我了解,比较\tl_if_eq失败。为什么?

答案1

如上所述,\file_parse_full_name:nNNN将“retur”值作为字符串提供,而不是标记列表。也就是说,所有字符的类别代码均为 12(“其他”),空格的类别代码为 10(“空格”)。比较tl会检查标记,因此此处类别代码很重要。您的文字“ .abc”的类别代码为 11(“字母”)abc,因此测试失败。

大多数情况下,当然在这里,您最好使用基于字符串的测试来检查“文本”。这只查看字符代码,因此我们不必担心类别代码业务。

\cs_new_protected:Npn \slo_open_file:n #1
  {
    \file_parse_full_name:nNNN {#1}
      \l__slo_input_dir_tl
      \l__slo_input_base_tl
      \l__slo_input_ext_tl
    \str_if_eq:VnTF \l__slo_input_ext_tl { .abc }
      { #1 ~is~.abc~file. }
      { #1~is~\l__slo_input_ext_tl-file,~expected~.abc-file. }
  }

相关内容