home *** CD-ROM | disk | FTP | other *** search
/ PC World 2005 December (Special) / PCWorld_2005-12_Special_cd.bin / Bezpecnost / lsti / lsti.exe / framework-2.5.exe / LaTeX.pm < prev    next >
Text File  |  2005-01-27  |  59KB  |  1,876 lines

  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.56';
  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> and
  1855. Adriano Rodrigues Ferreira E<lt>ferreira@triang.com.brE<gt>.
  1856.  
  1857.  
  1858. =head1 COPYRIGHT
  1859.  
  1860. Copyright (C) 2000-2004 Tim Jenness. All Rights Reserved.
  1861.  
  1862. This program is free software; you can redistribute it and/or modify
  1863. it under the same terms as Perl itself.
  1864.  
  1865. =begin __PRIVATE__
  1866.  
  1867. =head1 REVISION
  1868.  
  1869. $Id: LaTeX.pm,v 1.18 2004/03/08 02:22:43 timj Exp $
  1870.  
  1871. =end __PRIVATE__
  1872.  
  1873. =cut
  1874.  
  1875. 1;
  1876.