[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

/se3-unattended/var/se3/unattended/install/linuxaux/opt/perl/lib/5.10.0/pod/ -> LaTeX.pm (source)

   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 automatically.
 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;


Generated: Tue Mar 17 22:47:18 2015 Cross-referenced by PHPXref 0.7.1