我正在使用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
两个问题:
您使用了三个条件,但只有两个结束
\fi
符。条件语句的使用应按照传统方式进行:
\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(当然,也有pTeX
或upTeX
,但那是针对日语的,不包括在 中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
您可以加载ifxetex
并ifluatex
:
\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>}%
}
任何一对都不是强制性的。如果在文档正文中使用该命令,请记住保护行尾。