1# -*- mode: Perl -*-
2# /=====================================================================\ #
3# |  pdfTeX                                                             | #
4# | pdfTeX enhancements Implementation for LaTeXML                      | #
5# |=====================================================================| #
6# | Part of LaTeXML:                                                    | #
7# |  Public domain software, produced as part of work done by the       | #
8# |  United States Government & not subject to copyright in the US.     | #
9# |---------------------------------------------------------------------| #
10# | Bruce Miller <bruce.miller@nist.gov>                        #_#     | #
11# | http://dlmf.nist.gov/LaTeXML/                              (o o)    | #
12# \=========================================================ooo==U==ooo=/ #
13package LaTeXML::Package::Pool;
14use strict;
15use warnings;
16use LaTeXML::Package;
17
18# A rough initial draft of the extra commands & registers defined in pdfTeX.
19
20# See the pdfTeX User's Manual
21
22# Integer Registers
23DefRegister('\pdfoutput'                => Number(0));
24DefRegister('\pdfminorversion'          => Number(4));
25DefRegister('\pdfoptionpdfminorversion' => Number(4));    # obsolete name
26DefRegister('\pdfcompresslevel'         => Number(9));
27DefRegister('\pdfobjcompresslevel'      => Number(0));
28DefRegister('\pdfdecimaldigits'         => Number(4));
29DefRegister('\pdfimageresolution'       => Number(72));
30DefRegister('\pdfpkresolution'          => Number(0));
31DefRegister('\pdftracingfonts'          => Number(0));
32DefRegister('\pdfuniqueresname'         => Number(0));
33DefRegister('\pdfadjustspacing'         => Number(0));
34DefRegister('\pdfprotrudechars'         => Number(0));
35# \efcode <font> <8bitnumber>  => <integer>
36# \lpfcode <font> <8bitnumber> => <integer>
37# \rpfcode <font> <8bitnumber> => <integer>
38DefRegister('\efcode Token Number',   Number(0));
39DefRegister('\lpcode Token Number',   Number(0));
40DefRegister('\rpcode Token Number',   Number(0));
41DefRegister('\knaccode Token Number', Number(0));
42DefRegister('\knbccode Token Number', Number(0));
43DefRegister('\knbscode Token Number', Number(0));
44DefRegister('\shbscode Token Number', Number(0));
45DefRegister('\stbscode Token Number', Number(0));
46DefRegister('\tagcode Token Number',  Number(0));
47
48DefRegister('\pdfforcepagebox'                => Number(0));
49DefRegister('\pdfoptionalwaysusepdfpagebox'   => Number(0));
50DefRegister('\pdfinclusionerrorlevel'         => Number(0));
51DefRegister('\pdfoptionalinclusionerrorlevel' => Number(0));
52DefRegister('\pdfimagehicolor'                => Number(0));
53DefRegister('\pdfimageapplygamma'             => Number(0));
54DefRegister('\pdfgamma'                       => Number(0));
55DefRegister('\pdfimagegamma'                  => Number(0));
56DefRegister('\pdfdraftmode'                   => Number(0));
57DefRegister('\pdfadjustinterwordglue'         => Number(0));
58DefRegister('\pdfappendkern'                  => Number(0));
59DefRegister('\pdfgentounicode'                => Number(0));
60DefRegister('\pdfinclusioncopyfonts'          => Number(0));
61DefRegister('\pdfinfoomitdate'                => Number(0));
62DefRegister('\pdfpagebox'                     => Number(0));
63DefRegister('\pdfprependkern'                 => Number(0));
64DefRegister('\pdfsuppressptexinfo'            => Number(0));
65DefRegister('\pdfsuppresswarningdupdest'      => Number(0));
66DefRegister('\pdfsuppresswarningdupmap'       => Number(0));
67DefRegister('\pdfsuppresswarningpagegroup'    => Number(0));
68
69# Dimen Registers
70DefRegister('\pdfhorigin'         => Dimension('1in'));
71DefRegister('\pdfvorigin'         => Dimension('1in'));
72DefRegister('\pdfpagewidth'       => Dimension('0pt'));
73DefRegister('\pdfpageheight'      => Dimension('0pt'));
74DefRegister('\pdflinkmargin'      => Dimension('0pt'));
75DefRegister('\pdfdestmargin'      => Dimension('0pt'));
76DefRegister('\pdfthreadmargin'    => Dimension('0pt'));
77DefRegister('\pdfpxdimen'         => Dimension('0pt'));
78DefRegister('\pdfeachlinedepth'   => Dimension('0pt'));
79DefRegister('\pdfeachlineheight'  => Dimension('0pt'));
80DefRegister('\pdffirstlineheight' => Dimension('0pt'));
81DefRegister('\pdfignoreddimen'    => Dimension('0pt'));
82DefRegister('\pdflastlinedepth'   => Dimension('0pt'));
83
84# Token Registers
85DefRegister('\pdfpagesattr'     => Tokens());
86DefRegister('\pdfpageattr'      => Tokens());
87DefRegister('\pdfpageresources' => Tokens());
88DefRegister('\pdfpkmode'        => Tokens());
89
90# Expandable Commands
91DefMacro('\pdftexrevision', '19');
92
93DefMacro('\pdftexbanner',             '');
94DefMacro('\pdfcreationdate',          '');
95DefMacro('\pdfpageref Number',        '');
96DefMacro('\pdfxformname Number',      '');
97DefMacro('\pdffontname Token',        '');
98DefMacro('\pdffontobjnum Token',      '');
99DefMacro('\pdffontsize Token',        '');
100DefMacro('\pdfincludechars Token {}', '');
101DefMacro('\leftmarginkern Number',    '');
102DefMacro('\rightmarginkern Number',   '');
103DefMacro('\pdfescapestring {}',       '');
104DefMacro('\pdfescapename {}',         '');
105DefMacro('\pdfescapehex {}',          '');
106DefMacro('\pdfunescapehex {}',        '');
107# DefMacro('\ifpdfprimitive {}','');
108# DefMacro('\ifpdfabsnum Number','');
109# DefMacro('\ifpdfabsdim Dimension','');
110DefMacro('\pdfuniformdeviate Number Token', '');
111DefMacro('\pdfnormaldeviate Token',         '');
112DefMacro('\pdfmdfivesum Number {}',         '');
113DefMacro('\pdffilemoddate {}',              '');
114# DefMacro('\pdffiledump {}','');
115# DefMacro('\pdfcolorstackinit {}','');
116
117# Read-only registers
118DefRegister('\pdftexversion'           => Number(140));
119DefRegister('\pdflastobj'              => Number(0));
120DefRegister('\pdflastxform'            => Number(0));
121DefRegister('\pdflastximage'           => Number(0));
122DefRegister('\pdflastximagepages'      => Number(0));
123DefRegister('\pdflastannot'            => Number(0));
124DefRegister('\pdflastlink'             => Number(0));
125DefRegister('\pdflastxpos'             => Number(0));
126DefRegister('\pdflastypos'             => Number(0));
127DefRegister('\pdflastdemerits'         => Number(0));
128DefRegister('\pdfelapsedtime'          => Number(0));
129DefRegister('\pdfrandomseed'           => Number(0));
130DefRegister('\pdfshellescape'          => Number(0));
131DefRegister('\pdflastximagecolordepth' => Number(0));
132DefRegister('\pdfretval'               => Number(0));
133
134# \pdfximage [ image attr spec ] general text (h, v, m)
135# \pdfrefximage object number (h, v, m)
136# \pdfannot annot type spec (h, v, m)
137# Ugh, what a mess of ugly syntax....
138DefParameterType('OpenActionSpecification', sub {
139    my ($gullet) = @_;
140    if (my $key = $gullet->readKeyword('openaction')) {
141      if (my $action = $gullet->readKeyword('user', 'goto')) {
142        # etc....
143  } } },
144  optional => 1, undigested => 1);
145
146DefParameterType('OpenAnnotSpecification', sub {
147    my ($gullet) = @_;
148    my $general_text_param = LookupMapping('PARAMETER_TYPES', 'GeneralText');
149
150    if    ($gullet->readKeyword('reserveobjnum')) { return; }
151    elsif ($gullet->readKeyword('useobjnum')) {
152      my $discard = $gullet->readNumber; }
153    elsif ($gullet->readKeyword('stream')) {
154      if ($gullet->readKeyword('attr')) {
155        $gullet->skipSpaces;
156        my $discard_stream = &{ $$general_text_param{reader} }($gullet); }
157    }
158    $gullet->skipSpaces;
159    my $discard_spec = &{ $$general_text_param{reader} }($gullet);
160    return; }
161  , optional => 1, undigested => 1);
162
163DefPrimitive('\pdfannot OpenAnnotSpecification', undef);
164
165# \pdfstartlink [ rule spec ] [ attr spec ] action spec (h, m)
166DefPrimitive('\pdfstartlink', undef);
167# \pdfendlink (h, m)
168DefPrimitive('\pdfendlink', undef);
169# \pdfoutline outline spec (h, v, m)
170# \pdfdest dest spec (h, v, m)
171# \pdfthread thread spec (h, v, m)
172# \pdfstartthread thread spec (v, m)
173# \pdfendthread (v, m)
174# \pdfsavepos (h, v, m)
175
176# See lxRDFa for ideas how this info might be used!
177DefMacro('\pdfinfo{}', '');
178
179DefMacro('\pdfcatalog{} OpenActionSpecification', '');
180DefMacro('\pdfnames{}',                           {});
181DefMacro('\pdftrailer{}',                         {});
182DefMacro('\pdfmapfile{}',                         '');
183DefMacro('\pdfmapline{}',                         '');
184# \pdffontattr font general text
185# \pdffontexpand font expand spec
186# \vadjust [ pre spec ] filler { vertical mode material } (h, m)
187DefMacro('\quitvmode', '');
188# \pdfliteral [ pdfliteral spec ] general text (h, v, m)
189DefPrimitive('\pdfliteral OptionalMatch:direct OptionalMatch:page GeneralText', undef);
190# \special pdfspecial spec
191# \pdfresettimer
192# \pdfsetrandomseed number
193# \pdfnoligatures font
194# \pdfprimitive control sequence
195# TODO: https://tex.stackexchange.com/questions/13771/let-a-control-sequence-to-a-redefined-primitive
196DefMacro('\pdfprimitive DefToken', '#1');    # we can just ignore the advanced effects for now.
197# \pdfcolorstack stack number stack action general text
198DefPrimitive('\pdfcolorstack Number OptionalMatch:set OptionalMatch:push OptionalMatch:pop OptionalMatch:current', sub {
199    # for now, carefully read and discard all arguments
200    my ($stomach, $number, $set, $push, $pop, $current) = @_;
201    return if ($pop);
202    my $gullet = $stomach->getGullet;
203    $gullet->skipSpaces;
204    my $general_text_param = LookupMapping('PARAMETER_TYPES', 'GeneralText');
205    my $discard            = &{ $$general_text_param{reader} }($gullet);
206    return; });
207DefPrimitive('\pdfobj OpenAnnotSpecification', sub {
208    # for now, carefully read and discard all arguments
209    return; });
210# [ stream [ attr spec ] ] object contents
211DefMacro('\pdfsetmatrix', '');
212DefMacro('\pdfsave',      '');
213DefMacro('\pdfrestore',   '');
214
215# general text → { balanced text }
216# attr spec → attr general text
217# resources spec → resources general text
218# rule spec → ( width | height | depth ) dimension [ rule spec ]
219# object type spec → reserveobjnum |
220# [ useobjnum number ]
221# [ stream [ attr spec ] ] object contents
222# annot type spec → reserveobjnum |
223# [ useobjnum number ] [ rule spec ] general text
224# object contents → file spec | general text
225# xform attr spec → [ attr spec ] [ resources spec ]
226# image attr spec → [ rule spec ] [ attr spec ] [ page spec ] [ colorspace spec ] [ pdf box spec ]
227# outline spec → [ attr spec ] action spec [ count number ] general text
228# action spec → user user-action spec | goto goto-action spec |
229# thread thread-action spec
230# user-action spec → general text
231# goto-action spec → numid |
232# [ file spec ] nameid |
233# [ file spec ] [ page spec ] general text |
234# file spec nameid newwindow spec |
235# file spec [ page spec ] general text newwindow spec
236# thread-action spec → [ file spec ] numid | [ file spec ] nameid
237# open-action spec → openaction action spec
238# colorspace spec → colorspace number
239# pdf box spec → mediabox | cropbox | bleedbox | trimbox | artbox
240# map spec → { [ map modifier ] balanced text }
241# map modifier → + | = | -
242# numid → num number
243# nameid → name general text
244# newwindow spec → newwindow | nonewwindow
245# dest spec → numid dest type | nameid dest type
246# dest type → xyz [ zoom number ] | fitr rule spec |
247# fitbh | fitbv | fitb | fith | fitv | fit
248# thread spec → [ rule spec ] [ attr spec ] id spec
249# id spec → numid | nameid
250# file spec → file general text
251# page spec → page number
252# expand spec → stretch shrink step [ autoexpand ]
253# stretch → number
254# shrink → number
255# step → number
256# pre spec → pre
257# pdfliteral spec → direct | page
258# pdfspecial spec → { [ pdfspecial id [ pdfspecial modifier ] ] balanced text }
259# pdfspecial id → pdf: | PDF:
260# pdfspecial modifier → direct:
261# stack action → set | push | pop | current
262
263DefMacro('\expanded Expanded', '#1');
264
265DefMacro('\pdfstrcmp Expanded Expanded', sub {
266    my $cmp = (ToString($_[1]) cmp ToString($_[2]));
267    return ($cmp == 1 ? T_OTHER('1')
268      : ($cmp == 0 ? T_OTHER('0')
269        : Tokens(T_OTHER('-'), T_OTHER('1')))); });
2701;
271