使用 iftex 包时出现神秘错误消息

使用 iftex 包时出现神秘错误消息

我正在使用iftex包来检测我正在使用的 TeX 引擎。在以下示例 (MWE) 中,我使用的是 pdfTeX 引擎:

\documentclass[norsk]{beamer}
\usepackage{iftex}
%\RequireLuaTeX  
\ifXeTeX
   { % XeLaTeX
    \usepackage{polyglossia}
    \setmainlanguage[]{norsk}
    \usepackage{fontspec}
    \usepackage[]{unicode-math} 
    }
\else \ifPDFTeX   {
    % default: pdfLaTeX
    \usepackage{babel}
    \usepackage[T1]{fontenc}
    %\usepackage{lmodern}
    %\usepackage[adobe-utopia]{mathdesign}
    \usepackage[utf8]{inputenc}
    %\usepackage[babel=true]{microtype}
    }
\else  \ifLuaTeX   {
    %LuaLaTeX
    \usepackage{babel}
    \usepackage{fontspec}
    \usepackage[]{unicode-math}  
    }  
   \fi
\fi  

\usetheme{Warsaw}

\begin{document}
  Some text $34$.
\end{document}

这会产生以下神秘的错误:

错误:未定义控制序列

--- TeX 说 --- --- 帮助 --- 没有可用的帮助

(但生成了 PDF)我已经尝试了上述许多变体!

答案1

两个问题:

  1. 您使用了三个条件,但只有两个结束\fi符。

  2. 条件语句的使用应按照传统方式进行:

    \if..
      <true>
    \else
      <false>
    \fi
    

    <true>请注意,and/or子句没有分组<false>。这是您遇到的主要问题,因为定义会在该组内进行本地化(并且不会保留),从而导致控制序列未定义。

以下是具有更新条件的最小示例:

\documentclass[norsk]{beamer}
\usepackage{iftex}
%\RequireLuaTeX  
\ifXeTeX
  % XeLaTeX
  \usepackage{polyglossia}
  \setmainlanguage[]{norsk}
  \usepackage{fontspec}
  \usepackage[]{unicode-math} 
\else \ifPDFTeX   
  % default: pdfLaTeX
  \usepackage{babel}
  \usepackage[T1]{fontenc}
  %\usepackage{lmodern}
  %\usepackage[adobe-utopia]{mathdesign}
  \usepackage[utf8]{inputenc}
  %\usepackage[babel=true]{microtype}
\else \ifLuaTeX
  %LuaLaTeX
  \usepackage{babel}
  \usepackage{fontspec}
  \usepackage[]{unicode-math}  
\fi\fi\fi

\usetheme{Warsaw}

\begin{document}
  Some text $34$.
\end{document}

答案2

语法错误:你可能习惯使用 C 或类似的东西。TeX 条件语句的格式总是

\if<name><test>
  <true text>
\else
  <false text>
\fi

这两种情况都没有用括号括起来。其实,可以使用括号,但是它们会将其中的标记分组,这通常是不想要的。一般来说,在括号内加载包是错误的。

您可以通过观察来简化您的输入,如果您既不使用 XeTeX 也不使用 LuaTeX,那么您将使用 PDFTeX(当然,也有pTeXupTeX,但那是针对日语的,不包括在 中iftex)。

还要注意,制作一个可以在所有三个引擎下运行的文档只是一个梦想,但对于简单的文档,你大概可以实现。

\documentclass[norsk]{beamer}
\usepackage{iftex}

\ifXeTeX
  \usepackage{polyglossia}
  \setmainlanguage[]{norsk}
  \usepackage{fontspec}
  \usepackage[]{unicode-math} 
\else
  \ifLuaTeX
    \usepackage{babel}
    \usepackage{fontspec}
    \usepackage[]{unicode-math}  
  \else
    % only pdftex remains
    \usepackage{babel}
    \usepackage[utf8]{inputenc}
    \usepackage[T1]{fontenc}
    %\usepackage{lmodern}
    %\usepackage[adobe-utopia]{mathdesign}
    %\usepackage[babel=true]{microtype}
  \fi
\fi

相反,iftex您可以加载ifxetexifluatex

\documentclass[norsk]{beamer}
\usepackage{ifxetex,ifluatex}

\ifxetex
  \usepackage{polyglossia}
  \setmainlanguage[]{norsk}
  \usepackage{fontspec}
  \usepackage[]{unicode-math} 
\else
  \ifluatex
    \usepackage{babel}
    \usepackage{fontspec}
    \usepackage[]{unicode-math}  
  \else
    % only pdftex remains
    \usepackage{babel}
    \usepackage[utf8]{inputenc}
    \usepackage[T1]{fontenc}
    %\usepackage{lmodern}
    %\usepackage[adobe-utopia]{mathdesign}
    %\usepackage[babel=true]{microtype}
  \fi
\fi

当在最后的部分(相对于pdftex)时,您还可以使用\ifpdf(由包提供ifpdf)来做一些特殊的事情,以防latex使用。

一个不同的实现expl3

\documentclass[norsk]{beamer}

\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\enginecode}{m}
 {
  \tl_gset:Nn \g_kjetil_engine_tl { pdftex }
  \xetex_if_engine:T { \tl_gset:Nn \g_kjetil_engine_tl { xetex } }
  \luatex_if_engine:T { \tl_gset:Nn \g_kjetil_engine_tl { luatex } }
  \str_case:Vn \g_kjetil_engine_tl { #1 }
 }
\cs_generate_variant:Nn \str_case:nn { Vn }
\ExplSyntaxOff

\enginecode{
 {xetex}{
   \usepackage{polyglossia}
   \setmainlanguage[]{norsk}
   \usepackage{fontspec}
   \usepackage[]{unicode-math}
 }
 {luatex}{
    \usepackage{babel}
    \usepackage{fontspec}
    \usepackage[]{unicode-math}
 }
 {pdftex}{
    \usepackage{babel}
    \usepackage[utf8]{inputenc}
    \usepackage[T1]{fontenc}
    %\usepackage{lmodern}
    %\usepackage[adobe-utopia]{mathdesign}
    %\usepackage[babel=true]{microtype}
 }
}

语法(也许可以改进)是

\enginecode{%
  {xetex}{<code if the engine is XeTeX>}%
  {luatex}{<code if the engine is LuaTeX>}%
  {pdftex}{<code if the engine is pdfTeX>}%
}

任何一对都不是强制性的。如果在文档正文中使用该命令,请记住保护行尾。

相关内容