iftex
为什么必须在结构外部加载包\if...\else\fi
?
ifpdf
(对于包、ifluatex
、 也同样如此ifxetex
。)
考虑:
\documentclass{myclass}\begin{document}\end{document}
这有效:
即当\RequirePackage{iftex}
在\ifodt\else\fi
\NeedsTeXFormat{LaTeX2e}[1996/06/01]
\ProvidesClass{myclass}[2013/12/15 v0.1 My Class]
\LoadClass{article}
\newif\ifodt\odttrue
\RequirePackage{iftex}
\ifodt
\RequirePackage[utf8]{inputenc}
\RequirePackage[T1] {fontenc}
\else
\ifLuaTeX\RequirePackage{fontspec}\fi
\ifXeTeX \RequirePackage{fontspec}\fi
\ifPDFTeX \RequirePackage[utf8]{inputenc}
\RequirePackage[T1] {fontenc}\fi
\fi
但不是这个:
即当\RequirePackage{iftex}
在\ifodt\else\fi
\NeedsTeXFormat{LaTeX2e}[1996/06/01]
\ProvidesClass{myclass}[2013/12/15 v0.1 My Class]
\LoadClass{article}
\newif\ifodt\odttrue
\ifodt
\RequirePackage[utf8]{inputenc}
\RequirePackage[T1] {fontenc}
\else
\RequirePackage{iftex}
\ifLuaTeX\RequirePackage{fontspec}\fi
\ifXeTeX \RequirePackage{fontspec}\fi
\ifPDFTeX \RequirePackage[utf8]{inputenc}
\RequirePackage[T1] {fontenc}\fi
\fi
错误:
! Undefined control sequence.
l.12 \ifXeTeX
\RequirePackage{fontspec}\fi
?
答案1
在你的\else
分支中你有
\else
\RequirePackage{iftex}
\ifLuaTeX\RequirePackage{fontspec}\fi
\ifXeTeX \RequirePackage{fontspec}\fi
现在\ifXeTeX
是一个未定义的命令,这是可以的,因为它被跳过,但\fi
因此\fi
终止外 \ifodt
然后就会出错。永远不要在 TeX 基元中定义条件,\if..
因为这种情况总是会发生:-)
答案2
您必须在iftex
包已加载时(以及如果)延迟条件。
\NeedsTeXFormat{LaTeX2e}[1996/06/01]
\ProvidesClass{myclass}[2013/12/15 v0.1 My Class]
\newif\ifodt
\DeclareOption{odt}{\odttrue}
\ProcessOptions\relax
\LoadClass{article}
\ifodt
\RequirePackage[utf8]{inputenc}
\RequirePackage[T1] {fontenc}
\expandafter\@gobble
\else
\RequirePackage{iftex}
\expandafter\@firstofone
\fi
{\ifLuaTeX
\RequirePackage{fontspec}
\fi
\ifXeTeX
\RequirePackage{fontspec}
\fi
\ifPDFTeX
\RequirePackage[utf8]{inputenc}
\RequirePackage[T1]{fontenc}
\fi}
当\ifodt
为真时,括号内的部分将被吞噬,而当为假时,则对其进行评估;由于iftex
已经加载,因此将定义条件并与相应的进行匹配\fi
。
然而,应该有更好的控制,因为当
\documentclass[odt]{myclass}
发现并使用了 LuaLaTeX 或 XeLaTeX,则会加载软件包inputenc
和fontenc
,这是不鼓励的。