\jobname의 이상한 행동

\jobname의 이상한 행동

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의 문자가 포함됩니다.

문제에 대처하는 방법에는 여러 가지가 있습니다. pdftexe-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

관련 정보