summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/generic/FAQ-en/html/FAQ-whatengine.html
blob: 47d47effccd63a4beeb2f4586459cbc78e91b3c1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
<head>
<title>UK TeX FAQ -- question label whatengine</title>
</head><body>
<h3>Am I using PDFTeX, XeTeX or LuaTeX?</h3>
<p/><p/>You often need to know what &#8220;engine&#8221; your macros are running on (the
engine is the TeX-derivative or TeX-alike processor that
typesets your document).  The reason that you need to know is that the
set of functions available in each engine is different.  Thus, for
TeX macros to run on any engine, they need to &#8220;know&#8221; what they
can and cannot do, which depends on the engine in use.  Getting the
right answer is surprisingly tricky (see below for an elaboration of
one apparently simple test).
<p/>There is now a comprehensive set of packages that answer the question
for you.  They all create a TeX conditional command:
<ul>
<li> <i>ifpdf</i> creates a command <code>\</code><code>ifpdf</code>,
<li> <i>ifxetex</i> creates a command <code>\</code><code>ifxetex</code> and
<li> <i>ifluatex</i> creates a command <code>\</code><code>ifluatex</code>.
</ul>
These TeX commands may be used within the LaTeX conditional
framework, as (for example):
<blockquote>
  <code>\</code><code>ifthenelse</code><code>\char&#8216;{</code><code>\</code><code>boolean{pdf}</code><code>\char&#8216;}\char&#8216;&lbrace;&lt;<i>if pdf</i>&gt;\char&#8216;&rbrace;\char&#8216;&lbrace;&lt;<i>not pdf</i>&gt;\char&#8216;&rbrace;</code>
</blockquote><p>
<p/>The <i>ifxetex</i> package also provides a command
<code>\</code><code>RequireXeTeX</code> which creates an error if the code is not running
under XeTeX; while the other packages don&#8217;t provide such a command,
it&#8217;s not really difficult to write one for yourself.
<p/>

<p/>Now for those who want to do the job for themselves: here&#8217;s a
discussion of doing the job for PDFTeX and <code>\</code><code>ifpdf</code> &#8212; the
eager programmer can regenerate <code>\</code><code>ifxetex</code> or <code>\</code><code>ifluatex</code> in the
same fashion.  It&#8217;s not recommended\dots
<p/>Suppose you need to test whether your output will be PDF or
DVI.  The natural thing is to check whether you have access to
some PDFTeX-only primitive; a good one to try (not least because it
was present in the very first releases of PDFTeX) is
<code>\</code><code>pdfoutput</code>.  So you try
<blockquote>
<pre>
\ifx\pdfoutput\undefined
  ... % not running PDFTeX
\else
  ... % running PDFTeX
\fi
</pre>
</blockquote><p>
Except that neither branch of this conditional is rock-solid.  The
first branch can be misleading, since the &#8220;awkward&#8221; user could have
written:
<blockquote>
<pre>
\let\pdfoutput\undefined
</pre>
</blockquote><p>
so that your test will falsely choose the first alternative.  While
this is a theoretical problem, it is unlikely to be a major one.
<p/>More important is the user who loads a package that uses
LaTeX-style testing for the command name&#8217;s existence (for example,
the LaTeX <i>graphics</i> package, which is useful even to the
Plain TeX user).  Such a package may have gone ahead of you, so the
test may need to be elaborated:
<blockquote>
<pre>
\ifx\pdfoutput\undefined
  ... % not running PDFTeX
\else
  \ifx\pdfoutput\relax
    ... % not running PDFTeX
  \else
    ... % running PDFTeX
  \fi
\fi
</pre>
</blockquote><p>
If you only want to know whether some PDFTeX extension (such as
marginal kerning) is present, you can stop at this point: you know as
much as you need.
<p/>However, if you need to know whether you&#8217;re creating PDF
output, you also need to know about the value of <code>\</code><code>pdfoutput</code>:
<blockquote>
<pre>
\ifx\pdfoutput\undefined
  ... % not running PDFTeX
\else
  \ifx\pdfoutput\relax
    ... % not running PDFTeX
  \else
    % running PDFTeX, with...
    \ifnum\pdfoutput&#62;0
      ... % PDF output
    \else
      ... % DVI output
    \fi
  \fi
\fi
</pre>
</blockquote><p>
<dl>
<dt><tt><i>ifpdf.sty</i></tt><dd>Distributed as part Heiko Oberdiek&#8217;s bundle
  <a href="http://mirror.ctan.org/macros/latex/contrib/oberdiek.zip">macros/latex/contrib/oberdiek</a> (or <a href="http://mirror.ctan.org/macros/latex/contrib/oberdiek/">browse the directory</a>); <a href="http://mirror.ctan.org/help/Catalogue/entries/ifpdf.html">catalogue entry</a>
<dt><tt><i>ifluatex.sty</i></tt><dd>Distributed as part of Heiko Oberdiek&#8217;s bundle
  <a href="http://mirror.ctan.org/macros/latex/contrib/oberdiek.zip">macros/latex/contrib/oberdiek</a> (or <a href="http://mirror.ctan.org/macros/latex/contrib/oberdiek/">browse the directory</a>); <a href="http://mirror.ctan.org/help/Catalogue/entries/ifluatex.html">catalogue entry</a>
<dt><tt><i>ifxetex.sty</i></tt><dd><a href="http://mirror.ctan.org/macros/generic/ifxetex.zip">macros/generic/ifxetex</a> (or <a href="http://mirror.ctan.org/macros/generic/ifxetex/">browse the directory</a>); <a href="http://mirror.ctan.org/help/Catalogue/entries/ifxetex.html">catalogue entry</a>
</dl>
<p/><p>This question on the Web: <a href="http://www.tex.ac.uk/cgi-bin/texfaq2html?label=whatengine">http://www.tex.ac.uk/cgi-bin/texfaq2html?label=whatengine</a>
</body>