嵌套 if 语句的问题

嵌套 if 语句的问题

我正在尝试使用一些嵌套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 

相关内容