我正在尝试使用一些嵌套if
语句来判断文件是否存在以及可能进行哪种类型的加载:
\IfFileExists{./emoji.sty}{
\ifxetex
\usepackage[bw,font=seguiemj.ttf]{emoji}
\usepackage{fontspec}
\else
\usepackage{ifluatex}
\ifluatex
\usepackage[bw,font=Symbola_hint.ttf]{emoji}
\usepackage{fontspec}
\else
\usepackage[bw]{emoji}
\fi
\fi
\newcommand{\doxygenemoji}[3]{
\IfFileExists{bw/#3.png}{
\emoji{#3}
}{
#1
}
}
}{
\renewcommand{\doxygenemoji}[3]{ #1 }
}
但不幸的是我收到了错误信息:
! Extra \else.
\IfFileExists ...ileonpath {#1}{#2}{#3}}\fi \else
\closein \@inputcheck \ede...
l.60 }
其中第 60 行是最后一个右括号 ( }
)。
(还不是真正的 MWE,但希望我已经可以得到一些提示)。
答案1
您需要将参数字符加倍,因为\IfFileExists
会抓取 true 和 false 分支作为参数。此外,它显然不喜欢条件\ifluatex
。您可以使用iftex
的条件:
\usepackage{iftex}
\IfFileExists{./emoji.sty}{
\ifXeTeX
\usepackage[bw,font=seguiemj.ttf]{emoji}
\usepackage{fontspec}
\else
\ifLuaTeX
\usepackage[bw,font=Symbola_hint.ttf]{emoji}
\usepackage{fontspec}
\else
\usepackage[bw]{emoji}
\fi
\fi
\newcommand{\doxygenemoji}[3]{
\IfFileExists{bw/##3.png}{
\emoji{##3}
}{
##1
}
}
}{
\newcommand{\doxygenemoji}[3]{ ##1 }
}
或者,为了避免参数字符加倍并获得额外的稳健性,您可以使用expl3
条件:
\usepackage{expl3}
\ExplSyntaxOn
\file_if_exist:nTF { ./emoji.sty }
{
\sys_if_engine_xetex:T
{
\usepackage[bw,font=seguiemj.ttf]{emoji}
\usepackage{fontspec}
}
\sys_if_engine_luatex:T
{
\usepackage[bw,font=Symbola_hint.ttf]{emoji}
\usepackage{fontspec}
}
\sys_if_engine_pdftex:T
{
\usepackage[bw]{emoji}
}
\cs_new:Npn \doxygenemoji #1 #2 #3
{
\file_if_exist:nTF { bw/#3.png }
{
\emoji { #3 }
}{
#1
}
}
}
{
\cs_new:Npn \doxygenemoji #1 #2 #3
{ ##1 }
}
\ExplSyntaxOff
答案2
您的代码中有两个错误。第一个错误是ifluatex
在条件语句内加载;如果代码被跳过(因为引擎是 XeLaTeX),\ifluatex
则不会是条件语句,而是一个未定义的标记,从而导致条件不平衡。
第二个错误是#
定义中没有加倍。
我会以不同的方式重新组织代码,避免在真假分支中使用复杂的代码\IfFileExists
。
\usepackage{ifluatex,ifxetex}
\newif\ifemoji
\IfFileExists{./emoji.sty}{\emojitrue}{\emojifalse}
\ifemoji
\ifxetex
\usepackage{fontspec}
\PassOptionsToPackage{font=seguiemj.ttf}{emoji}
\fi
\ifluatex
\usepackage{fontspec}
\PassOptionsToPackage{font=Symbola_hint.ttf}{emoji}
\fi
\usepackage[bw]{emoji}
\newcommand{\doxygenemoji}[3]{%
\IfFileExists{bw/#3.png}{%
\emoji{#3}%
}{%
#1%
}%
}
\else
\newcommand{\doxygenemoji}[3]{#1}
\fi