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_eq
fehl. Warum?
Antwort1
Wie dokumentiert, \file_parse_full_name:nNNN
werden 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 tl
Vergleich 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. }
}