[ Index ] |
PHP Cross Reference of Unnamed Project |
[Summary view] [Print] [Text view]
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;
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Tue Mar 17 22:47:18 2015 | Cross-referenced by PHPXref 0.7.1 |