背景:我正在使用 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
在序言中使用各种策略来定义一些可以在文档正文中使用的东西。
原始条件语法
\makeatletter \@ifpackageloaded{tex4ht} {\let\iftexforht\iftrue} {\let\iftexforht\iffalse} \makeatother
\iftexforht
并像任何原始条件一样使用。LaTeX 伪条件
\makeatletter \@ifpackageloaded{tex4ht} {\let\iftexforhtTF\@firstoftwo} {\let\iftexforhtTF\@secondoftwo} \makeatother
像
\iftexforhtTF{<code for TeX4ht>}{<code when TeX4ht isn't used>}
几乎就像一个原始的条件
\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\iftex4ht
or \newcommand\iftex4ht
,因为4
不是字母。使用\def
它可以工作(没有参数的分隔宏),但你不能将它嵌套在其他\if
s 中,因为 TeX 看不到它是一个\if
。