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