是否有 \iftex4ht 命令,如果没有,应该如何定义?

是否有 \iftex4ht 命令,如果没有,应该如何定义?

背景:我正在使用 TikZ 生成大量图片,希望以 SVG 格式发布到网络上。因此,我正在使用pgfsys-tex4ht.def驱动程序,它运行良好。我的直觉是,TikZ/pgf 的 SVG 输出是“实验性的”,因此在设计图片时,我没有使用特殊驱动程序,而是通过 pdflatex 生成 PDF。此外,我最终想要 PDF 和 SVG。

因此,不必注释掉该行

\def\pgfsysdriver{pgfsys-tex4ht.def}

每次,我都宁愿有一个开关,如果tex4ht已加载,则加载它;也就是说,我已经当我决定是否运行时指定输出pdflatex-htlatex我不想必须指定两次。所以,我的问题是:

是否有\iftex4ht类似于\ifpdf提供的ifpdf.sty
如果没有,那么测试 存在的“正确”方法是什么tex4ht

答案1

总是有这样的:

\@ifpackageloaded{tex4ht}{LOADED}{NOT LOADED}

当然,也适用于其他感兴趣的软件包。(关于@字符的常见警告适用。)

答案2

定义一个条件命名\iftex4ht是不可能没有副作用的。然而直接使用\@ifpackageloaded{tex4ht}却有很大的限制,因为它只允许在序言中使用。

有几种策略可以解决这个问题:\@ifpackageloaded在序言中使用各种策略来定义一些可以在文档正文中使用的东西。

  1. 原始条件语法

    \makeatletter
    \@ifpackageloaded{tex4ht}
      {\let\iftexforht\iftrue}
      {\let\iftexforht\iffalse}
    \makeatother
    

    \iftexforht并像任何原始条件一样使用。

  2. LaTeX 伪条件

    \makeatletter
    \@ifpackageloaded{tex4ht}
      {\let\iftexforhtTF\@firstoftwo}
      {\let\iftexforhtTF\@secondoftwo}
    \makeatother
    

    \iftexforhtTF{<code for TeX4ht>}{<code when TeX4ht isn't used>}
    
  3. 几乎就像一个原始的条件

    \makeatletter
    \edef\texforht{TT\noexpand\fi
      \@ifpackageloaded{tex4ht}
        {\noexpand\iftrue}
        {\noexpand\iffalse}}
    \makeatother
    

    用作

    \if\texforht
      <code for TeX4ht>
    \else
      <code when TeX4ht isn't used>
    \fi
    

选择哪一种方法取决于个人喜好。第一种方法和第三种方法都允许条件嵌套。


提示在 \if...\else..\fi 中使用 \localtableofcontents 时出现额外的 \fi 错误,使用 LaTeX 条件样式还有另一个原因(上面列表中的案例 2)。

在序言中使用时,如下结构

\iftexforht
  <code for TeX4ht case>
\else
  <code for non TeX4ht case>
\fi

通常很好也很实用。但是,如果在文档正文中使用,则可能会出现问题。例如,如果您有

\iftexforht\else\localtableofcontents\fi

\localtableofcontents就像在链接的问题中一样,由于 how 的定义,这将不起作用并抛出一个神秘的错误消息。相反,

\iftexforhtTF{}{\localtableofcontents}

就可以正常工作。

\iftexforhtTF可以用上面的代码来定义,也可以用 Nasser 的想法来定义,

\makeatletter
\ifdefined\HCode
   \let\iftexforhtTF\@firstoftwo
\else
   \let\iftexforhtTF\@secondoftwo
\fi
\makeatother

感谢 karlkoeller 发现链接问题中的问题。

答案3

根据 Harald 的回答,您可以定义\iftex4ht如下。

\documentclass{article}
%\usepackage{tex4ht}
\makeatletter
\@ifpackageloaded{tex4ht}{\def\iftex4ht{\iftrue}}
                         {\def\iftex4ht{\iffalse}}
\makeatother

\begin{document}
\iftex4ht TeX4ht\else no!\fi
\end{document}

好吧,这个答案有点像个笑话,但我想指出的是,你不能使用\newif\iftex4htor \newcommand\iftex4ht,因为4不是字母。使用\def它可以工作(没有参数的分隔宏),但你不能将它嵌套在其他\ifs 中,因为 TeX 看不到它是一个\if

相关内容