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 ('letter') 이 있으므로 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. }
  }

관련 정보