Probleme beim Parsen des Dateinamens in expl3

Probleme beim Parsen des Dateinamens in expl3

Ich versuche, die Dateierweiterung eines vom Benutzer angegebenen Pfads in expl3 zu analysieren. Ich habe die Dateierweiterung, kann sie aber nicht mit der erwarteten Dateierweiterung vergleichen. Mein MWE ist

\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}

das erzeugt

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

während ich erwartete

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

Soweit ich weiß, schlägt der Vergleich \tl_if_eqfehl. Warum?

Antwort1

Wie dokumentiert, \file_parse_full_name:nNNNwerden die „retur“-Werte als Zeichenfolgen und nicht als Tokenlisten bereitgestellt. Das heißt, alle Zeichen haben den Kategoriecode 12 („andere“), Leerzeichen den Kategoriecode 10 („Leerzeichen“). Der tlVergleich prüft Token, daher sind hier Kategoriecodes wichtig. Ihr Literal „ .abc“ hat den Kategoriecode 11 („Buchstabe“) abc, daher schlägt der Test fehl.

Meistens und sicherlich hier sind Sie wahrscheinlich besser dran, wenn Sie die stringbasierten Tests zur Überprüfung von „Text“ verwenden. Diese prüfen nur Zeichencodes, sodass wir uns nicht um die Kategoriecodes kümmern müssen.

\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. }
  }

verwandte Informationen