
G1 (SK).tex
다음을 포함하는 파일이 있다고 가정합니다.
\def\SK{SK}
\def\parse"#1 (#2)"{\def\language{#2}}
\expandafter\parse\jobname
\ifx\SK\language equal\else distinct\fi
\bye
실행하면 distinct
값이 인 경우에도 jobname
인쇄 됩니다 "G1 (SK)"
. 내가 사용할 때
\expandafter\parse"G1 (SK)"
예상대로 작동하고 인쇄됩니다 equal
.
이 문제를 어떻게 해결할 수 있나요?
답변1
\jobname
범주 코드 12의 문자를 생성하는 반면, 대체 텍스트에는 \SK
범주 코드 11의 문자가 포함됩니다.
문제에 대처하는 방법에는 여러 가지가 있습니다. pdftex
e-TeX 확장을 지원하는 경우
\edef\SK{\detokenize{SK}}
\def\parse"#1 (#2)"{\def\filelanguage{#2}}
\expandafter\parse\jobname
\ifx\SK\filelanguage equal\else distinct\fi
\bye
다음을 악용할 수도 있습니다 \pdfstrcmp
.
\def\parse"#1 (#2)"{\def\filelanguage{#2}}
\expandafter\parse\jobname
\ifnum\pdfstrcmp{SK}{\filelanguage}=0 equal\else distinct\fi
\bye
\pdfstrcmp
카테고리 코드와 관계없이 문자열 비교를 수행하고 인수에서 매크로를 확장하기 때문입니다 .
어쨌든 TeX 기본 요소이기 \def\language
때문에 을 수행해서는 안 됩니다.\language
.expl3
\input expl3-generic
\ExplSyntaxOn
\str_new:N \l_bak_file_language_str
\str_set_eq:NN \l_bak_file_language_str \c_sys_jobname_str
\regex_replace_once:nnN { .*? \((.*)\) .* } { \1 } \l_bak_file_language_str
% now the string variable contains the string in parentheses
% extracted from the jobname
\cs_new:Npn \checklanguage
{
\str_case:VnF { \l_bak_file_language_str }
{
{SK}{Language~is~SK}
{AB}{Language~is~AB}
{XYZ}{Language~is~XYZ}
}
{Undefined~language}
}
\ExplSyntaxOff
\checklanguage
\bye
그러면 "Language is SK"가 인쇄되지만, 예를 들어 다른 작업 이름을 사용하면 XYZ(X)
"정의되지 않은 언어"가 표시됩니다.
이 명령은 \checklanguage
완전히 확장 가능하므로 \edef
. 각 문자열에 대해 실행할 토큰은 귀하와 귀하가 의도한 애플리케이션에 달려 있습니다. 이름에 공백이 있으면 추가된 따옴표에 신경 쓸 필요가 없습니다. 첫 번째 줄은 괄호(첫 번째 집합) 사이에 있는 내용만 추출하기 때문입니다.
답변2
\jobname
설정된 경우 공백을 제외한 모든 문자에 범주 코드 12를 할당합니다. 다음과 같이 하면 원하는 결과를 얻을 수 있습니다.
{
\catcode`\S=12
\catcode`\K=12
\gdef\sk{SK}
}
\def\parse"#1 (#2)"{\def\language{#2}}
\expandafter\parse\jobname
\ifx\sk\language equal\else distinct\fi
\bye