4
***************************************
5
Module :mod:`text`: TeX/LaTeX interface
6
***************************************
12
The :mod:`text` module seamlessly integrates Donald E. Knuths famous TeX
13
typesetting engine into PyX. The basic procedure is:
15
* start a TeX/LaTeX instance as soon as a TeX/LaTeX preamble setting or a text
18
* create boxes containing the requested text and shipout those boxes to the dvi
21
* immediately analyse the TeX/LaTeX output for errors; the box extents are also
22
contained in the TeX/LaTeX output and thus become available immediately
24
* when your TeX installation supports the ``ipc`` mode and PyX is configured to
25
use it, the dvi output is also analysed immediately; alternatively PyX quits the
26
TeX/LaTeX instance to read the dvi file once the output needs to be generated or
27
marker positions are accessed
29
* Type1 fonts are used for the PostScript generation
31
Note that for using Type1 fonts an appropriate font mapping file has to be
32
provided. When your TeX installation is configured to use Type1 fonts by
33
default, the ``psfonts.map`` will contain entries for the standard TeX fonts
34
already. Alternatively, you may either look for ``updmap`` used by many TeX
35
distributions to create an appropriate font mapping file. You may also specify
36
one or several alternative font mapping files like ``psfonts.cmz`` in the global
37
``pyxrc`` or your local ``.pyxrc``. Finally you can also use the *fontmap*
38
keyword argument to a texrunners :meth:`text` method to use different mappings
39
within a single outout file.
42
TeX/LaTeX instances: the :class:`texrunner` class
43
=================================================
46
Instances of the class :class:`texrunner` are responsible for executing and
47
controling a TeX/LaTeX instance.
50
.. class:: texrunner(mode="tex", lfs="10pt", docclass="article", docopt=None, usefiles=[], fontmaps=config.get("text", "fontmaps", "psfonts.map"), waitfortex=config.getint("text", "waitfortex", 60), showwaitfortex=config.getint("text", "showwaitfortex", 5), texipc=config.getboolean("text", "texipc", 0), texdebug=None, dvidebug=0, errordebug=1, pyxgraphics=1, texmessagesstart=[], texmessagesdocclass=[], texmessagesbegindoc=[], texmessagesend=[], texmessagesdefaultpreamble=[], texmessagesdefaultrun=[])
52
*mode* should the string ``tex`` or ``latex`` and defines whether TeX or LaTeX
53
will be used. *lfs* specifies an ``lfs`` file to simulate LaTeX font size
54
selection macros in plain TeX. PyX comes with a set of ``lfs`` files and a LaTeX
55
script to generate those files. For *lfs* being ``None`` and *mode* equals
56
``tex`` a list of installed ``lfs`` files is shown.
58
*docclass* is the document class to be used in LaTeX mode and *docopt* are the
59
options to be passed to the document class.
61
*usefiles* is a list of TeX/LaTeX jobname files. PyX will take care of the
62
creation and storing of the corresponding temporary files. A typical use-case
63
would be *usefiles=["spam.aux"]*, but you can also use it to access TeXs log and
66
*fontmaps* is a string containing whitespace separated names of font mapping
67
files. *waitfortex* is a number of seconds PyX should wait for TeX/LaTeX to
68
process a request. While waiting for TeX/LaTeX a PyX process might seem to do
69
not perform any work anymore. To give some feedback to the user, a messages is
70
issued each *waitfortex* seconds. The ``texipc`` flag indicates whether PyX
71
should use the ``--ipc`` option of TeX/LaTeX for immediate dvi file access to
72
increase the execution speed of certain operations. See the output of ``tex
73
--help`` whether the option is available at your TeX installation.
75
*texdebug* can be set to a filename to store the commands passed to TeX/LaTeX
76
for debugging. The flag *dvidebug* enables debugging output in the dvi parser
77
similar to ``dvitype``. *errordebug* controls the amount of information
78
returned, when an texmessage parser raises an error. Valid values are ``0``,
81
*pyxgraphics* allows use LaTeXs graphics package without further configuration
84
The TeX message parsers verify whether TeX/LaTeX could properly process its
85
input. By the parameters *texmessagesstart*, *texmessagesdocclass*,
86
*texmessagesbegindoc*, and *texmessagesend* you can set TeX message parsers to
87
be used then TeX/LaTeX is started, when the ``documentclass`` command is issued
88
(LaTeX only), when the ``\\begin{document}`` is sent, and when the TeX/LaTeX is
89
stopped, respectively. The lists of TeX message parsers are merged with the
90
following defaults: ``[texmessage.start]`` for *texmessagesstart*,
91
``[texmessage.load]`` for *texmessagesdocclass*, ``[texmessage.load,
92
texmessage.noaux]`` for *texmessagesbegindoc*, and ``[texmessage.texend,
93
texmessage.fontwarning]`` for *texmessagesend*.
95
Similarily *texmessagesdefaultpreamble* and *texmessagesdefaultrun* take TeX
96
message parser to be merged to the TeX message parsers given in the
97
:meth:`preamble` and :meth:`text` methods. The *texmessagesdefaultpreamble* and
98
*texmessagesdefaultrun* are merged with ``[texmessage.load]`` and
99
``[texmessage.loaddef, texmessage.graphicsload, texmessage.fontwarning,
100
texmessage.boxwarning]``, respectively.
102
:class:`texrunner` instances provides several methods to be called by the user:
105
.. method:: texrunner.set(**kwargs)
107
This method takes the same keyword arguments as the :class:`texrunner`
108
constructor. Its purpose is to reconfigure an already constructed
109
:class:`texrunner` instance. The most prominent use-case is to alter the
110
configuration of the default :class:`texrunner` instance ``defaulttexrunner``
111
which is created at the time of loading of the :mod:`text` module.
113
The ``set`` method fails, when a modification cannot be applied anymore (e.g.
114
TeX/LaTeX has already been started).
117
.. method:: texrunner.preamble(expr, texmessages=[])
119
The :meth:`preamble` can be called prior to the :meth:`text` method only or
120
after reseting a texrunner instance by :meth:`reset`. The *expr* is passed to
121
the TeX/LaTeX instance not encapsulated in a group. It should not generate any
122
output to the dvi file. In LaTeX preamble expressions are inserted prior to the
123
``\\begin{document}`` and a typical use-case is to load packages by
124
``\\usepackage``. Note, that you may use ``\\AtBeginDocument`` to postpone the
125
immediate evaluation.
127
*texmessages* are TeX message parsers to handle the output of TeX/LaTeX. They
128
are merged with the default TeX message parsers for the :meth:`preamble` method.
129
See the constructur description for details on the default TeX message parsers.
132
.. method:: texrunner.text(x, y, expr, textattrs=[], texmessages=[])
134
*x* and *y* are the position where a text should be typeset and *expr* is the
135
TeX/LaTeX expression to be passed to TeX/LaTeX.
137
*textattrs* is a list of TeX/LaTeX settings as described below, PyX
138
transformations, and PyX fill styles (like colors).
140
*texmessages* are TeX message parsers to handle the output of TeX/LaTeX. They
141
are merged with the default TeX message parsers for the :meth:`text` method. See
142
the constructur description for details on the default TeX message parsers.
144
The :meth:`text` method returns a :class:`textbox` instance, which is a special
145
:class:`canvas` instance. It has the methods :meth:`width`, :meth:`height`, and
146
:meth:`depth` to access the size of the text. Additionally the :meth:`marker`
147
method, which takes a string *s*, returns a position in the text, where the
148
expression ``\\PyXMarker{s}`` is contained in *expr*. You should not use ``@``
149
within your strings *s* to prevent name clashes with PyX internal macros
150
(although we don't the marker feature internally right now).
152
Note that for the outout generation and the marker access the TeX/LaTeX instance
153
must be terminated except when ``texipc`` is turned on. However, after such a
154
termination a new TeX/LaTeX instance is started when the :meth:`text` method is
158
.. method:: texrunner.reset(reinit=0)
160
This method can be used to manually force a restart of TeX/LaTeX. The flag
161
*reinit* will initialize the TeX/LaTeX by repeating the :meth:`preamble` calls.
162
New :meth:`set` and :meth:`preamble` calls are allowed when *reinit* was not set
170
TeX/LaTeX attributes are instances to be passed to a :class:`texrunner`\ s
171
:meth:`text` method. They stand for TeX/LaTeX expression fragments and handle
172
dependencies by proper ordering.
175
.. class:: halign(boxhalign, flushhalign)
177
Instances of this class set the horizontal alignment of a text box and the
178
contents of a text box to be left, center and right for *boxhalign* and
179
*flushhalign* being ``0``, ``0.5``, and ``1``. Other values are allowed as well,
180
although such an alignment seems quite unusual.
182
Note that there are two separate classes :class:`boxhalign` and
183
:class:`flushhalign` to set the alignment of the box and its contents
184
independently, but those helper classes can't be cleared independently from each
185
other. Some handy instances available as class members:
188
.. attribute:: halign.boxleft
190
Left alignment of the text box, *i.e.* sets *boxhalign* to ``0`` and doesn't set
194
.. attribute:: halign.boxcenter
196
Center alignment of the text box, *i.e.* sets *boxhalign* to ``0.5`` and doesn't
200
.. attribute:: halign.boxright
202
Right alignment of the text box, *i.e.* sets *boxhalign* to ``1`` and doesn't
206
.. attribute:: halign.flushleft
208
Left alignment of the content of the text box in a multiline box, *i.e.* sets
209
*flushhalign* to ``0`` and doesn't set *boxhalign*.
212
.. attribute:: halign.raggedright
214
Identical to :attr:`flushleft`.
217
.. attribute:: halign.flushcenter
219
Center alignment of the content of the text box in a multiline box, *i.e.* sets
220
*flushhalign* to ``0.5`` and doesn't set *boxhalign*.
223
.. attribute:: halign.raggedcenter
225
Identical to :attr:`flushcenter`.
228
.. attribute:: halign.flushright
230
Right alignment of the content of the text box in a multiline box, *i.e.* sets
231
*flushhalign* to ``1`` and doesn't set *boxhalign*.
234
.. attribute:: halign.raggedleft
236
Identical to :attr:`flushright`.
239
.. attribute:: halign.left
241
Combines :attr:`boxleft` and :attr:`flushleft`, *i.e.* ``halign(0, 0)``.
244
.. attribute:: halign.center
246
Combines :attr:`boxcenter` and :attr:`flushcenter`, *i.e.* ``halign(0.5, 0.5)``.
249
.. attribute:: halign.right
251
Combines :attr:`boxright` and :attr:`flushright`, *i.e.* ``halign(1, 1)``.
254
.. figure:: textvalign.*
260
.. class:: valign(valign)
262
Instances of this class set the vertical alignment of a text box to be top,
263
center and bottom for *valign* being ``0``, ``0.5``, and ``1``. Other values are
264
allowed as well, although such an alignment seems quite unusual. See the left
265
side of figure :ref:`fig_textvalign` for an example.
267
Some handy instances available as class members:
270
.. attribute:: valign.top
275
.. attribute:: valign.middle
280
.. attribute:: valign.bottom
285
.. attribute:: valign.baseline
287
Identical to clearing the vertical alignment by :attr:`clear` to emphasise that
288
a baseline alignment is not a box-related alignment. Baseline alignment is the
289
default, *i.e.* no valign is set by default.
292
.. class:: parbox(width, baseline=top)
294
Instances of this class create a box with a finite width, where the typesetter
295
creates multiple lines in. Note, that you can't create multiple lines in
296
TeX/LaTeX without specifying a box width. Since PyX doesn't know a box width, it
297
uses TeXs LR-mode by default, which will always put everything into a single
298
line. Since in a vertical box there are several baselines, you can specify the
299
baseline to be used by the optional *baseline* argument. You can set it to the
300
symbolic names :attr:`top`, :attr:`parbox.middle`, and :attr:`parbox.bottom`
301
only, which are members of :class:`valign`. See the right side of figure
302
:ref:`fig_textvalign` for an example.
304
Since you need to specify a box width no predefined instances are available as
308
.. class:: vshift(lowerratio, heightstr="0")
310
Instances of this class lower the output by *lowerratio* of the height of the
311
string *heigthstring*. Note, that you can apply several shifts to sum up the
312
shift result. However, there is still a :attr:`clear` class member to remove all
315
Some handy instances available as class members:
318
.. attribute:: vshift.bottomzero
320
``vshift(0)`` (this doesn't shift at all)
323
.. attribute:: vshift.middlezero
328
.. attribute:: vshift.topzero
333
.. attribute:: vshift.mathaxis
335
This is a special vertical shift to lower the output by the height of the
336
mathematical axis. The mathematical axis is used by TeX for the vertical
337
alignment in mathematical expressions and is often usefull for vertical
338
alignment. The corresponding vertical shift is less than :attr:`middlezero` and
339
usually fits the height of the minus sign. (It is the height of the minus sign
340
in mathematical mode, since that's that the mathematical axis is all about.)
342
There is a TeX/LaTeX attribute to switch to TeXs math mode. The appropriate
343
instances ``mathmode`` and ``clearmathmode`` (to clear the math mode attribute)
344
are available at module level.
349
Enables TeXs mathematical mode in display style.
351
The :class:`size` class creates TeX/LaTeX attributes for changing the font size.
354
.. class:: size(sizeindex=None, sizename=None, sizelist=defaultsizelist)
356
LaTeX knows several commands to change the font size. The command names are
357
stored in the *sizelist*, which defaults to ``["normalsize", "large", "Large",
358
"LARGE", "huge", "Huge", None, "tiny", "scriptsize", "footnotesize", "small"]``.
360
You can either provide an index *sizeindex* to access an item in *sizelist* or
361
set the command name by *sizename*.
363
Instances for the LaTeXs default size change commands are available as class
367
.. attribute:: size.tiny
372
.. attribute:: size.scriptsize
377
.. attribute:: size.footnotesize
382
.. attribute:: size.small
387
.. attribute:: size.normalsize
392
.. attribute:: size.large
397
.. attribute:: size.Large
402
.. attribute:: size.LARGE
407
.. attribute:: size.huge
412
.. attribute:: size.Huge
416
There is a TeX/LaTeX attribute to create empty text boxes with the size of the
417
material passed in. The appropriate instances ``phantom`` and ``clearphantom``
418
(to clear the phantom attribute) are available at module level.
423
Skip the text in the box, but keep its size.
426
Using the graphics-bundle with LaTeX
427
====================================
429
The packages in the LaTeX graphics bundle (``color.sty``, ``graphics.sty``,
430
``graphicx.sty``, ...) make extensive use of ``\\special`` commands. PyX defines
431
a clean set of such commands to fit the needs of the LaTeX graphics bundle. This
432
is done via the ``pyx.def`` driver file, which tells the graphics bundle about
433
the syntax of the ``\\special`` commands as expected by PyX. You can install the
434
driver file ``pyx.def`` into your LaTeX search path and add the content of both
435
files ``color.cfg`` and ``graphics.cfg`` to your personal configuration files.
436
[#]_ After you have installed the ``cfg`` files, please use the :mod:`text`
437
module with unset ``pyxgraphics`` keyword argument which will switch off a
438
convenience hack for less experienced LaTeX users. You can then import the LaTeX
439
graphics bundle packages and related packages (e.g. ``rotating``, ...) with the
440
option ``pyx``, e.g. ``\\usepackage[pyx]{color,graphicx}``. Note that the option
441
``pyx`` is only available with unset *pyxgraphics* keyword argument and a
442
properly installed driver file. Otherwise, omit the specification of a driver
443
when loading the packages.
445
When you define colors in LaTeX via one of the color models ``gray``, ``cmyk``,
446
``rgb``, ``RGB``, ``hsb``, then PyX will use the corresponding values (one to
447
four real numbers). In case you use any of the ``named`` colors in LaTeX, PyX
448
will use the corresponding predefined color (see module ``color`` and the color
449
table at the end of the manual). The additional LaTeX color model ``pyx`` allows
450
to use a PyX color expression, such as ``color.cmyk(0,0,0,0)`` directly in
451
LaTeX. It is passed to PyX.
453
When importing Encapsulated PostScript files (``eps`` files) PyX will rotate,
454
scale and clip your file like you expect it. Other graphic formats can not be
455
imported via the graphics package at the moment.
457
For reference purpose, the following specials can be handled by PyX at the
460
``PyX:color_begin (model) (spec)``
461
starts a color. ``(model)`` is one of ``gray``, ``cmyk``, ``rgb``, ``hsb``,
462
``texnamed``, or ``pyxcolor``. ``(spec)`` depends on the model: a name or some
468
``PyX:epsinclude file= llx= lly= urx= ury= width= height= clip=0/1``
469
includes an Encapsulated PostScript file (``eps`` files). The values of ``llx``
470
to ``ury`` are in the files' coordinate system and specify the part of the
471
graphics that should become the specified ``width`` and ``height`` in the
472
outcome. The graphics may be clipped. The last three parameters are optional.
474
``PyX:scale_begin (x) (y)``
475
begins scaling from the current point.
480
``PyX:rotate_begin (angle)``
481
begins rotation around the current point.
491
Message parsers are used to scan the output of TeX/LaTeX. The output is analysed
492
by a sequence of TeX message parsers. Each message parser analyses the output
493
and removes those parts of the output, it feels responsible for. If there is
494
nothing left in the end, the message got validated, otherwise an exception is
495
raised reporting the problem. A message parser might issue a warning when
496
removing some output to give some feedback to the user.
499
.. class:: texmessage()
501
This class acts as a container for TeX message parsers instances, which are all
502
instances of classes derived from :class:`texmessage`.
504
The following TeX message parser instances are available:
507
.. attribute:: texmessage.start
509
Check for TeX/LaTeX startup message including scrollmode test.
512
.. attribute:: texmessage.noaux
514
Ignore LaTeXs no-aux-file warning.
517
.. attribute:: texmessage.end
519
Check for proper TeX/LaTeX tear down message.
522
.. attribute:: texmessage.load
524
Accepts arbitrary loading of files without checking for details, *i.e.* accept
525
``(file ...)`` where ``file`` is an readable file.
528
.. attribute:: texmessage.loaddef
530
Accepts arbitrary loading of ``fd`` files, *i.e.* accept ``(file.def)`` and
531
``(file.fd)`` where ``file.def`` or ``file.fd`` is an readable file,
535
.. attribute:: texmessage.graphicsload
537
Accepts arbitrary loading of ``eps`` files, *i.e.* accept ``(file.eps)`` where
538
``file.eps`` is an readable file.
541
.. attribute:: texmessage.ignore
543
Ignores everything (this is probably a bad idea, but sometimes you might just
544
want to ignore everything).
547
.. attribute:: texmessage.allwarning
549
Ignores everything but issues a warning.
552
.. attribute:: texmessage.fontwarning
554
Issues a warning about font substitutions of the LaTeXs NFSS.
557
.. attribute:: texmessage.boxwarning
559
Issues a warning on under- and overfull horizontal and vertical boxes.
562
.. class:: texmessagepattern(pattern, warning=None)
564
This is a derived class of :class:`texmessage`. It can be used to construct
565
simple TeX message parsers, which validate a TeX message matching a certain
566
regular expression pattern *pattern*. When *warning* is set, a warning message
567
is issued. Several of the TeX message parsers described above are implemented
571
The :attr:`defaulttexrunner` instance
572
=====================================
575
.. data:: defaulttexrunner
577
The ``defaulttexrunner`` is an instance of :class:`texrunner`. It is created
578
when the :mod:`text` module is loaded and it is used as the default texrunner
579
instance by all :class:`canvas` instances to implement its :meth:`text` method.
582
.. function:: preamble(...)
584
``defaulttexrunner.preamble``
587
.. function:: text(...)
589
``defaulttexrunner.text``
592
.. function:: set(...)
594
``defaulttexrunner.set``
597
.. function:: reset(...)
599
``defaulttexrunner.reset``
602
Some internals on temporary files etc.
603
======================================
605
It is not totally obvious how TeX processes are supervised by PyX and why it's
606
done that way. However there are good reasons for it and the following
607
description is intended for people wanting and/or needing to understand how
608
temporary files are used by PyX. All others don't need to care.
610
Each time PyX needs to start a new TeX process, it creates a base file name for
611
temporary files associated with this process. This file name is used as
612
``\jobname`` by TeX. Since TeX does not handle directory names as part of
613
``\jobname``, the temporary files will be created in the current directory. The
614
PyX developers decided to not change the current directory at all, avoiding all
615
kind of issues with accessing files in the local directory, like for loading
616
graph data, LaTeX style files etc.
618
PyX creates a TeX file containing ``\relax`` only. It's only use is to set TeXs
619
``\jobname``. Immediately after processing ``\relax`` TeX falls back to stdin to
620
read more commands. PyX than uses ``stdin`` and ``stdout`` to avoid various
621
buffering issues which would occur when using files (or named pipes). By that
622
PyX can fetch TeX errors as soon as they occur while keeping the TeX process
623
running (i.e. in a waiting state) for further input. The size of the TeX output
624
is also availble immediately without fetching the ``dvi`` file created by TeX,
625
since PyX uses some TeX macros to output the extents of the boxes created for
626
the requested texts to ``stdout`` immediately. There is a TeX hack ``--ipc``
627
which PyX knows to take advantage of to fetch informations from the ``dvi`` file
628
immediately as well, but it's not available on all TeXinstallations. Thus this
629
feature is disabled by default and fetching informations from the ``dvi`` is
630
tried to be limited to those cases, where no other option exists. By that TeX
631
usually doesn't need to be started several times.
633
By default PyX will clean up all temporary files after TeX was stopped. However
634
the ``usefiles`` list allows for a renaming of the files from (and to, if
635
existing) the temporary ``\jobname`` (+ suffix) handled by PyX. Additionally,
636
since PyX does not write a useful TeX input file in a file and thus a
637
``usefiles=["example.tex"]`` would not contain the code actually passed to TeX,
638
the ``texdebug`` feature of the texrunner can be used instead to get a the full
641
In case you need to control the position where the temporary files are created
642
(say, you're working on a read-only directory), the suggested solution is to
643
switch the current directory before starting with text processing in PyX (i.e.
644
an ``os.chdir`` at the beginning of your script will do fine). You than just
645
need to take care of specifying full paths when accessing data from your
646
original working directory, but that's intended and necessary for that case.
648
.. rubric:: Footnotes
650
.. [#] If you do not know what this is all about, you can just ignore this paragraph.
651
But be sure that the *pyxgraphics* keyword argument is always set!