조건부 포함을 위해 pdfTeX 또는 Knuth's TeX에서 실행 중인지 감지

조건부 포함을 위해 pdfTeX 또는 Knuth's TeX에서 실행 중인지 감지

pdfTeX누군가 실행 중인지 Knuth에서 실행 중인지 감지하는 방법을 아는 사람이 있습니까 TeX? 를 사용하여 문서를 작성할 때 조건부로 추가 기능을 포함할 수 있기를 원 pdfTex하지만 TeX대체 기능으로 원본도 지원하고 싶습니다.

다음과 같은 것

\ifdefined\pdfpagewidth
\pdfpagewidth 8.5 true in
\pdfpageheight 11 true in
\fi

작업이 완료될 것입니다. 그러나 위의 내용은 e-TeX확장에 의존하며 Knuth를 기반으로 구축되지 않습니다 TeX.

감사해요

답변1

이 같은?

가 정의되지 않은 경우 \csname foo\endcsname로 확장 되므로 명령 순서를 와 비교하는 데 사용할 수 있습니다 . 이것은 전혀 필요하지 않습니다 .\relax\foo\ifx....\relaxe-TeX

\newif\ifknuthtex
\expandafter\ifx\csname pdfpagewidth\endcsname\relax
\knuthtextrue
\else
\pdfpagewidth 8.5 true in
\pdfpageheight 11 true in
\fi

This is \ifknuthtex Knuth's \TeX\else pdfTeX\fi
\bye

컴파일하면 tex아래 이미지가 제공됩니다.

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

답변2

당신은 사용할 수 있습니다iftex"패키지". 문서에 따르면

Plain TeX 및 LaTeX 모두를 위한 이 매우 간단한 패키지는 PDFTeX, XeTeX 또는 LuaTeX가 조판에 사용되는지 테스트하기 위해 , 및 부울을 \ifPDFTeX정의 \ifXeTeX합니다 .\ifLuaTeX

답변3

Knuth TeX와 (또는 LuaTeX)만 구별하려는 경우 pdftex다음을 수행합니다.

\begingroup\escapechar=-1
\edef\undefined{\string\undefined}%
\edef\test{\meaning\pdftexversion}%
\expandafter\endgroup\expandafter\let\expandafter\ifknuthtex
\csname if\ifx\undefined\test true\else false\fi\endcsname

\ifknuthtex
  \message{Knuth TeX}
\else
  \message{Not Knuth TeX}
\fi

한 가지 가정은 다음과 같습니다. 이전 매크로 파일이나 로드된 형식이 \pdftexversion. \ifknuthtexXeTeX에서도 올바른 진리값을 반환 하려면 다음을 로드할 수 있습니다 ifxetex.

\input ifxetex.sty
\begingroup\escapechar=-1
\edef\undefined{\string\undefined}%
\edef\test{\meaning\pdftexversion}%
\expandafter\endgroup\expandafter\let\expandafter\ifknuthtex
\csname if%
  \ifnum 0=%
    \ifx\undefined\test 0\else 1\fi
    \ifxetex 1\fi
    true\else false\fi
\endcsname

\ifknuthtex
  \message{Knuth TeX}
\else
  \message{Not Knuth TeX}
\fi

답변4

귀하의 문제에 대해 나는 다음과 같은 점을 강하게 의심합니다.

\ifx\pdfpagewidth\undefined
\else
  \pdfpagewidth 8.5 true in
  \pdfpageheight 11 true in
\fi

모든 의도와 목적에 있어서 충분히 괜찮습니다. 합병증이 필요하지 않습니다.

접근 방식 을 기반으로 한 솔루션은 \csname..\endcsname실제로는 다음과 같은 단점이 있습니다.만들다\relax제어 시퀀스가 ​​사전에 존재하지 않은 경우 의미가 있는 제어 시퀀스입니다 . 그래서 사람들은 \expandafter이 의미가 잠시 동안만 존재했다가 테스트 후에 사라지도록 하기 위해 '를 여러 개 사용하여 트릭을 수행합니다 \ifx. 그러나 TeX 메모리 \pdfpagewidth에는 소스 코드를 작성한다는 간단한 사실(주석 처리되지 않은 경우) 과 마찬가지로 잠깐 존재하는 제어 시퀀스에 대해서도 새 항목이 있습니다 .

\csname..\endcsname불행하게도 일부 코드가 언급된 예방 조치 없이 접근 방식을 수행하자마자 \ifx\pdfpagewidth\undefined위의 간단한 테스트는 제대로 작동하지 않게 됩니다. 그리고 이것이 사람들이 그것을 추천하기를 꺼리는 주된 이유라고 생각합니다. LaTeX가 바로 이 문제를 일으킨다는 것을 알아야 합니다 \@ifundefined. 그러나 최신 설치에서는 실행 파일이 바이너리(특히 확장 기능이 활성화된 상태) latex를 사용하므로 이는 Knuth TeX가 아닙니다. 더 오래된 설치에서는 당연히 Knuth TeX + LaTeX 형식을 사용할 수 있습니다.pdftexe-TeX

또한 때로는 IDE가 사물을 표시하는 방식에 따라 Knuth TeX를 실행하고 있다고 생각할 수도 있지만 tex실제로는 pdftex dvi 출력 모드에 있을 수도 있습니다.

\ifx\pdfpagewidth\undefined는 에 의미를 부여한 일부 이전 코드에 의해 손상될 수도 있지만 이는 \undefined매우 비난받을 만한 일입니다.

관련 정보