ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/staticperl/perl/lib/Pod/LaTeX.pm
Revision: 1.1
Committed: Thu Jun 30 14:27:14 2005 UTC (21 years, 4 months ago) by root
Branch: MAIN
CVS Tags: HEAD
Branch point for: PERL
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 package Pod::LaTeX;
2    
3     =head1 NAME
4    
5     Pod::LaTeX - Convert Pod data to formatted Latex
6    
7     =head1 SYNOPSIS
8    
9     use Pod::LaTeX;
10     my $parser = Pod::LaTeX->new ( );
11    
12     $parser->parse_from_filehandle;
13    
14     $parser->parse_from_file ('file.pod', 'file.tex');
15    
16     =head1 DESCRIPTION
17    
18     C<Pod::LaTeX> is a module to convert documentation in the Pod format
19     into Latex. The L<B<pod2latex>|pod2latex> X<pod2latex> command uses
20     this module for translation.
21    
22     C<Pod::LaTeX> is a derived class from L<Pod::Select|Pod::Select>.
23    
24     =cut
25    
26    
27     use strict;
28     require Pod::ParseUtils;
29     use base qw/ Pod::Select /;
30    
31     # use Data::Dumper; # for debugging
32     use Carp;
33    
34     use vars qw/ $VERSION %HTML_Escapes @LatexSections /;
35    
36     $VERSION = '0.58';
37    
38     # Definitions of =headN -> latex mapping
39     @LatexSections = (qw/
40     chapter
41     section
42     subsection
43     subsubsection
44     paragraph
45     subparagraph
46     /);
47    
48     # Standard escape sequences converted to Latex.
49     # The Unicode name of each character is given in the comments.
50     # Complete LaTeX set added by Peter Acklam.
51    
52     %HTML_Escapes = (
53     'sol' => '\textfractionsolidus{}', # xxx - or should it be just '/'
54     'verbar' => '|',
55    
56     # The stuff below is based on the information available at
57     # http://www.w3.org/TR/html401/sgml/entities.html
58    
59     # All characters in the range 0xA0-0xFF of the ISO 8859-1 character set.
60     # Several of these characters require the `textcomp' LaTeX package.
61     'nbsp' => q|~|, # 0xA0 - no-break space = non-breaking space
62     'iexcl' => q|\textexclamdown{}|, # 0xA1 - inverted exclamation mark
63     'cent' => q|\textcent{}|, # 0xA2 - cent sign
64     'pound' => q|\textsterling{}|, # 0xA3 - pound sign
65     'curren' => q|\textcurrency{}|, # 0xA4 - currency sign
66     'yen' => q|\textyen{}|, # 0xA5 - yen sign = yuan sign
67     'brvbar' => q|\textbrokenbar{}|, # 0xA6 - broken bar = broken vertical bar
68     'sect' => q|\textsection{}|, # 0xA7 - section sign
69     'uml' => q|\textasciidieresis{}|, # 0xA8 - diaeresis = spacing diaeresis
70     'copy' => q|\textcopyright{}|, # 0xA9 - copyright sign
71     'ordf' => q|\textordfeminine{}|, # 0xAA - feminine ordinal indicator
72     'laquo' => q|\guillemotleft{}|, # 0xAB - left-pointing double angle quotation mark = left pointing guillemet
73     'not' => q|\textlnot{}|, # 0xAC - not sign
74     'shy' => q|\-|, # 0xAD - soft hyphen = discretionary hyphen
75     'reg' => q|\textregistered{}|, # 0xAE - registered sign = registered trade mark sign
76     'macr' => q|\textasciimacron{}|, # 0xAF - macron = spacing macron = overline = APL overbar
77     'deg' => q|\textdegree{}|, # 0xB0 - degree sign
78     'plusmn' => q|\textpm{}|, # 0xB1 - plus-minus sign = plus-or-minus sign
79     'sup2' => q|\texttwosuperior{}|, # 0xB2 - superscript two = superscript digit two = squared
80     'sup3' => q|\textthreesuperior{}|, # 0xB3 - superscript three = superscript digit three = cubed
81     'acute' => q|\textasciiacute{}|, # 0xB4 - acute accent = spacing acute
82     'micro' => q|\textmu{}|, # 0xB5 - micro sign
83     'para' => q|\textparagraph{}|, # 0xB6 - pilcrow sign = paragraph sign
84     'middot' => q|\textperiodcentered{}|, # 0xB7 - middle dot = Georgian comma = Greek middle dot
85     'cedil' => q|\c{}|, # 0xB8 - cedilla = spacing cedilla
86     'sup1' => q|\textonesuperior{}|, # 0xB9 - superscript one = superscript digit one
87     'ordm' => q|\textordmasculine{}|, # 0xBA - masculine ordinal indicator
88     'raquo' => q|\guillemotright{}|, # 0xBB - right-pointing double angle quotation mark = right pointing guillemet
89     'frac14' => q|\textonequarter{}|, # 0xBC - vulgar fraction one quarter = fraction one quarter
90     'frac12' => q|\textonehalf{}|, # 0xBD - vulgar fraction one half = fraction one half
91     'frac34' => q|\textthreequarters{}|, # 0xBE - vulgar fraction three quarters = fraction three quarters
92     'iquest' => q|\textquestiondown{}|, # 0xBF - inverted question mark = turned question mark
93     'Agrave' => q|\`A|, # 0xC0 - latin capital letter A with grave = latin capital letter A grave
94     'Aacute' => q|\'A|, # 0xC1 - latin capital letter A with acute
95     'Acirc' => q|\^A|, # 0xC2 - latin capital letter A with circumflex
96     'Atilde' => q|\~A|, # 0xC3 - latin capital letter A with tilde
97     'Auml' => q|\"A|, # 0xC4 - latin capital letter A with diaeresis
98     'Aring' => q|\AA{}|, # 0xC5 - latin capital letter A with ring above = latin capital letter A ring
99     'AElig' => q|\AE{}|, # 0xC6 - latin capital letter AE = latin capital ligature AE
100     'Ccedil' => q|\c{C}|, # 0xC7 - latin capital letter C with cedilla
101     'Egrave' => q|\`E|, # 0xC8 - latin capital letter E with grave
102     'Eacute' => q|\'E|, # 0xC9 - latin capital letter E with acute
103     'Ecirc' => q|\^E|, # 0xCA - latin capital letter E with circumflex
104     'Euml' => q|\"E|, # 0xCB - latin capital letter E with diaeresis
105     'Igrave' => q|\`I|, # 0xCC - latin capital letter I with grave
106     'Iacute' => q|\'I|, # 0xCD - latin capital letter I with acute
107     'Icirc' => q|\^I|, # 0xCE - latin capital letter I with circumflex
108     'Iuml' => q|\"I|, # 0xCF - latin capital letter I with diaeresis
109     'ETH' => q|\DH{}|, # 0xD0 - latin capital letter ETH
110     'Ntilde' => q|\~N|, # 0xD1 - latin capital letter N with tilde
111     'Ograve' => q|\`O|, # 0xD2 - latin capital letter O with grave
112     'Oacute' => q|\'O|, # 0xD3 - latin capital letter O with acute
113     'Ocirc' => q|\^O|, # 0xD4 - latin capital letter O with circumflex
114     'Otilde' => q|\~O|, # 0xD5 - latin capital letter O with tilde
115     'Ouml' => q|\"O|, # 0xD6 - latin capital letter O with diaeresis
116     'times' => q|\texttimes{}|, # 0xD7 - multiplication sign
117     'Oslash' => q|\O{}|, # 0xD8 - latin capital letter O with stroke = latin capital letter O slash
118     'Ugrave' => q|\`U|, # 0xD9 - latin capital letter U with grave
119     'Uacute' => q|\'U|, # 0xDA - latin capital letter U with acute
120     'Ucirc' => q|\^U|, # 0xDB - latin capital letter U with circumflex
121     'Uuml' => q|\"U|, # 0xDC - latin capital letter U with diaeresis
122     'Yacute' => q|\'Y|, # 0xDD - latin capital letter Y with acute
123     'THORN' => q|\TH{}|, # 0xDE - latin capital letter THORN
124     'szlig' => q|\ss{}|, # 0xDF - latin small letter sharp s = ess-zed
125     'agrave' => q|\`a|, # 0xE0 - latin small letter a with grave = latin small letter a grave
126     'aacute' => q|\'a|, # 0xE1 - latin small letter a with acute
127     'acirc' => q|\^a|, # 0xE2 - latin small letter a with circumflex
128     'atilde' => q|\~a|, # 0xE3 - latin small letter a with tilde
129     'auml' => q|\"a|, # 0xE4 - latin small letter a with diaeresis
130     'aring' => q|\aa{}|, # 0xE5 - latin small letter a with ring above = latin small letter a ring
131     'aelig' => q|\ae{}|, # 0xE6 - latin small letter ae = latin small ligature ae
132     'ccedil' => q|\c{c}|, # 0xE7 - latin small letter c with cedilla
133     'egrave' => q|\`e|, # 0xE8 - latin small letter e with grave
134     'eacute' => q|\'e|, # 0xE9 - latin small letter e with acute
135     'ecirc' => q|\^e|, # 0xEA - latin small letter e with circumflex
136     'euml' => q|\"e|, # 0xEB - latin small letter e with diaeresis
137     'igrave' => q|\`i|, # 0xEC - latin small letter i with grave
138     'iacute' => q|\'i|, # 0xED - latin small letter i with acute
139     'icirc' => q|\^i|, # 0xEE - latin small letter i with circumflex
140     'iuml' => q|\"i|, # 0xEF - latin small letter i with diaeresis
141     'eth' => q|\dh{}|, # 0xF0 - latin small letter eth
142     'ntilde' => q|\~n|, # 0xF1 - latin small letter n with tilde
143     'ograve' => q|\`o|, # 0xF2 - latin small letter o with grave
144     'oacute' => q|\'o|, # 0xF3 - latin small letter o with acute
145     'ocirc' => q|\^o|, # 0xF4 - latin small letter o with circumflex
146     'otilde' => q|\~o|, # 0xF5 - latin small letter o with tilde
147     'ouml' => q|\"o|, # 0xF6 - latin small letter o with diaeresis
148     'divide' => q|\textdiv{}|, # 0xF7 - division sign
149     'oslash' => q|\o{}|, # 0xF8 - latin small letter o with stroke, = latin small letter o slash
150     'ugrave' => q|\`u|, # 0xF9 - latin small letter u with grave
151     'uacute' => q|\'u|, # 0xFA - latin small letter u with acute
152     'ucirc' => q|\^u|, # 0xFB - latin small letter u with circumflex
153     'uuml' => q|\"u|, # 0xFC - latin small letter u with diaeresis
154     'yacute' => q|\'y|, # 0xFD - latin small letter y with acute
155     'thorn' => q|\th{}|, # 0xFE - latin small letter thorn
156     'yuml' => q|\"y|, # 0xFF - latin small letter y with diaeresis
157    
158     # Latin Extended-B
159     'fnof' => q|\textflorin{}|, # latin small f with hook = function = florin
160    
161     # Greek
162     'Alpha' => q|$\mathrm{A}$|, # greek capital letter alpha
163     'Beta' => q|$\mathrm{B}$|, # greek capital letter beta
164     'Gamma' => q|$\Gamma$|, # greek capital letter gamma
165     'Delta' => q|$\Delta$|, # greek capital letter delta
166     'Epsilon' => q|$\mathrm{E}$|, # greek capital letter epsilon
167     'Zeta' => q|$\mathrm{Z}$|, # greek capital letter zeta
168     'Eta' => q|$\mathrm{H}$|, # greek capital letter eta
169     'Theta' => q|$\Theta$|, # greek capital letter theta
170     'Iota' => q|$\mathrm{I}$|, # greek capital letter iota
171     'Kappa' => q|$\mathrm{K}$|, # greek capital letter kappa
172     'Lambda' => q|$\Lambda$|, # greek capital letter lambda
173     'Mu' => q|$\mathrm{M}$|, # greek capital letter mu
174     'Nu' => q|$\mathrm{N}$|, # greek capital letter nu
175     'Xi' => q|$\Xi$|, # greek capital letter xi
176     'Omicron' => q|$\mathrm{O}$|, # greek capital letter omicron
177     'Pi' => q|$\Pi$|, # greek capital letter pi
178     'Rho' => q|$\mathrm{R}$|, # greek capital letter rho
179     'Sigma' => q|$\Sigma$|, # greek capital letter sigma
180     'Tau' => q|$\mathrm{T}$|, # greek capital letter tau
181     'Upsilon' => q|$\Upsilon$|, # greek capital letter upsilon
182     'Phi' => q|$\Phi$|, # greek capital letter phi
183     'Chi' => q|$\mathrm{X}$|, # greek capital letter chi
184     'Psi' => q|$\Psi$|, # greek capital letter psi
185     'Omega' => q|$\Omega$|, # greek capital letter omega
186    
187     'alpha' => q|$\alpha$|, # greek small letter alpha
188     'beta' => q|$\beta$|, # greek small letter beta
189     'gamma' => q|$\gamma$|, # greek small letter gamma
190     'delta' => q|$\delta$|, # greek small letter delta
191     'epsilon' => q|$\epsilon$|, # greek small letter epsilon
192     'zeta' => q|$\zeta$|, # greek small letter zeta
193     'eta' => q|$\eta$|, # greek small letter eta
194     'theta' => q|$\theta$|, # greek small letter theta
195     'iota' => q|$\iota$|, # greek small letter iota
196     'kappa' => q|$\kappa$|, # greek small letter kappa
197     'lambda' => q|$\lambda$|, # greek small letter lambda
198     'mu' => q|$\mu$|, # greek small letter mu
199     'nu' => q|$\nu$|, # greek small letter nu
200     'xi' => q|$\xi$|, # greek small letter xi
201     'omicron' => q|$o$|, # greek small letter omicron
202     'pi' => q|$\pi$|, # greek small letter pi
203     'rho' => q|$\rho$|, # greek small letter rho
204     # 'sigmaf' => q||, # greek small letter final sigma
205     'sigma' => q|$\sigma$|, # greek small letter sigma
206     'tau' => q|$\tau$|, # greek small letter tau
207     'upsilon' => q|$\upsilon$|, # greek small letter upsilon
208     'phi' => q|$\phi$|, # greek small letter phi
209     'chi' => q|$\chi$|, # greek small letter chi
210     'psi' => q|$\psi$|, # greek small letter psi
211     'omega' => q|$\omega$|, # greek small letter omega
212     # 'thetasym' => q||, # greek small letter theta symbol
213     # 'upsih' => q||, # greek upsilon with hook symbol
214     # 'piv' => q||, # greek pi symbol
215    
216     # General Punctuation
217     'bull' => q|\textbullet{}|, # bullet = black small circle
218     # bullet is NOT the same as bullet operator
219     'hellip' => q|\textellipsis{}|, # horizontal ellipsis = three dot leader
220     'prime' => q|\textquotesingle{}|, # prime = minutes = feet
221     'Prime' => q|\textquotedbl{}|, # double prime = seconds = inches
222     'oline' => q|\textasciimacron{}|, # overline = spacing overscore
223     'frasl' => q|\textfractionsolidus{}|, # fraction slash
224    
225     # Letterlike Symbols
226     'weierp' => q|$\wp$|, # script capital P = power set = Weierstrass p
227     'image' => q|$\Re$|, # blackletter capital I = imaginary part
228     'real' => q|$\Im$|, # blackletter capital R = real part symbol
229     'trade' => q|\texttrademark{}|, # trade mark sign
230     # 'alefsym' => q||, # alef symbol = first transfinite cardinal
231     # alef symbol is NOT the same as hebrew letter alef, although the same
232     # glyph could be used to depict both characters
233    
234     # Arrows
235     'larr' => q|\textleftarrow{}|, # leftwards arrow
236     'uarr' => q|\textuparrow{}|, # upwards arrow
237     'rarr' => q|\textrightarrow{}|, # rightwards arrow
238     'darr' => q|\textdownarrow{}|, # downwards arrow
239     'harr' => q|$\leftrightarrow$|, # left right arrow
240     # 'crarr' => q||, # downwards arrow with corner leftwards = carriage return
241     'lArr' => q|$\Leftarrow$|, # leftwards double arrow
242     # ISO 10646 does not say that lArr is the same as the 'is implied by'
243     # arrow but also does not have any other character for that function. So
244     # lArr can be used for 'is implied by' as ISOtech suggests
245     'uArr' => q|$\Uparrow$|, # upwards double arrow
246     'rArr' => q|$\Rightarrow$|, # rightwards double arrow
247     # ISO 10646 does not say this is the 'implies' character but does not
248     # have another character with this function so ? rArr can be used for
249     # 'implies' as ISOtech suggests
250     'dArr' => q|$\Downarrow$|, # downwards double arrow
251     'hArr' => q|$\Leftrightarrow$|, # left right double arrow
252    
253     # Mathematical Operators.
254     # Some of these require the `amssymb' package.
255     'forall' => q|$\forall$|, # for all
256     'part' => q|$\partial$|, # partial differential
257     'exist' => q|$\exists$|, # there exists
258     'empty' => q|$\emptyset$|, # empty set = null set = diameter
259     'nabla' => q|$\nabla$|, # nabla = backward difference
260     'isin' => q|$\in$|, # element of
261     'notin' => q|$\notin$|, # not an element of
262     'ni' => q|$\ni$|, # contains as member
263     'prod' => q|$\prod$|, # n-ary product = product sign
264     # prod is NOT the same character as 'greek capital letter pi' though the
265     # same glyph might be used for both
266     'sum' => q|$\sum$|, # n-ary sumation
267     # sum is NOT the same character as 'greek capital letter sigma' though
268     # the same glyph might be used for both
269     'minus' => q|$-$|, # minus sign
270     'lowast' => q|$\ast$|, # asterisk operator
271     'radic' => q|$\surd$|, # square root = radical sign
272     'prop' => q|$\propto$|, # proportional to
273     'infin' => q|$\infty$|, # infinity
274     'ang' => q|$\angle$|, # angle
275     'and' => q|$\wedge$|, # logical and = wedge
276     'or' => q|$\vee$|, # logical or = vee
277     'cap' => q|$\cap$|, # intersection = cap
278     'cup' => q|$\cup$|, # union = cup
279     'int' => q|$\int$|, # integral
280     'there4' => q|$\therefore$|, # therefore
281     'sim' => q|$\sim$|, # tilde operator = varies with = similar to
282     # tilde operator is NOT the same character as the tilde
283     'cong' => q|$\cong$|, # approximately equal to
284     'asymp' => q|$\asymp$|, # almost equal to = asymptotic to
285     'ne' => q|$\neq$|, # not equal to
286     'equiv' => q|$\equiv$|, # identical to
287     'le' => q|$\leq$|, # less-than or equal to
288     'ge' => q|$\geq$|, # greater-than or equal to
289     'sub' => q|$\subset$|, # subset of
290     'sup' => q|$\supset$|, # superset of
291     # note that nsup, 'not a superset of' is not covered by the Symbol font
292     # encoding and is not included.
293     'nsub' => q|$\not\subset$|, # not a subset of
294     'sube' => q|$\subseteq$|, # subset of or equal to
295     'supe' => q|$\supseteq$|, # superset of or equal to
296     'oplus' => q|$\oplus$|, # circled plus = direct sum
297     'otimes' => q|$\otimes$|, # circled times = vector product
298     'perp' => q|$\perp$|, # up tack = orthogonal to = perpendicular
299     'sdot' => q|$\cdot$|, # dot operator
300     # dot operator is NOT the same character as middle dot
301    
302     # Miscellaneous Technical
303     'lceil' => q|$\lceil$|, # left ceiling = apl upstile
304     'rceil' => q|$\rceil$|, # right ceiling
305     'lfloor' => q|$\lfloor$|, # left floor = apl downstile
306     'rfloor' => q|$\rfloor$|, # right floor
307     'lang' => q|$\langle$|, # left-pointing angle bracket = bra
308     # lang is NOT the same character as 'less than' or 'single left-pointing
309     # angle quotation mark'
310     'rang' => q|$\rangle$|, # right-pointing angle bracket = ket
311     # rang is NOT the same character as 'greater than' or 'single
312     # right-pointing angle quotation mark'
313    
314     # Geometric Shapes
315     'loz' => q|$\lozenge$|, # lozenge
316    
317     # Miscellaneous Symbols
318     'spades' => q|$\spadesuit$|, # black spade suit
319     'clubs' => q|$\clubsuit$|, # black club suit = shamrock
320     'hearts' => q|$\heartsuit$|, # black heart suit = valentine
321     'diams' => q|$\diamondsuit$|, # black diamond suit
322    
323     # C0 Controls and Basic Latin
324     'quot' => q|"|, # quotation mark = APL quote ["]
325     'amp' => q|\&|, # ampersand
326     'lt' => q|<|, # less-than sign
327     'gt' => q|>|, # greater-than sign
328     'OElig' => q|\OE{}|, # latin capital ligature OE
329     'oelig' => q|\oe{}|, # latin small ligature oe
330     'Scaron' => q|\v{S}|, # latin capital letter S with caron
331     'scaron' => q|\v{s}|, # latin small letter s with caron
332     'Yuml' => q|\"Y|, # latin capital letter Y with diaeresis
333     'circ' => q|\textasciicircum{}|, # modifier letter circumflex accent
334     'tilde' => q|\textasciitilde{}|, # small tilde
335     'ensp' => q|\phantom{n}|, # en space
336     'emsp' => q|\hspace{1em}|, # em space
337     'thinsp' => q|\,|, # thin space
338     'zwnj' => q|{}|, # zero width non-joiner
339     # 'zwj' => q||, # zero width joiner
340     # 'lrm' => q||, # left-to-right mark
341     # 'rlm' => q||, # right-to-left mark
342     'ndash' => q|--|, # en dash
343     'mdash' => q|---|, # em dash
344     'lsquo' => q|\textquoteleft{}|, # left single quotation mark
345     'rsquo' => q|\textquoteright{}|, # right single quotation mark
346     'sbquo' => q|\quotesinglbase{}|, # single low-9 quotation mark
347     'ldquo' => q|\textquotedblleft{}|, # left double quotation mark
348     'rdquo' => q|\textquotedblright{}|, # right double quotation mark
349     'bdquo' => q|\quotedblbase{}|, # double low-9 quotation mark
350     'dagger' => q|\textdagger{}|, # dagger
351     'Dagger' => q|\textdaggerdbl{}|, # double dagger
352     'permil' => q|\textperthousand{}|, # per mille sign
353     'lsaquo' => q|\guilsinglleft{}|, # single left-pointing angle quotation mark
354     'rsaquo' => q|\guilsinglright{}|, # single right-pointing angle quotation mark
355     'euro' => q|\texteuro{}|, # euro sign
356     );
357    
358     =head1 OBJECT METHODS
359    
360     The following methods are provided in this module. Methods inherited
361     from C<Pod::Select> are not described in the public interface.
362    
363     =over 4
364    
365     =begin __PRIVATE__
366    
367     =item C<initialize>
368    
369     Initialise the object. This method is subclassed from C<Pod::Parser>.
370     The base class method is invoked. This method defines the default
371     behaviour of the object unless overridden by supplying arguments to
372     the constructor.
373    
374     Internal settings are defaulted as well as the public instance data.
375     Internal hash values are accessed directly (rather than through
376     a method) and start with an underscore.
377    
378     This method should not be invoked by the user directly.
379    
380     =end __PRIVATE__
381    
382     =cut
383    
384    
385    
386     # - An array for nested lists
387    
388     # Arguments have already been read by this point
389    
390     sub initialize {
391     my $self = shift;
392    
393     # print Dumper($self);
394    
395     # Internals
396     $self->{_Lists} = []; # For nested lists
397     $self->{_suppress_all_para} = 0; # For =begin blocks
398     $self->{_dont_modify_any_para}=0; # For =begin blocks
399     $self->{_CURRENT_HEAD1} = ''; # Name of current HEAD1 section
400    
401     # Options - only initialise if not already set
402    
403     # Cause the '=head1 NAME' field to be treated specially
404     # The contents of the NAME paragraph will be converted
405     # to a section title. All subsequent =head1 will be converted
406     # to =head2 and down. Will not affect =head1's prior to NAME
407     # Assumes: 'Module - purpose' format
408     # Also creates a purpose field
409     # The name is used for Labeling of the subsequent subsections
410     $self->{ReplaceNAMEwithSection} = 0
411     unless exists $self->{ReplaceNAMEwithSection};
412     $self->{AddPreamble} = 1 # make full latex document
413     unless exists $self->{AddPreamble};
414     $self->{StartWithNewPage} = 0 # Start new page for pod section
415     unless exists $self->{StartWithNewPage};
416     $self->{TableOfContents} = 0 # Add table of contents
417     unless exists $self->{TableOfContents}; # only relevent if AddPreamble=1
418     $self->{AddPostamble} = 1 # Add closing latex code at end
419     unless exists $self->{AddPostamble}; # effectively end{document} and index
420     $self->{MakeIndex} = 1 # Add index (only relevant AddPostamble
421     unless exists $self->{MakeIndex}; # and AddPreamble)
422    
423     $self->{UniqueLabels} = 1 # Use label unique for each pod
424     unless exists $self->{UniqueLabels}; # either based on the filename
425     # or supplied
426    
427     # Control the level of =head1. default is \section
428     #
429     $self->{Head1Level} = 1 # Offset in latex sections
430     unless exists $self->{Head1Level}; # 0 is chapter, 2 is subsection
431    
432     # Control at which level numbering of sections is turned off
433     # ie subsection becomes subsection*
434     # The numbering is relative to the latex sectioning commands
435     # and is independent of Pod heading level
436     # default is to number \section but not \subsection
437     $self->{LevelNoNum} = 2
438     unless exists $self->{LevelNoNum};
439    
440     # Label to be used as prefix to all internal section names
441     # If not defined will attempt to derive it from the filename
442     # This can not happen when running parse_from_filehandle though
443     # hence the ability to set the label externally
444     # The label could then be Pod::Parser_DESCRIPTION or somesuch
445    
446     $self->{Label} = undef # label to be used as prefix
447     unless exists $self->{Label}; # to all internal section names
448    
449     # These allow the caller to add arbritrary latex code to
450     # start and end of document. AddPreamble and AddPostamble are ignored
451     # if these are set.
452     # Also MakeIndex and TableOfContents are also ignored.
453     $self->{UserPreamble} = undef # User supplied start (AddPreamble =1)
454     unless exists $self->{Label};
455     $self->{UserPostamble} = undef # Use supplied end (AddPostamble=1)
456     unless exists $self->{Label};
457    
458     # Run base initialize
459     $self->SUPER::initialize;
460    
461     }
462    
463     =back
464    
465     =head2 Data Accessors
466    
467     The following methods are provided for accessing instance data. These
468     methods should be used for accessing configuration parameters rather
469     than assuming the object is a hash.
470    
471     Default values can be supplied by using these names as keys to a hash
472     of arguments when using the C<new()> constructor.
473    
474     =over 4
475    
476     =item B<AddPreamble>
477    
478     Logical to control whether a C<latex> preamble is to be written.
479     If true, a valid C<latex> preamble is written before the pod data is written.
480     This is similar to:
481    
482     \documentclass{article}
483     \usepackage[T1]{fontenc}
484     \usepackage{textcomp}
485     \begin{document}
486    
487     but will be more complicated if table of contents and indexing are required.
488     Can be used to set or retrieve the current value.
489    
490     $add = $parser->AddPreamble();
491     $parser->AddPreamble(1);
492    
493     If used in conjunction with C<AddPostamble> a full latex document will
494     be written that could be immediately processed by C<latex>.
495    
496     For some pod escapes it may be necessary to include the amsmath
497     package. This is not yet added to the preamble automaatically.
498    
499     =cut
500    
501     sub AddPreamble {
502     my $self = shift;
503     if (@_) {
504     $self->{AddPreamble} = shift;
505     }
506     return $self->{AddPreamble};
507     }
508    
509     =item B<AddPostamble>
510    
511     Logical to control whether a standard C<latex> ending is written to the output
512     file after the document has been processed.
513     In its simplest form this is simply:
514    
515     \end{document}
516    
517     but can be more complicated if a index is required.
518     Can be used to set or retrieve the current value.
519    
520     $add = $parser->AddPostamble();
521     $parser->AddPostamble(1);
522    
523     If used in conjunction with C<AddPreaamble> a full latex document will
524     be written that could be immediately processed by C<latex>.
525    
526     =cut
527    
528     sub AddPostamble {
529     my $self = shift;
530     if (@_) {
531     $self->{AddPostamble} = shift;
532     }
533     return $self->{AddPostamble};
534     }
535    
536     =item B<Head1Level>
537    
538     The C<latex> sectioning level that should be used to correspond to
539     a pod C<=head1> directive. This can be used, for example, to turn
540     a C<=head1> into a C<latex> C<subsection>. This should hold a number
541     corresponding to the required position in an array containing the
542     following elements:
543    
544     [0] chapter
545     [1] section
546     [2] subsection
547     [3] subsubsection
548     [4] paragraph
549     [5] subparagraph
550    
551     Can be used to set or retrieve the current value:
552    
553     $parser->Head1Level(2);
554     $sect = $parser->Head1Level;
555    
556     Setting this number too high can result in sections that may not be reproducible
557     in the expected way. For example, setting this to 4 would imply that C<=head3>
558     do not have a corresponding C<latex> section (C<=head1> would correspond to
559     a C<paragraph>).
560    
561     A check is made to ensure that the supplied value is an integer in the
562     range 0 to 5.
563    
564     Default is for a value of 1 (i.e. a C<section>).
565    
566     =cut
567    
568     sub Head1Level {
569     my $self = shift;
570     if (@_) {
571     my $arg = shift;
572     if ($arg =~ /^\d$/ && $arg <= $#LatexSections) {
573     $self->{Head1Level} = $arg;
574     } else {
575     carp "Head1Level supplied ($arg) must be integer in range 0 to ".$#LatexSections . "- Ignoring\n";
576     }
577     }
578     return $self->{Head1Level};
579     }
580    
581     =item B<Label>
582    
583     This is the label that is prefixed to all C<latex> label and index
584     entries to make them unique. In general, pods have similarly titled
585     sections (NAME, DESCRIPTION etc) and a C<latex> label will be multiply
586     defined if more than one pod document is to be included in a single
587     C<latex> file. To overcome this, this label is prefixed to a label
588     whenever a label is required (joined with an underscore) or to an
589     index entry (joined by an exclamation mark which is the normal index
590     separator). For example, C<\label{text}> becomes C<\label{Label_text}>.
591    
592     Can be used to set or retrieve the current value:
593    
594     $label = $parser->Label;
595     $parser->Label($label);
596    
597     This label is only used if C<UniqueLabels> is true.
598     Its value is set automatically from the C<NAME> field
599     if C<ReplaceNAMEwithSection> is true. If this is not the case
600     it must be set manually before starting the parse.
601    
602     Default value is C<undef>.
603    
604     =cut
605    
606     sub Label {
607     my $self = shift;
608     if (@_) {
609     $self->{Label} = shift;
610     }
611     return $self->{Label};
612     }
613    
614     =item B<LevelNoNum>
615    
616     Control the point at which C<latex> section numbering is turned off.
617     For example, this can be used to make sure that C<latex> sections
618     are numbered but subsections are not.
619    
620     Can be used to set or retrieve the current value:
621    
622     $lev = $parser->LevelNoNum;
623     $parser->LevelNoNum(2);
624    
625     The argument must be an integer between 0 and 5 and is the same as the
626     number described in C<Head1Level> method description. The number has
627     nothing to do with the pod heading number, only the C<latex> sectioning.
628    
629     Default is 2. (i.e. C<latex> subsections are written as C<subsection*>
630     but sections are numbered).
631    
632     =cut
633    
634     sub LevelNoNum {
635     my $self = shift;
636     if (@_) {
637     $self->{LevelNoNum} = shift;
638     }
639     return $self->{LevelNoNum};
640     }
641    
642     =item B<MakeIndex>
643    
644     Controls whether C<latex> commands for creating an index are to be inserted
645     into the preamble and postamble
646    
647     $makeindex = $parser->MakeIndex;
648     $parser->MakeIndex(0);
649    
650     Irrelevant if both C<AddPreamble> and C<AddPostamble> are false (or equivalently,
651     C<UserPreamble> and C<UserPostamble> are set).
652    
653     Default is for an index to be created.
654    
655     =cut
656    
657     sub MakeIndex {
658     my $self = shift;
659     if (@_) {
660     $self->{MakeIndex} = shift;
661     }
662     return $self->{MakeIndex};
663     }
664    
665     =item B<ReplaceNAMEwithSection>
666    
667     This controls whether the C<NAME> section in the pod is to be translated
668     literally or converted to a slightly modified output where the section
669     name is the pod name rather than "NAME".
670    
671     If true, the pod segment
672    
673     =head1 NAME
674    
675     pod::name - purpose
676    
677     =head1 SYNOPSIS
678    
679     is converted to the C<latex>
680    
681     \section{pod::name\label{pod_name}\index{pod::name}}
682    
683     Purpose
684    
685     \subsection*{SYNOPSIS\label{pod_name_SYNOPSIS}%
686     \index{pod::name!SYNOPSIS}}
687    
688     (dependent on the value of C<Head1Level> and C<LevelNoNum>). Note that
689     subsequent C<head1> directives translate to subsections rather than
690     sections and that the labels and index now include the pod name (dependent
691     on the value of C<UniqueLabels>).
692    
693     The C<Label> is set from the pod name regardless of any current value
694     of C<Label>.
695    
696     $mod = $parser->ReplaceNAMEwithSection;
697     $parser->ReplaceNAMEwithSection(0);
698    
699     Default is to translate the pod literally.
700    
701     =cut
702    
703     sub ReplaceNAMEwithSection {
704     my $self = shift;
705     if (@_) {
706     $self->{ReplaceNAMEwithSection} = shift;
707     }
708     return $self->{ReplaceNAMEwithSection};
709     }
710    
711     =item B<StartWithNewPage>
712    
713     If true, each pod translation will begin with a C<latex>
714     C<\clearpage>.
715    
716     $parser->StartWithNewPage(1);
717     $newpage = $parser->StartWithNewPage;
718    
719     Default is false.
720    
721     =cut
722    
723     sub StartWithNewPage {
724     my $self = shift;
725     if (@_) {
726     $self->{StartWithNewPage} = shift;
727     }
728     return $self->{StartWithNewPage};
729     }
730    
731     =item B<TableOfContents>
732    
733     If true, a table of contents will be created.
734     Irrelevant if C<AddPreamble> is false or C<UserPreamble>
735     is set.
736    
737     $toc = $parser->TableOfContents;
738     $parser->TableOfContents(1);
739    
740     Default is false.
741    
742     =cut
743    
744     sub TableOfContents {
745     my $self = shift;
746     if (@_) {
747     $self->{TableOfContents} = shift;
748     }
749     return $self->{TableOfContents};
750     }
751    
752     =item B<UniqueLabels>
753    
754     If true, the translator will attempt to make sure that
755     each C<latex> label or index entry will be uniquely identified
756     by prefixing the contents of C<Label>. This allows
757     multiple documents to be combined without clashing
758     common labels such as C<DESCRIPTION> and C<SYNOPSIS>
759    
760     $parser->UniqueLabels(1);
761     $unq = $parser->UniqueLabels;
762    
763     Default is true.
764    
765     =cut
766    
767     sub UniqueLabels {
768     my $self = shift;
769     if (@_) {
770     $self->{UniqueLabels} = shift;
771     }
772     return $self->{UniqueLabels};
773     }
774    
775     =item B<UserPreamble>
776    
777     User supplied C<latex> preamble. Added before the pod translation
778     data.
779    
780     If set, the contents will be prepended to the output file before the translated
781     data regardless of the value of C<AddPreamble>.
782     C<MakeIndex> and C<TableOfContents> will also be ignored.
783    
784     =cut
785    
786     sub UserPreamble {
787     my $self = shift;
788     if (@_) {
789     $self->{UserPreamble} = shift;
790     }
791     return $self->{UserPreamble};
792     }
793    
794     =item B<UserPostamble>
795    
796     User supplied C<latex> postamble. Added after the pod translation
797     data.
798    
799     If set, the contents will be prepended to the output file after the translated
800     data regardless of the value of C<AddPostamble>.
801     C<MakeIndex> will also be ignored.
802    
803     =cut
804    
805     sub UserPostamble {
806     my $self = shift;
807     if (@_) {
808     $self->{UserPostamble} = shift;
809     }
810     return $self->{UserPostamble};
811     }
812    
813     =begin __PRIVATE__
814    
815     =item B<Lists>
816    
817     Contains details of the currently active lists.
818     The array contains C<Pod::List> objects. A new C<Pod::List>
819     object is created each time a list is encountered and it is
820     pushed onto this stack. When the list context ends, it
821     is popped from the stack. The array will be empty if no
822     lists are active.
823    
824     Returns array of list information in list context
825     Returns array ref in scalar context
826    
827     =cut
828    
829    
830    
831     sub lists {
832     my $self = shift;
833     return @{ $self->{_Lists} } if wantarray();
834     return $self->{_Lists};
835     }
836    
837     =end __PRIVATE__
838    
839     =back
840    
841     =begin __PRIVATE__
842    
843     =head2 Subclassed methods
844    
845     The following methods override methods provided in the C<Pod::Select>
846     base class. See C<Pod::Parser> and C<Pod::Select> for more information
847     on what these methods require.
848    
849     =over 4
850    
851     =cut
852    
853     ######### END ACCESSORS ###################
854    
855     # Opening pod
856    
857     =item B<begin_pod>
858    
859     Writes the C<latex> preamble if requested. Only writes something
860     if AddPreamble is true. Writes a standard header unless a UserPreamble
861     is defined.
862    
863     =cut
864    
865     sub begin_pod {
866     my $self = shift;
867    
868     # Get the pod identification
869     # This should really come from the '=head1 NAME' paragraph
870    
871     my $infile = $self->input_file;
872     my $class = ref($self);
873     my $date = gmtime(time);
874    
875     # Comment message to say where this came from
876     my $comment = << "__TEX_COMMENT__";
877     %% Latex generated from POD in document $infile
878     %% Using the perl module $class
879     %% Converted on $date
880     __TEX_COMMENT__
881    
882     # Write the preamble
883     # If the caller has supplied one then we just use that
884    
885     my $preamble = '';
886    
887     if ($self->AddPreamble) {
888    
889     if (defined $self->UserPreamble) {
890    
891     $preamble = $self->UserPreamble;
892    
893     # Add the description of where this came from
894     $preamble .= "\n$comment\n%% Preamble supplied by user.\n\n";
895    
896     } else {
897    
898     # Write our own preamble
899    
900     # Code to initialise index making
901     # Use an array so that we can prepend comment if required
902     my @makeidx = (
903     '\usepackage{makeidx}',
904     '\makeindex',
905     );
906    
907     unless ($self->MakeIndex) {
908     foreach (@makeidx) {
909     $_ = '%% ' . $_;
910     }
911     }
912     my $makeindex = join("\n",@makeidx) . "\n";
913    
914     # Table of contents
915     my $tableofcontents = '\tableofcontents';
916    
917     $tableofcontents = '%% ' . $tableofcontents
918     unless $self->TableOfContents;
919    
920     # Roll our own
921     $preamble = << "__TEX_HEADER__";
922     \\documentclass{article}
923     \\usepackage[T1]{fontenc}
924     \\usepackage{textcomp}
925    
926     $comment
927    
928     $makeindex
929    
930     \\begin{document}
931    
932     $tableofcontents
933    
934     __TEX_HEADER__
935    
936     }
937     }
938    
939     # Write the header (blank if none)
940     $self->_output($preamble);
941    
942     # Start on new page if requested
943     $self->_output("\\clearpage\n") if $self->StartWithNewPage;
944    
945     }
946    
947    
948     =item B<end_pod>
949    
950     Write the closing C<latex> code. Only writes something if AddPostamble
951     is true. Writes a standard header unless a UserPostamble is defined.
952    
953     =cut
954    
955     sub end_pod {
956     my $self = shift;
957    
958     # End string
959     my $end = '';
960    
961     # Use the user version of the postamble if defined
962     if ($self->AddPostamble) {
963    
964     if (defined $self->UserPostamble) {
965     $end = $self->UserPostamble;
966    
967     } else {
968    
969     # Check for index
970     my $makeindex = '\printindex';
971    
972     $makeindex = '%% '. $makeindex unless $self->MakeIndex;
973    
974     $end = "$makeindex\n\n\\end{document}\n";
975     }
976     }
977    
978     $self->_output($end);
979    
980     }
981    
982     =item B<command>
983    
984     Process basic pod commands.
985    
986     =cut
987    
988     sub command {
989     my $self = shift;
990     my ($command, $paragraph, $line_num, $parobj) = @_;
991    
992     # return if we dont care
993     return if $command eq 'pod';
994    
995     # Store a copy of the raw text in case we are in a =for
996     # block and need to preserve the existing latex
997     my $rawpara = $paragraph;
998    
999     # Do the latex escapes
1000     $paragraph = $self->_replace_special_chars($paragraph);
1001    
1002     # Interpolate pod sequences in paragraph
1003     $paragraph = $self->interpolate($paragraph, $line_num);
1004     $paragraph =~ s/\s+$//;
1005    
1006     # Replace characters that can only be done after
1007     # interpolation of interior sequences
1008     $paragraph = $self->_replace_special_chars_late($paragraph);
1009    
1010     # Now run the command
1011     if ($command eq 'over') {
1012    
1013     $self->begin_list($paragraph, $line_num);
1014    
1015     } elsif ($command eq 'item') {
1016    
1017     $self->add_item($paragraph, $line_num);
1018    
1019     } elsif ($command eq 'back') {
1020    
1021     $self->end_list($line_num);
1022    
1023     } elsif ($command eq 'head1') {
1024    
1025     # Store the name of the section
1026     $self->{_CURRENT_HEAD1} = $paragraph;
1027    
1028     # Print it
1029     $self->head(1, $paragraph, $parobj);
1030    
1031     } elsif ($command eq 'head2') {
1032    
1033     $self->head(2, $paragraph, $parobj);
1034    
1035     } elsif ($command eq 'head3') {
1036    
1037     $self->head(3, $paragraph, $parobj);
1038    
1039     } elsif ($command eq 'head4') {
1040    
1041     $self->head(4, $paragraph, $parobj);
1042    
1043     } elsif ($command eq 'head5') {
1044    
1045     $self->head(5, $paragraph, $parobj);
1046    
1047     } elsif ($command eq 'head6') {
1048    
1049     $self->head(6, $paragraph, $parobj);
1050    
1051     } elsif ($command eq 'begin') {
1052    
1053     # pass through if latex
1054     if ($paragraph =~ /^latex/i) {
1055     # Make sure that subsequent paragraphs are not modfied before printing
1056     $self->{_dont_modify_any_para} = 1;
1057    
1058     } else {
1059     # Suppress all subsequent paragraphs unless
1060     # it is explcitly intended for latex
1061     $self->{_suppress_all_para} = 1;
1062     }
1063    
1064     } elsif ($command eq 'for') {
1065    
1066     # =for latex
1067     # some latex
1068    
1069     # With =for we will get the text for the full paragraph
1070     # as well as the format name.
1071     # We do not get an additional paragraph later on. The next
1072     # paragraph is not governed by the =for
1073    
1074     # The first line contains the format and the rest is the
1075     # raw code.
1076     my ($format, $chunk) = split(/\n/, $rawpara, 2);
1077    
1078     # If we have got some latex code print it out immediately
1079     # unmodified. Else do nothing.
1080     if ($format =~ /^latex/i) {
1081     # Make sure that next paragraph is not modfied before printing
1082     $self->_output( $chunk );
1083    
1084     }
1085    
1086     } elsif ($command eq 'end') {
1087    
1088     # Reset suppression
1089     $self->{_suppress_all_para} = 0;
1090     $self->{_dont_modify_any_para} = 0;
1091    
1092     } elsif ($command eq 'pod') {
1093    
1094     # Do nothing
1095    
1096     } else {
1097     carp "Command $command not recognised at line $line_num\n";
1098     }
1099    
1100     }
1101    
1102     =item B<verbatim>
1103    
1104     Verbatim text
1105    
1106     =cut
1107    
1108     sub verbatim {
1109     my $self = shift;
1110     my ($paragraph, $line_num, $parobj) = @_;
1111    
1112     # Expand paragraph unless in =begin block
1113     if ($self->{_dont_modify_any_para}) {
1114     # Just print as is
1115     $self->_output($paragraph);
1116    
1117     } else {
1118    
1119     return if $paragraph =~ /^\s+$/;
1120    
1121     # Clean trailing space
1122     $paragraph =~ s/\s+$//;
1123    
1124     # Clean tabs. Routine taken from Tabs.pm
1125     # by David Muir Sharnoff muir@idiom.com,
1126     # slightly modified by hsmyers@sdragons.com 10/22/01
1127     my @l = split("\n",$paragraph);
1128     foreach (@l) {
1129     1 while s/(^|\n)([^\t\n]*)(\t+)/
1130     $1. $2 . (" " x
1131     (8 * length($3)
1132     - (length($2) % 8)))
1133     /sex;
1134     }
1135     $paragraph = join("\n",@l);
1136     # End of change.
1137    
1138    
1139    
1140     $self->_output('\begin{verbatim}' . "\n$paragraph\n". '\end{verbatim}'."\n");
1141     }
1142     }
1143    
1144     =item B<textblock>
1145    
1146     Plain text paragraph.
1147    
1148     =cut
1149    
1150     sub textblock {
1151     my $self = shift;
1152     my ($paragraph, $line_num, $parobj) = @_;
1153    
1154     # print Dumper($self);
1155    
1156     # Expand paragraph unless in =begin block
1157     if ($self->{_dont_modify_any_para}) {
1158     # Just print as is
1159     $self->_output($paragraph);
1160    
1161     return;
1162     }
1163    
1164    
1165     # Escape latex special characters
1166     $paragraph = $self->_replace_special_chars($paragraph);
1167    
1168     # Interpolate interior sequences
1169     my $expansion = $self->interpolate($paragraph, $line_num);
1170     $expansion =~ s/\s+$//;
1171    
1172     # Escape special characters that can not be done earlier
1173     $expansion = $self->_replace_special_chars_late($expansion);
1174    
1175     # If we are replacing 'head1 NAME' with a section
1176     # we need to look in the paragraph and rewrite things
1177     # Need to make sure this is called only on the first paragraph
1178     # following 'head1 NAME' and not on subsequent paragraphs that may be
1179     # present.
1180     if ($self->{_CURRENT_HEAD1} =~ /^NAME/i && $self->ReplaceNAMEwithSection()) {
1181    
1182     # Strip white space from start and end
1183     $paragraph =~ s/^\s+//;
1184     $paragraph =~ s/\s$//;
1185    
1186     # Split the string into 2 parts
1187     my ($name, $purpose) = split(/\s+-\s+/, $expansion,2);
1188    
1189     # Now prevent this from triggering until a new head1 NAME is set
1190     $self->{_CURRENT_HEAD1} = '_NAME';
1191    
1192     # Might want to clear the Label() before doing this (CHECK)
1193    
1194     # Print the heading
1195     $self->head(1, $name, $parobj);
1196    
1197     # Set the labeling in case we want unique names later
1198     $self->Label( $self->_create_label( $name, 1 ) );
1199    
1200     # Raise the Head1Level by one so that subsequent =head1 appear
1201     # as subsections of the main name section unless we are already
1202     # at maximum [Head1Level() could check this itself - CHECK]
1203     $self->Head1Level( $self->Head1Level() + 1)
1204     unless $self->Head1Level == $#LatexSections;
1205    
1206     # Now write out the new latex paragraph
1207     $purpose = ucfirst($purpose);
1208     $self->_output("\n\n$purpose\n\n");
1209    
1210     } else {
1211     # Just write the output
1212     $self->_output("\n\n$expansion\n\n");
1213     }
1214    
1215     }
1216    
1217     =item B<interior_sequence>
1218    
1219     Interior sequence expansion
1220    
1221     =cut
1222    
1223     sub interior_sequence {
1224     my $self = shift;
1225    
1226     my ($seq_command, $seq_argument, $pod_seq) = @_;
1227    
1228     if ($seq_command eq 'B') {
1229     return "\\textbf{$seq_argument}";
1230    
1231     } elsif ($seq_command eq 'I') {
1232     return "\\textit{$seq_argument}";
1233    
1234     } elsif ($seq_command eq 'E') {
1235    
1236     # If it is simply a number
1237     if ($seq_argument =~ /^\d+$/) {
1238     return chr($seq_argument);
1239     # Look up escape in hash table
1240     } elsif (exists $HTML_Escapes{$seq_argument}) {
1241     return $HTML_Escapes{$seq_argument};
1242    
1243     } else {
1244     my ($file, $line) = $pod_seq->file_line();
1245     warn "Escape sequence $seq_argument not recognised at line $line of file $file\n";
1246     return;
1247     }
1248    
1249     } elsif ($seq_command eq 'Z') {
1250    
1251     # Zero width space
1252     return '{}';
1253    
1254     } elsif ($seq_command eq 'C') {
1255     return "\\texttt{$seq_argument}";
1256    
1257     } elsif ($seq_command eq 'F') {
1258     return "\\emph{$seq_argument}";
1259    
1260     } elsif ($seq_command eq 'S') {
1261     # non breakable spaces
1262     my $nbsp = '~';
1263    
1264     $seq_argument =~ s/\s/$nbsp/g;
1265     return $seq_argument;
1266    
1267     } elsif ($seq_command eq 'L') {
1268     my $link = new Pod::Hyperlink($seq_argument);
1269    
1270     # undef on failure
1271     unless (defined $link) {
1272     carp $@;
1273     return;
1274     }
1275    
1276     # Handle internal links differently
1277     my $type = $link->type;
1278     my $page = $link->page;
1279    
1280     if ($type eq 'section' && $page eq '') {
1281     # Use internal latex reference
1282     my $node = $link->node;
1283    
1284     # Convert to a label
1285     $node = $self->_create_label($node);
1286    
1287     return "\\S\\ref{$node}";
1288    
1289     } else {
1290     # Use default markup for external references
1291     # (although Starlink would use \xlabel)
1292     my $markup = $link->markup;
1293     my ($file, $line) = $pod_seq->file_line();
1294    
1295     return $self->interpolate($link->markup, $line);
1296     }
1297    
1298    
1299    
1300     } elsif ($seq_command eq 'P') {
1301     # Special markup for Pod::Hyperlink
1302     # Replace :: with / - but not sure if I want to do this
1303     # any more.
1304     my $link = $seq_argument;
1305     $link =~ s|::|/|g;
1306    
1307     my $ref = "\\emph{$seq_argument}";
1308     return $ref;
1309    
1310     } elsif ($seq_command eq 'Q') {
1311     # Special markup for Pod::Hyperlink
1312     return "\\textsf{$seq_argument}";
1313    
1314     } elsif ($seq_command eq 'X') {
1315     # Index entries
1316    
1317     # use \index command
1318     # I will let '!' go through for now
1319     # not sure how sub categories are handled in X<>
1320     my $index = $self->_create_index($seq_argument);
1321     return "\\index{$index}\n";
1322    
1323     } else {
1324     carp "Unknown sequence $seq_command<$seq_argument>";
1325     }
1326    
1327     }
1328    
1329     =back
1330    
1331     =head2 List Methods
1332    
1333     Methods used to handle lists.
1334    
1335     =over 4
1336    
1337     =item B<begin_list>
1338    
1339     Called when a new list is found (via the C<over> directive).
1340     Creates a new C<Pod::List> object and stores it on the
1341     list stack.
1342    
1343     $parser->begin_list($indent, $line_num);
1344    
1345     =cut
1346    
1347     sub begin_list {
1348     my $self = shift;
1349     my $indent = shift;
1350     my $line_num = shift;
1351    
1352     # Indicate that a list should be started for the next item
1353     # need to do this to work out the type of list
1354     push ( @{$self->lists}, new Pod::List(-indent => $indent,
1355     -start => $line_num,
1356     -file => $self->input_file,
1357     )
1358     );
1359    
1360     }
1361    
1362     =item B<end_list>
1363    
1364     Called when the end of a list is found (the C<back> directive).
1365     Pops the C<Pod::List> object off the stack of lists and writes
1366     the C<latex> code required to close a list.
1367    
1368     $parser->end_list($line_num);
1369    
1370     =cut
1371    
1372     sub end_list {
1373     my $self = shift;
1374     my $line_num = shift;
1375    
1376     unless (defined $self->lists->[-1]) {
1377     my $file = $self->input_file;
1378     warn "No list is active at line $line_num (file=$file). Missing =over?\n";
1379     return;
1380     }
1381    
1382     # What to write depends on list type
1383     my $type = $self->lists->[-1]->type;
1384    
1385     # Dont write anything if the list type is not set
1386     # iomplying that a list was created but no entries were
1387     # placed in it (eg because of a =begin/=end combination)
1388     $self->_output("\\end{$type}\n")
1389     if (defined $type && length($type) > 0);
1390    
1391     # Clear list
1392     pop(@{ $self->lists});
1393    
1394     }
1395    
1396     =item B<add_item>
1397    
1398     Add items to the list. The first time an item is encountered
1399     (determined from the state of the current C<Pod::List> object)
1400     the type of list is determined (ordered, unnumbered or description)
1401     and the relevant latex code issued.
1402    
1403     $parser->add_item($paragraph, $line_num);
1404    
1405     =cut
1406    
1407     sub add_item {
1408     my $self = shift;
1409     my $paragraph = shift;
1410     my $line_num = shift;
1411    
1412     unless (defined $self->lists->[-1]) {
1413     my $file = $self->input_file;
1414     warn "List has already ended by line $line_num of file $file. Missing =over?\n";
1415     # Replace special chars
1416     # $paragraph = $self->_replace_special_chars($paragraph);
1417     $self->_output("$paragraph\n\n");
1418     return;
1419     }
1420    
1421     # If paragraphs printing is turned off via =begin/=end or whatver
1422     # simply return immediately
1423     return if $self->{_suppress_all_para};
1424    
1425     # Check to see whether we are starting a new lists
1426     if (scalar($self->lists->[-1]->item) == 0) {
1427    
1428     # Examine the paragraph to determine what type of list
1429     # we have
1430     $paragraph =~ s/\s+$//;
1431     $paragraph =~ s/^\s+//;
1432    
1433     my $type;
1434     if (substr($paragraph, 0,1) eq '*') {
1435     $type = 'itemize';
1436     } elsif ($paragraph =~ /^\d/) {
1437     $type = 'enumerate';
1438     } else {
1439     $type = 'description';
1440     }
1441     $self->lists->[-1]->type($type);
1442    
1443     $self->_output("\\begin{$type}\n");
1444    
1445     }
1446    
1447     my $type = $self->lists->[-1]->type;
1448    
1449     if ($type eq 'description') {
1450     # Handle long items - long items do not wrap
1451     # If the string is longer than 40 characters we split
1452     # it into a real item header and some bold text.
1453     my $maxlen = 40;
1454     my ($hunk1, $hunk2) = $self->_split_delimited( $paragraph, $maxlen );
1455    
1456     # Print the first hunk
1457     $self->_output("\n\\item[{$hunk1}] ");
1458    
1459     # and the second hunk if it is defined
1460     if ($hunk2) {
1461     $self->_output("\\textbf{$hunk2}");
1462     } else {
1463     # Not there so make sure we have a new line
1464     $self->_output("\\mbox{}");
1465     }
1466    
1467     } else {
1468     # If the item was '* Something' or '\d+ something' we still need to write
1469     # out the something. Also allow 1) and 1.
1470     my $extra_info = $paragraph;
1471     $extra_info =~ s/^(\*|\d+[\.\)]?)\s*//;
1472     $self->_output("\n\\item $extra_info");
1473     }
1474    
1475     # Store the item name in the object. Required so that
1476     # we can tell if the list is new or not
1477     $self->lists->[-1]->item($paragraph);
1478    
1479     }
1480    
1481     =back
1482    
1483     =head2 Methods for headings
1484    
1485     =over 4
1486    
1487     =item B<head>
1488    
1489     Print a heading of the required level.
1490    
1491     $parser->head($level, $paragraph, $parobj);
1492    
1493     The first argument is the pod heading level. The second argument
1494     is the contents of the heading. The 3rd argument is a Pod::Paragraph
1495     object so that the line number can be extracted.
1496    
1497     =cut
1498    
1499     sub head {
1500     my $self = shift;
1501     my $num = shift;
1502     my $paragraph = shift;
1503     my $parobj = shift;
1504    
1505     # If we are replace 'head1 NAME' with a section
1506     # we return immediately if we get it
1507     return
1508     if ($self->{_CURRENT_HEAD1} =~ /^NAME/i && $self->ReplaceNAMEwithSection());
1509    
1510     # Create a label
1511     my $label = $self->_create_label($paragraph);
1512    
1513     # Create an index entry
1514     my $index = $self->_create_index($paragraph);
1515    
1516     # Work out position in the above array taking into account
1517     # that =head1 is equivalent to $self->Head1Level
1518    
1519     my $level = $self->Head1Level() - 1 + $num;
1520    
1521     # Warn if heading to large
1522     if ($num > $#LatexSections) {
1523     my $line = $parobj->file_line;
1524     my $file = $self->input_file;
1525     warn "Heading level too large ($level) for LaTeX at line $line of file $file\n";
1526     $level = $#LatexSections;
1527     }
1528    
1529     # Check to see whether section should be unnumbered
1530     my $star = ($level >= $self->LevelNoNum ? '*' : '');
1531    
1532     # Section
1533     $self->_output("\\" .$LatexSections[$level] .$star ."{$paragraph\\label{".$label ."}\\index{".$index."}}\n");
1534    
1535     }
1536    
1537    
1538     =back
1539    
1540     =end __PRIVATE__
1541    
1542     =begin __PRIVATE__
1543    
1544     =head2 Internal methods
1545    
1546     Internal routines are described in this section. They do not form part of the
1547     public interface. All private methods start with an underscore.
1548    
1549     =over 4
1550    
1551     =item B<_output>
1552    
1553     Output text to the output filehandle. This method must be always be called
1554     to output parsed text.
1555    
1556     $parser->_output($text);
1557    
1558     Does not write anything if a =begin is active that should be
1559     ignored.
1560    
1561     =cut
1562    
1563     sub _output {
1564     my $self = shift;
1565     my $text = shift;
1566    
1567     print { $self->output_handle } $text
1568     unless $self->{_suppress_all_para};
1569    
1570     }
1571    
1572    
1573     =item B<_replace_special_chars>
1574    
1575     Subroutine to replace characters that are special in C<latex>
1576     with the escaped forms
1577    
1578     $escaped = $parser->_replace_special_chars($paragraph);
1579    
1580     Need to call this routine before interior_sequences are munged but not
1581     if verbatim. It must be called before interpolation of interior
1582     sequences so that curly brackets and special latex characters inserted
1583     during interpolation are not themselves escaped. This means that < and
1584     > can not be modified here since the text still contains interior
1585     sequences.
1586    
1587     Special characters and the C<latex> equivalents are:
1588    
1589     } \}
1590     { \{
1591     _ \_
1592     $ \$
1593     % \%
1594     & \&
1595     \ $\backslash$
1596     ^ \^{}
1597     ~ \~{}
1598     # \#
1599    
1600     =cut
1601    
1602     sub _replace_special_chars {
1603     my $self = shift;
1604     my $paragraph = shift;
1605    
1606     # Replace a \ with $\backslash$
1607     # This is made more complicated because the dollars will be escaped
1608     # by the subsequent replacement. Easiest to add \backslash
1609     # now and then add the dollars
1610     $paragraph =~ s/\\/\\backslash/g;
1611    
1612     # Must be done after escape of \ since this command adds latex escapes
1613     # Replace characters that can be escaped
1614     $paragraph =~ s/([\$\#&%_{}])/\\$1/g;
1615    
1616     # Replace ^ characters with \^{} so that $^F works okay
1617     $paragraph =~ s/(\^)/\\$1\{\}/g;
1618    
1619     # Replace tilde (~) with \texttt{\~{}}
1620     $paragraph =~ s/~/\\texttt\{\\~\{\}\}/g;
1621    
1622     # Now add the dollars around each \backslash
1623     $paragraph =~ s/(\\backslash)/\$$1\$/g;
1624     return $paragraph;
1625     }
1626    
1627     =item B<_replace_special_chars_late>
1628    
1629     Replace special characters that can not be replaced before interior
1630     sequence interpolation. See C<_replace_special_chars> for a routine
1631     to replace special characters prior to interpolation of interior
1632     sequences.
1633    
1634     Does the following transformation:
1635    
1636     < $<$
1637     > $>$
1638     | $|$
1639    
1640    
1641     =cut
1642    
1643     sub _replace_special_chars_late {
1644     my $self = shift;
1645     my $paragraph = shift;
1646    
1647     # < and >
1648     $paragraph =~ s/(<|>)/\$$1\$/g;
1649    
1650     # Replace | with $|$
1651     $paragraph =~ s'\|'$|$'g;
1652    
1653    
1654     return $paragraph;
1655     }
1656    
1657    
1658     =item B<_create_label>
1659    
1660     Return a string that can be used as an internal reference
1661     in a C<latex> document (i.e. accepted by the C<\label> command)
1662    
1663     $label = $parser->_create_label($string)
1664    
1665     If UniqueLabels is true returns a label prefixed by Label()
1666     This can be suppressed with an optional second argument.
1667    
1668     $label = $parser->_create_label($string, $suppress);
1669    
1670     If a second argument is supplied (of any value including undef)
1671     the Label() is never prefixed. This means that this routine can
1672     be called to create a Label() without prefixing a previous setting.
1673    
1674     =cut
1675    
1676     sub _create_label {
1677     my $self = shift;
1678     my $paragraph = shift;
1679     my $suppress = (@_ ? 1 : 0 );
1680    
1681     # Remove latex commands
1682     $paragraph = $self->_clean_latex_commands($paragraph);
1683    
1684     # Remove non alphanumerics from the label and replace with underscores
1685     # want to protect '-' though so use negated character classes
1686     $paragraph =~ s/[^-:\w]/_/g;
1687    
1688     # Multiple underscores will look unsightly so remove repeats
1689     # This will also have the advantage of tidying up the end and
1690     # start of string
1691     $paragraph =~ s/_+/_/g;
1692    
1693     # If required need to make sure that the label is unique
1694     # since it is possible to have multiple pods in a single
1695     # document
1696     if (!$suppress && $self->UniqueLabels() && defined $self->Label) {
1697     $paragraph = $self->Label() .'_'. $paragraph;
1698     }
1699    
1700     return $paragraph;
1701     }
1702    
1703    
1704     =item B<_create_index>
1705    
1706     Similar to C<_create_label> except an index entry is created.
1707     If C<UniqueLabels> is true, the index entry is prefixed by
1708     the current C<Label> and an exclamation mark.
1709    
1710     $ind = $parser->_create_index($paragraph);
1711    
1712     An exclamation mark is used by C<makeindex> to generate
1713     sub-entries in an index.
1714    
1715     =cut
1716    
1717     sub _create_index {
1718     my $self = shift;
1719     my $paragraph = shift;
1720     my $suppress = (@_ ? 1 : 0 );
1721    
1722     # Remove latex commands
1723     $paragraph = $self->_clean_latex_commands($paragraph);
1724    
1725     # If required need to make sure that the index entry is unique
1726     # since it is possible to have multiple pods in a single
1727     # document
1728     if (!$suppress && $self->UniqueLabels() && defined $self->Label) {
1729     $paragraph = $self->Label() .'!'. $paragraph;
1730     }
1731    
1732     # Need to replace _ with space
1733     $paragraph =~ s/_/ /g;
1734    
1735     return $paragraph;
1736    
1737     }
1738    
1739     =item B<_clean_latex_commands>
1740    
1741     Removes latex commands from text. The latex command is assumed to be of the
1742     form C<\command{ text }>. "C<text>" is retained
1743    
1744     $clean = $parser->_clean_latex_commands($text);
1745    
1746     =cut
1747    
1748     sub _clean_latex_commands {
1749     my $self = shift;
1750     my $paragraph = shift;
1751    
1752     # Remove latex commands of the form \text{ }
1753     # and replace with the contents of the { }
1754     # need to make this non-greedy so that it can handle
1755     # "\text{a} and \text2{b}"
1756     # without converting it to
1757     # "a} and \text2{b"
1758     # This match will still get into trouble if \} is present
1759     # This is not vital since the subsequent replacement of non-alphanumeric
1760     # characters will tidy it up anyway
1761     $paragraph =~ s/\\\w+{(.*?)}/$1/g;
1762    
1763     return $paragraph
1764     }
1765    
1766     =item B<_split_delimited>
1767    
1768     Split the supplied string into two parts at approximately the
1769     specified word boundary. Special care is made to make sure that it
1770     does not split in the middle of some curly brackets.
1771    
1772     e.g. "this text is \textbf{very bold}" would not be split into
1773     "this text is \textbf{very" and " bold".
1774    
1775     ($hunk1, $hunk2) = $self->_split_delimited( $para, $length);
1776    
1777     The length indicates the maximum length of hunk1.
1778    
1779     =cut
1780    
1781     # initially Supplied by hsmyers@sdragons.com
1782     # 10/25/01, utility to split \hbox
1783     # busting lines. Reformatted by TimJ to match module style.
1784     sub _split_delimited {
1785     my $self = shift;
1786     my $input = shift;
1787     my $limit = shift;
1788    
1789     # Return immediately if already small
1790     return ($input, '') if length($input) < $limit;
1791    
1792     my @output;
1793     my $s = '';
1794     my $t = '';
1795     my $depth = 0;
1796     my $token;
1797    
1798     $input =~ s/\n/ /gm;
1799     $input .= ' ';
1800     foreach ( split ( //, $input ) ) {
1801     $token .= $_;
1802     if (/\{/) {
1803     $depth++;
1804     } elsif ( /}/ ) {
1805     $depth--;
1806     } elsif ( / / and $depth == 0) {
1807     push @output, $token if ( $token and $token ne ' ' );
1808     $token = '';
1809     }
1810     }
1811    
1812     foreach (@output) {
1813     if (length($s) < $limit) {
1814     $s .= $_;
1815     } else {
1816     $t .= $_;
1817     }
1818     }
1819    
1820     # Tidy up
1821     $s =~ s/\s+$//;
1822     $t =~ s/\s+$//;
1823     return ($s,$t);
1824     }
1825    
1826     =back
1827    
1828     =end __PRIVATE__
1829    
1830     =head1 NOTES
1831    
1832     Compatible with C<latex2e> only. Can not be used with C<latex> v2.09
1833     or earlier.
1834    
1835     A subclass of C<Pod::Select> so that specific pod sections can be
1836     converted to C<latex> by using the C<select> method.
1837    
1838     Some HTML escapes are missing and many have not been tested.
1839    
1840     =head1 SEE ALSO
1841    
1842     L<Pod::Parser>, L<Pod::Select>, L<pod2latex>
1843    
1844     =head1 AUTHORS
1845    
1846     Tim Jenness E<lt>tjenness@cpan.orgE<gt>
1847    
1848     Bug fixes and improvements have been received from: Simon Cozens
1849     E<lt>simon@cozens.netE<gt>, Mark A. Hershberger
1850     E<lt>mah@everybody.orgE<gt>, Marcel Grunauer
1851     E<lt>marcel@codewerk.comE<gt>, Hugh S Myers
1852     E<lt>hsmyers@sdragons.comE<gt>, Peter J Acklam
1853     E<lt>jacklam@math.uio.noE<gt>, Sudhi Herle E<lt>sudhi@herle.netE<gt>,
1854     Ariel Scolnicov E<lt>ariels@compugen.co.ilE<gt>,
1855     Adriano Rodrigues Ferreira E<lt>ferreira@triang.com.brE<gt> and
1856     R. de Vries E<lt>r.de.vries@dutchspace.nlE<gt>.
1857    
1858    
1859     =head1 COPYRIGHT
1860    
1861     Copyright (C) 2000-2004 Tim Jenness. All Rights Reserved.
1862    
1863     This program is free software; you can redistribute it and/or modify
1864     it under the same terms as Perl itself.
1865    
1866     =begin __PRIVATE__
1867    
1868     =head1 REVISION
1869    
1870     $Id: LaTeX.pm,v 1.19 2004/12/30 01:40:44 timj Exp $
1871    
1872     =end __PRIVATE__
1873    
1874     =cut
1875    
1876     1;