使用 \ifx 的宏存在问题

使用 \ifx 的宏存在问题

[编辑1] 原标题“无法理解为什么这个简单的宏会导致复杂的错误”

[原帖] 我写了一本书,现在正尝试使用 tex4ht 制作电子书。改编这个帖子,我引入了以下宏:

\newcommand{\gpifpdf}[2]{\ifx\HCode\UnDef{#1}\else{#2}\fi}

在生成 pdf 文件时应返回第一个参数,在使用 mk4ht 生成 html 文件时应返回第二个参数。

以下是我的名字:

\documentclass[10pt]{book}
\usepackage{hyperref}
\newcommand{\gpifpdf}[2]{\ifx\HCode\UnDef{#1}\else{#2}\fi}
\gpifpdf{
  \usepackage{fontspec}
}{
  \hypersetup{tex4ht}
}
\begin{document}
\gpifpdf{this is pdf text}{this is HTML text}
\end{document}

mk4ht 生成一个 html 文件,显示“这是 HTML 文本”。但是使用 Latexian 生成 pdf 会产生以下错误:

Undefined control sequence.
\clist_if_empty:NF #1->\if_meaning:w 
                                 #1\c_empty_tl \prg_return_true: \else: \prg_return_false: \fi: \c_zero {}
l.9 \begin{document}

但是,当我注释掉 时\usepackage{fontspec},它运行正常,生成一个显示“这是 pdf 文本”的 pdf,因此宏似乎在文档主体中正常工作。当我保留\usepackage{fontspec},并注释掉前一行和后三行(第 4、6、7 和 8 行)时,它也能正常生成 pdf。

换句话说:宏似乎运行正常,当我手动执行宏应该执行的操作时,一切都正常,但是当我尝试让宏执行该操作时,却不行。

我刚刚从 2013 升级到 MacTeX 2014(也就是 TeXlive 2014),问题仍然存在。我正在使用 Latexian,带有 XeTeX 选项。

答案1

语法不是

\ifx<firsttoken><secondtoken>{<true code>}\else{<false code>}\fi

正确的是

\ifx<firsttoken><secondtoken><true code>\else<false code>\fi

{#1}因此,您可以删除和周围的括号(在充当组分隔符{#2}的情况下)。\usepackage{fontspec}

相关内容