이 언어 테스트는 왜 실패하나요?

이 언어 테스트는 왜 실패하나요?

내 문제는 다음 코드입니다.

\documentclass{article}
\usepackage[english]{babel}
\begin{document}
\def\suplang{english}
\ifx\languagename\suplang
    Supported language: \languagename
\else 
    Not supported language: \languagename
\fi
\end{document}

결과는 "지원되는 언어: 영어" 대신 "지원되지 않는 언어: 영어"입니다. 내가 뭘 잘못한 걸까요?

답변1

구현상의 이유로 대체 텍스트의 \languagename첫 번째 문자는 범주 코드 12입니다. 관한 한 \ifx,

e11 n11 g11 l11 i11 s11 h11

그리고

e12 n11 g11 l11 i11 s11 h11

~이다다른. 실제로 그렇게 하면

\documentclass{article}
\usepackage[english]{babel}
\begin{document}
\edef\suplang{\string english}
\ifx\languagename\suplang
    Supported language: \languagename
\else
    Not supported language: \languagename
\fi
\end{document}

그러면 출력은 다음과 같습니다

여기에 이미지 설명을 입력하세요

꼭 그 사업을 해야 하나요? 아니요, 물론 그렇지 않습니다.

\usepackage{pdftexcmds} % to work with all engines
\makeatletter
\newcommand{\supported}[3]{%
  \ifnum\pdf@strcmp{\languagename}{#1}=\z@
     \expandafter\@firstoftwo
  \else
     \expandafter\@secondoftwo
  \fi
  {#2}{#3}%
}
\makeatother

그 다음에

\supported{suplang}
  {Supported language: \languagename}
  {Not supported language: \languagename}

작동합니다.

\documentclass{article}
\usepackage[english]{babel}
\usepackage{pdftexcmds} % to work with all engines
\makeatletter
\newcommand{\supported}[3]{%
  \ifnum\pdf@strcmp{\languagename}{#1}=\z@
     \expandafter\@firstoftwo
  \else
     \expandafter\@secondoftwo
  \fi
  {#2}{#3}%
}
\makeatother

\def\suplang{english}

\begin{document}

\supported{\suplang}
  {Supported language: \languagename}
  {Not supported language: \languagename}

\end{document}

참 및 거짓 분기에 대한 \else대체 정의 :\fi

\documentclass{article}
\usepackage[english]{babel}
\usepackage{pdftexcmds} % to work with all engines
\makeatletter
\newcommand{\issupported}[1]{%
  TT\fi\ifnum\pdf@strcmp{\languagename}{#1}=\z@
}
\makeatother

\def\suplang{english}

\begin{document}

\if\issupported\suplang
  Supported language: \languagename
\else
  Not supported language: \languagename
\fi

\end{document}

답변2

그만큼답변of egreg는 이미 질문에 있는 예제의 예상치 못한 결과에 대한 이유를 설명하고 문제를 해결하기 위한 몇 가지 방법도 보여줍니다.

패키지는 iflang비교의 내부 항목을 \languagename간단한 매크로로 래핑합니다 \IfLanguageName. 질문의 예는 다음과 같습니다.

\documentclass{article}
\usepackage[english]{babel}
\usepackage{iflang}
\begin{document}
\IfLanguageName{english}{%
    Supported language: \languagename
}{%
    Not supported language: \languagename
}
\end{document}

결과

관련 정보