Я пытаюсь проанализировать расширение файла по указанному пользователем пути в 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. }
}