\if\else\fi 中的 \RequirePackage

\if\else\fi 中的 \RequirePackage

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,则会加载软件包inputencfontenc,这是不鼓励的。

相关内容