Module: MaRuKu::Out::Latex

Includes:
Maruku::Defaults, REXML
Included in:
MDElement
Defined in:
lib/maruku.rb,
lib/maruku/output/to_latex.rb,
lib/maruku/output/to_latex_entities.rb

Overview

Functions for exporting to Latex

Defined Under Namespace

Classes: LatexEntity

Constant Summary collapse

TexHeaders =
{
1=>'section',
2=>'subsection',
3=>'subsubsection',
4=>'paragraph'}
ENTITY_TABLE =
{}
XML_TABLE =

The following is a conversion chart for html elements, courtesy of text2html

"
<chars>
  <char num='913' name='Alpha' convertTo='$A$' />
  <char num='914' name='Beta' convertTo='$B$' />
  <char num='915' name='Gamma' convertTo='$\\Gamma$' />
  <char num='916' name='Delta' convertTo='$\\Delta$' />
  <char num='917' name='Epsilon' convertTo='$E$' />
  <char num='918' name='Zeta' convertTo='$Z$' />
  <char num='919' name='Eta' convertTo='$H$' />
  <char num='920' name='Theta' convertTo='$\\Theta$' />
  <char num='921' name='Iota' convertTo='$I$' />
  <char num='922' name='Kappa' convertTo='$K$' />
  <char num='923' name='Lambda' convertTo='$\\Lambda$' />
  <char num='924' name='Mu' convertTo='$M$' />
  <char num='925' name='Nu' convertTo='$N$' />
  <char num='926' name='Xi' convertTo='$\\Xi$' />
  <char num='927' name='Omicron' convertTo='$O$' />
  <char num='928' name='Pi' convertTo='$\\Pi$' />
  <char num='929' name='Rho' convertTo='$P$' />
  <char num='931' name='Sigma' convertTo='$\\Sigma$' />
  <char num='932' name='Tau' convertTo='$T$' />
  <char num='933' name='Upsilon' convertTo='$Y$' />
  <char num='934' name='Phi' convertTo='$\\Phi$' />
  <char num='935' name='Chi' convertTo='$X$' />
  <char num='936' name='Psi' convertTo='$\\Psi$' />
  <char num='937' name='Omega' convertTo='$\\Omega$' />
  <char num='945' name='alpha' convertTo='$\\alpha$' />
  <char num='946' name='beta' convertTo='$\\beta$' />
  <char num='947' name='gamma' convertTo='$\\gamma$' />
  <char num='948' name='delta' convertTo='$\\delta$' />
  <char num='949' name='epsilon' convertTo='$\\epsilon$' />
  <char num='950' name='zeta' convertTo='$\\zeta$' />
  <char num='951' name='eta' convertTo='$\\eta$' />
  <char num='952' name='theta' convertTo='$\\theta$' />
  <char num='953' name='iota' convertTo='$\\iota$' />
  <char num='954' name='kappa' convertTo='$\\kappa$' />
  <char num='955' name='lambda' convertTo='$\\lambda$' />
  <char num='956' name='mu' convertTo='$\\mu$' />

  <char num='957' name='nu' convertTo='$\\nu$' />
  <char num='958' name='xi' convertTo='$\\xi$' />
  <char num='959' name='omicron' convertTo='$o$' />
  <char num='960' name='pi' convertTo='$\\pi$' />
  <char num='961' name='rho' convertTo='$\\rho$' />
  <char num='963' name='sigma' convertTo='$\\sigma$' />
  <char num='964' name='tau' convertTo='$\\tau$' />
  <char num='965' name='upsilon' convertTo='$\\upsilon$' />
  <char num='966' name='phi' convertTo='$\\phi$' />

  <char num='967' name='chi' convertTo='$\\chi$' />
  <char num='968' name='psi' convertTo='$\\psi$' />
  <char num='969' name='omega' convertTo='$\\omega$' />
  <char num='962' name='sigmaf' convertTo='$\\varsigma$' />
  <char num='977' name='thetasym' convertTo='$\\vartheta$' />
  <char num='982' name='piv' convertTo='$\\varpi$' />
  <char num='8230' name='hellip' convertTo='\\ldots' />
  <char num='8242' name='prime' convertTo='$\\prime$' />
  <char num='8254' name='oline' convertTo='-' />

  <char num='8260' name='frasl' convertTo='/' />
  <char num='8472' name='weierp' convertTo='$\\wp$' />
  <char num='8465' name='image' convertTo='$\\Im$' />
  <char num='8476' name='real' convertTo='$\\Re$' />
  <char num='8501' name='alefsym' convertTo='$\\aleph$' />
  <char num='8226' name='bull' convertTo='$\\bullet$' />
  <char num='8482' name='trade' convertTo='$^{\\rm TM}$' /> <!-- \texttrademark -->
  <char num='8592' name='larr' convertTo='$\\leftarrow$' />

  <char num='8594' name='rarr' convertTo='$\\rightarrow$' />
  <char num='8593' name='uarr' convertTo='$\\uparrow$' />
  <char num='8595' name='darr' convertTo='$\\downarrow$' />
  <char num='8596' name='harr' convertTo='$\\leftrightarrow$' />
  <char num='8629' name='crarr' convertTo='$\\hookleftarrow$' />
  <char num='8657' name='uArr' convertTo='$\\Uparrow$' />
  <char num='8659' name='dArr' convertTo='$\\Downarrow$' />
  <char num='8656' name='lArr' convertTo='$\\Leftarrow$' />
  <char num='8658' name='rArr' convertTo='$\\Rightarrow$' />

  <char num='8660' name='hArr' convertTo='$\\Leftrightarrow$' />
  <char num='8704' name='forall' convertTo='$\\forall$' />
  <char num='8706' name='part' convertTo='$\\partial$' />
  <char num='8707' name='exist' convertTo='$\\exists$' />
  <char num='8709' name='empty' convertTo='$\\emptyset$' />
  <char num='8711' name='nabla' convertTo='$\\nabla$' />
  <char num='8712' name='isin' convertTo='$\\in$' />
  <char num='8715' name='ni' convertTo='$\\ni$' />
  <char num='8713' name='notin' convertTo='$\\notin$' />

  <char num='8721' name='sum' convertTo='$\\sum$' />
  <char num='8719' name='prod' convertTo='$\\prod$' />
  <char num='8722' name='minus' convertTo='$-$' />
  <char num='8727' name='lowast' convertTo='$\\ast$' />
  <char num='8730' name='radic' convertTo='$\\surd$' />
  <char num='8733' name='prop' convertTo='$\\propto$' />
  <char num='8734' name='infin' convertTo='$\\infty$' />
  <char num='8736' name='ang' convertTo='$\\angle$' />
  <char num='8743' name='and' convertTo='$\\wedge$' />

  <char num='8744' name='or' convertTo='$\\vee$' />
  <char num='8745' name='cup' convertTo='$\\cup$' />
  <char num='8746' name='cap' convertTo='$\\cap$' />
  <char num='8747' name='int' convertTo='$\\int$' />
  <char num='8756' name='there4' convertTo='$\\therefore$' package='amssymb' /> <!-- only AMS -->
  <char num='8764' name='sim' convertTo='$\\sim$' />
  <char num='8776' name='asymp' convertTo='$\\approx$' />
  <char num='8773' name='cong' convertTo='$\\cong$' />

  <char num='8800' name='ne' convertTo='$\\neq$' />
  <char num='8801' name='equiv' convertTo='$\\equiv$' />
  <char num='8804' name='le' convertTo='$\\leq$' />
  <char num='8805' name='ge' convertTo='$\\geq$' />
  <char num='8834' name='sub' convertTo='$\\subset$' />
  <char num='8835' name='sup' convertTo='$\\supset$' />
<!--	  <char num='8838' name='sube' convertTo='$\\subseteq$' />-->
  <char num='8839' name='supe' convertTo='$\\supseteq$' />
<!--	  <char num='8836' name='nsub' convertTo='$\\nsubset$'  /> <!-- only AMS -->

  <char num='8853' name='oplus' convertTo='$\\oplus$' />
  <char num='8855' name='otimes' convertTo='$\\otimes$' />
  <char num='8869' name='perp' convertTo='$\\perp$' />
  <char num='8901' name='sdot' convertTo='$\\cdot$' />
  <char num='8968' name='rceil' convertTo='$\\rceil$' />
  <char num='8969' name='lceil' convertTo='$\\lceil$' />
  <char num='8970' name='lfloor' convertTo='$\\lfloor$' />
  <char num='8971' name='rfloor' convertTo='$\\rfloor$' />
  <char num='9001' name='rang' convertTo='$\\rangle$' />

  <char num='9002' name='lang' convertTo='$\\langle$' />
  <char num='9674' name='loz' convertTo='$\\lozenge$' package='amssymb' /> <!-- only AMS -->
  <char num='9824' name='spades' convertTo='$\\spadesuit$' />
  <char num='9827' name='clubs' convertTo='$\\clubsuit$' />
  <char num='9829' name='hearts' convertTo='$\\heartsuit$' />
  <char num='9830' name='diams' convertTo='$\\diamondsuit$' />                                     
  <char num='38' name='amp' convertTo='\\@AMP' />    
<!--	  <char num='34' name='quot' convertTo='\\@DOUBLEQUOT' />  XXX -->
<char num='34' name='quot' convertTo='\"' /> 
<char num='39' name='apos' convertTo=\"'\" /> 
  <char num='169' name='copy' convertTo='\\copyright' />

  <char num='60' name='lt' convertTo='$@LT$' />
  <char num='62' name='gt' convertTo='$@GT$' />
  <char num='338' name='OElig' convertTo='\\OE' />
  <char num='339' name='oelig' convertTo='\\oe' />
  <char num='352' name='Scaron' convertTo='\\v{S}' />
  <char num='353' name='scaron' convertTo='\\v{s}' />
  <char num='376' name='Yuml' convertTo='\\\"Y' />
  <char num='710' name='circ' convertTo='\\textasciicircum' />
  <char num='732' name='tilde' convertTo='\\textasciitilde' />

  <char num='8211' name='ndash' convertTo='--' />
  <char num='8212' name='mdash' convertTo='---' />
  <char num='8216' name='lsquo' convertTo='`' />
  <char num='8217' name='rsquo' convertTo=\"'\" /> <!-- XXXX -->
  <char num='8220' name='ldquo' convertTo='``' />
  <char num='8221' name='rdquo' convertTo=\"''\" /> <!-- XXXX -->
  <char num='8224' name='dagger' convertTo='\\dag' />
  <char num='8225' name='Dagger' convertTo='\\ddag' />
  <char num='8240' name='permil' convertTo='\\permil' package='wasysym' /> <!-- wasysym package -->

  <char num='8364' name='euro' convertTo='\\euro' package='eurosym' /> <!-- eurosym package -->
  <char num='8249' name='lsaquo' convertTo='\\guilsinglleft' package='aeguill'/>
  <char num='8250' name='rsaquo' convertTo='\\guilsinglright' package='aeguill' />
<!--	  <char num='160' name='nbsp' convertTo='\\nolinebreak' />-->
  <char num='160' name='nbsp' convertTo='~' />
  <char num='161' name='iexcl' convertTo='\\textexclamdown' />
  <char num='163' name='pound' convertTo='\\pounds' />
  <char num='164' name='curren' convertTo='\\currency' package='wasysym' /> <!-- wasysym package -->
  <char num='165' name='yen' convertTo='\\textyen' package='textcomp'/> <!-- textcomp -->

  <char num='166' name='brvbar' convertTo='\\brokenvert' /> <!-- wasysym -->
  <char num='167' name='sect' convertTo='\\S' />
  <char num='171' name='laquo' convertTo='\\guillemotleft' package='aeguill'/>
  <char num='187' name='raquo' convertTo='\\guillemotright' package='aeguill'/>
  <char num='174' name='reg' convertTo='\\textregistered' />
  <char num='170' name='ordf' convertTo='\\textordfeminine' />
  <char num='172' name='not' convertTo='$\\neg$' />
<!--  <char num='176' name='deg' convertTo='$\\degree$' /> <!-- mathabx -->
  <char num='176' name='deg' convertTo='\\textdegree' package='textcomp'/>

  <char num='177' name='plusmn' convertTo='$\\pm$' />
  <char num='180' name='acute' convertTo='@QUOT' />
  <char num='181' name='micro' convertTo='$\\mu$' />
  <char num='182' name='para' convertTo='\\P' />
  <char num='183' name='middot' convertTo='$\\cdot$' />
  <char num='186' name='ordm' convertTo='\\textordmasculine' />
  <char num='162' name='cent' convertTo='\\cent' package='wasysym' /> 
  <char num='185' name='sup1' convertTo='$^1$' />

  <char num='178' name='sup2' convertTo='$^2$' />
  <char num='179' name='sup3' convertTo='$^3$' />
  <char num='189' name='frac12' convertTo='$\\frac{1}{2}$' />
  <char num='188' name='frac14' convertTo='$\\frac{1}{4}$' />
  <char num='190' name='frac34' convertTo='$\\frac{3}{4}$' />
  <char num='192' name='Agrave' convertTo='\\`A' />
  <char num='193' name='Aacute' convertTo='\\@QUOTA' />
  <char num='194' name='Acirc' convertTo='\\^A' />
  <char num='195' name='Atilde' convertTo='\\~A' />

  <char num='196' name='Auml' convertTo='\\@DOUBLEQUOTA' />
  <char num='197' name='Aring' convertTo='\\AA' />
  <char num='198' name='AElig' convertTo='\\AE' />
  <char num='199' name='Ccedil' convertTo='\\c{C}' />
  <char num='200' name='Egrave' convertTo='\\`E' />
  <char num='201' name='Eacute' convertTo='\\@QUOTE' />
  <char num='202' name='Ecirc' convertTo='\\^E' />
  <char num='203' name='Euml' convertTo='\\@DOUBLEQUOTE' />
  <char num='204' name='Igrave' convertTo='\\`I' />
  <char num='205' name='Iacute' convertTo='\\@QUOTI' />
  <char num='206' name='Icirc' convertTo='\\^I' />
  <char num='207' name='Iuml' convertTo='\\\"I' />
  <char num='208' name='ETH' convertTo='$\\eth$' /> <!-- AMS -->
  <char num='209' name='Ntilde' convertTo='\\~N' />    
  <char num='210' name='Ograve' convertTo='\\`O' />
  <char num='211' name='Oacute' convertTo='\\@QUOT O' />
  <char num='212' name='Ocirc' convertTo='\\^O' />
  <char num='213' name='Otilde' convertTo='\\~O' />
  <char num='214' name='Ouml' convertTo='\\@DOUBLEQUOTO' />
  <char num='215' name='times' convertTo='$\\times$' />
  <char num='216' name='Oslash' convertTo='\\O' />
  <char num='217' name='Ugrave' convertTo='\\`U' />
  <char num='218' name='Uacute' convertTo='\\@QUOTU' />
  <char num='219' name='Ucirc' convertTo='\\^U' />
  <char num='220' name='Uuml' convertTo='\\@DOUBLEQUOTU' />
  <char num='221' name='Yacute' convertTo='\\@QUOTY' />
  <char num='223' name='szlig' convertTo='\\ss' />
  <char num='224' name='agrave' convertTo='\\`a' />
  <char num='225' name='aacute' convertTo='\\@QUOTa' />
  <char num='226' name='acirc' convertTo='\\^a' />
  <char num='227' name='atilde' convertTo='\\~a' />
  <char num='228' name='auml' convertTo='\\@DOUBLEQUOTa' />
  <char num='229' name='aring' convertTo='\\aa' />
  <char num='230' name='aelig' convertTo='\\ae' />
  <char num='231' name='ccedil' convertTo='\\c{c}' />
  <char num='232' name='egrave' convertTo='\\`e' />
  <char num='233' name='eacute' convertTo='\\@QUOTe' />
  <char num='234' name='ecirc' convertTo='\\^e' />
  <char num='235' name='euml' convertTo='\\@DOUBLEQUOTe' />    
  <char num='236' name='igrave' convertTo='\\`i' />
  <char num='237' name='iacute' convertTo='\\@QUOTi' />
  <char num='238' name='icirc' convertTo='\\^i' />
  <char num='239' name='iuml' convertTo='\\@DOUBLEQUOTi' />
  <char num='240' name='eth' convertTo='$\\eth$' package='amssymb'/> <!-- -->
  <char num='241' name='ntilde' convertTo='\\~n' />
  <char num='242' name='ograve' convertTo='\\`o' />
  <char num='243' name='oacute' convertTo='\\@QUOTo' />
  <char num='244' name='ocirc' convertTo='\\^o' />
  <char num='245' name='otilde' convertTo='\\~o' />
  <char num='246' name='ouml' convertTo='\\@DOUBLEQUOTo' />
<!--   <char num='247' name='divide' convertTo='$\\divide$' />       -->
  <char num='248' name='oslash' convertTo='\\o' /> 
  <char num='249' name='ugrave' convertTo='\\`u' />
  <char num='250' name='uacute' convertTo='\\@QUOTu' />
  <char num='251' name='ucirc' convertTo='\\^u' />
  <char num='252' name='uuml' convertTo='\\@DOUBLEQUOTu' />
  <char num='253' name='yacute' convertTo='\\@QUOTy' />

  <char num='255' name='yuml' convertTo='\\@DOUBLEQUOTy' />                  

	<char num='222' name='THORN' convertTo='\\Thorn' package='wasysym' /> 
	<char num='254' name='thorn' convertTo='\\thorn' package='wasysym' />
</chars>"

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.init_entity_tableObject

create hash @@entity_to_latex



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/maruku/output/to_latex_entities.rb', line 59

def Latex.init_entity_table
	doc = Document.new XML_TABLE
	doc.elements.each("//char") do |c| 
		num =  c.attributes['num'].to_i
		name =  c.attributes['name']
		package =  c.attributes['package']
		
		convert =  c.attributes['convertTo']
		convert.gsub!(/@DOUBLEQUOT/,'"')
		convert.gsub!(/@QUOT/,"'")
		convert.gsub!(/@GT/,">")
		convert.gsub!(/@LT/,"<")
		convert.gsub!(/@AMP/,"&")
		convert.freeze
		
		e = LatexEntity.new
		e.html_num = num
		e.html_entity = name
		e.latex_string = convert
		e.latex_packages = package ? package.split : []
		
		ENTITY_TABLE[num] = e
		ENTITY_TABLE[name] = e
	end
end

Instance Method Details

#array_to_latex(array, join_char = '') ⇒ Object



481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
# File 'lib/maruku/output/to_latex.rb', line 481

def array_to_latex(array, join_char='')
	e = []
	array.each do |c|
		method = c.kind_of?(MDElement) ? 
		   "to_latex_#{c.node_type}" : "to_latex"
		
		if not c.respond_to?(method)
	#		raise "Object does not answer to #{method}: #{c.class} #{c.inspect[0,100]}"
			next
		end
		
		h =  c.send(method)
		
		if h.nil?
			raise "Nil html for #{c.inspect} created with method #{method}"
		end
		
		if h.kind_of?Array
			e = e + h
		else
			e << h
		end
	end
	
	# puts a space after commands if needed
	e.each_index do |i|
		if e[i] =~ /\\\w+\s*$/ # command
			if (s=e[i+1]) && s[0] == ?\ # space
				e[i]  = e[i] + "\\ "
			end
		end
	end
	
	e.join(join_char)
end

#children_to_latexObject

Convert each child to html



477
478
479
# File 'lib/maruku/output/to_latex.rb', line 477

def children_to_latex
	array_to_latex(@children)
end

#get_setting(name, default = nil) ⇒ Object



150
151
152
# File 'lib/maruku/output/to_latex.rb', line 150

def get_setting(name, default=nil)
	self.attributes[name] || @doc.attributes[name] || default
end

#latex_color(s, command = 'color') ⇒ Object

colorname colorMaRuKu::Out::Latex.1,01,0.2,01,0.2,0.3



167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
# File 'lib/maruku/output/to_latex.rb', line 167

def latex_color(s, command='color')
	if s =~ /^\#(\w\w)(\w\w)(\w\w)$/
		r = $1.hex; g = $2.hex; b=$3.hex
		# convert from 0-255 to 0.0-1.0
		r = r / 255.0; g = g / 255.0; b = b / 255.0; 
		"\\#{command}[rgb]{%0.2f,%0.2f,%0.2f}" % [r,g,b]
	elsif s =~ /^\#(\w)(\w)(\w)$/
		r = $1.hex; g = $2.hex; b=$3.hex
		# convert from 0-15 to 0.0-1.0
		r = r / 15.0; g = g / 15.0; b = b / 15.0; 
		"\\#{command}[rgb]{%0.2f,%0.2f,%0.2f}" % [r,g,b]
	else	
		"\\#{command}{#{s}}"
	end
end

#latex_escape(source) ⇒ Object

the ultimate escaping (is much better than using verb)



305
306
307
308
309
# File 'lib/maruku/output/to_latex.rb', line 305

def latex_escape(source)
	s=""; 
	source.each_byte do |b| s+= "\\char%d" % b end
	s
end

#to_latex_abbrObject



458
459
460
# File 'lib/maruku/output/to_latex.rb', line 458

def to_latex_abbr
	children_to_latex
end

#to_latex_cellObject



415
# File 'lib/maruku/output/to_latex.rb', line 415

def to_latex_cell; children_to_latex end

#to_latex_codeObject



183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
# File 'lib/maruku/output/to_latex.rb', line 183

def to_latex_code;
	raw_code = self.raw_code
=begin maruku_doc
Attribute: latex_use_listings
Scope: document
Output: latex
Summary: Support for `listings` package.
Related: code_show_spaces, code_background_color, lang, code_lang

If the `latex_use_listings` attribute is specified, then 
code block are rendered using the `listings` package.
Otherwise, a standard `verbatim` environment is used.

*	If the `lang` attribute for the code block has been specified,
it gets passed to the `listings` package using the `lstset` macro.
The default lang for code blocks is specified through 
the `code_lang` attribute.

	\lstset{language=ruby}

Please refer to the documentation of the `listings` package for
supported languages.

If a language is not supported, the `listings` package will emit
a warning during the compilation. Just press enter and nothing
wrong will happen.

*	If the `code_show_spaces` is specified, than spaces and tabs will
be shown using the macro:

	\lstset{showspaces=true,showtabs=true}

*	The background color is given by `code_background_color`.

=end
	
	if @doc.attributes[:latex_use_listings]
		@doc.latex_require_package('listings')
			
		s = "\\lstset{columns=fixed,frame=shadowbox}"

		show_spaces = get_setting(:code_show_spaces) 
		if show_spaces
			s+= "\\lstset{showspaces=true,showtabs=true}\n"
		else
			s+= "\\lstset{showspaces=false,showtabs=false}\n"
		end
		
		color = latex_color get_setting(:code_background_color,DEFAULT_CODE_COLOR)
		
		s+= "\\lstset{backgroundcolor=#{color}}\n" 
		
		s+= "\\lstset{basicstyle=\\ttfamily\\footnotesize}\n" 
		
		
		lang = self.attributes[:lang] || @doc.attributes[:code_lang] || '{}'
		if lang
			s += "\\lstset{language=#{lang}}\n"
		end
		
		"#{s}\n\\begin{lstlisting}\n#{raw_code}\n\\end{lstlisting}"
	else
		"\\begin{verbatim}#{raw_code}\\end{verbatim}\n"
	end
end

#to_latex_definitionObject



441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
# File 'lib/maruku/output/to_latex.rb', line 441

def to_latex_definition		
	terms = self.terms
	definitions = self.definitions
	
	s = ""
	terms.each do |t|
		s +="\n\\item[#{t.children_to_latex}] "
	end

	definitions.each do |d|
		s += "#{d.children_to_latex} \n"
	end
	
	s
end

#to_latex_definition_listObject

Definition lists ###



434
435
436
437
438
439
# File 'lib/maruku/output/to_latex.rb', line 434

def to_latex_definition_list
	s = "\\begin{description}\n"
	s += children_to_latex
	s += "\\end{description}\n"
	s
end

#to_latex_email_addressObject



374
375
376
377
# File 'lib/maruku/output/to_latex.rb', line 374

def to_latex_email_address
	email = self.email
	"\\href{mailto:#{email}}{#{latex_escape(email)}}"
end

#to_latex_emphasisObject



291
# File 'lib/maruku/output/to_latex.rb', line 291

def to_latex_emphasis;  wrap_as_span('\em')               end

#to_latex_entityObject



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/maruku/output/to_latex_entities.rb', line 29

def to_latex_entity 
	entity_name = self.entity_name

	entity = ENTITY_TABLE[entity_name]
	replace = entity.latex_string
	
	entity.latex_packages.each do |p|
		@doc.latex_require_package p
	end
	
	if replace =~ /^\\/
		replace = replace + " "
	end
	
		if replace
		return replace
	else
		tell_user "Cannot translate entity #{entity_name.inspect} to LaTeX."
		return entity_name
	end
end

#to_latex_footnote_referenceObject



418
419
420
421
422
423
424
425
426
# File 'lib/maruku/output/to_latex.rb', line 418

def to_latex_footnote_reference
	id = self.footnote_id
	f = @doc.footnotes[id]
	if f
		"\\footnote{#{f.children_to_latex.strip}} "
	else
		$stderr.puts "Could not find footnote '#{fid}'"
	end
end

#to_latex_head_cellObject



414
# File 'lib/maruku/output/to_latex.rb', line 414

def to_latex_head_cell; children_to_latex end

#to_latex_headerObject



255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
# File 'lib/maruku/output/to_latex.rb', line 255

def to_latex_header
	h = TexHeaders[self.level] || 'paragraph'
	
	title = children_to_latex
	if number = section_number
		title = number + title
	end
	
	if id = self.attributes[:id]
		# drop '#' at the beginning
		if id[0,1] == '#' then id = [1,id.size] end
		%{\\hypertarget{%s}{}\\%s*{{%s}}\\label{%s}\n\n} % [ id, h, title, id ]
	else
		%{\\%s*{%s}\n\n} % [ h, title]
	end
end

#to_latex_hruleObject



143
# File 'lib/maruku/output/to_latex.rb', line 143

def to_latex_hrule; "\n\\vspace{.5em} \\hrule \\vspace{.5em}\n" end


338
339
340
341
342
343
344
345
346
347
# File 'lib/maruku/output/to_latex.rb', line 338

def to_latex_im_link
	url = self.url

	if url[0,1] == '#'
		url = url[1,url.size]
		return "\\hyperlink{#{url}}{#{children_to_latex}}"
	else
		return "\\href{#{url}}{#{children_to_latex}}"
	end
end

#to_latex_imageObject



462
463
464
465
466
467
468
469
470
471
472
473
# File 'lib/maruku/output/to_latex.rb', line 462

def to_latex_image
	id = self.ref_id
	ref = @doc.refs[id]
	if not ref
		$stderr.puts "Could not find id = '#{id}'"
		""
	else
		url = ref[:url]
		"{\\bf Images not supported yet (#{latex_escape(url)})}"
	end

end


323
324
325
326
327
328
329
330
331
332
333
334
335
336
# File 'lib/maruku/output/to_latex.rb', line 323

def to_latex_immediate_link
	a =  create_html_element 'a'
	url = self.url
	text = url.gsub(/^mailto:/,'') # don't show mailto
#			gsub('~','$\sim$')
	text = latex_escape(text)
	if url[0,1] == '#'
		url = url[1,url.size]
		return "\\hyperlink{#{url}}{#{text}}"
	else

		return "\\href{#{url}}{#{text}}"
	end
end

#to_latex_inline_codeObject



311
312
313
314
315
316
317
318
319
320
321
# File 'lib/maruku/output/to_latex.rb', line 311

def to_latex_inline_code; 
	source = self.raw_code
	
	# Convert to printable latex chars 
	s = latex_escape(source)
	
	color = get_setting(:code_background_color,DEFAULT_CODE_COLOR)
	colorspec = latex_color(color, 'colorbox')

	"#{colorspec}{\\tt #{s}}"
end

#to_latex_liObject



283
284
285
# File 'lib/maruku/output/to_latex.rb', line 283

def to_latex_li;        
	"\\item #{children_to_latex}\n"  
end

#to_latex_li_spanObject



286
287
288
# File 'lib/maruku/output/to_latex.rb', line 286

def to_latex_li_span;
	"\\item #{children_to_latex}\n"
end

#to_latex_linebreakObject



144
# File 'lib/maruku/output/to_latex.rb', line 144

def to_latex_linebreak; "\\linebreak " end


349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
# File 'lib/maruku/output/to_latex.rb', line 349

def to_latex_link
	id = self.ref_id
	# if empty, use text
	if id.size == 0
		id = children.to_s.downcase
	end
	
	ref = @doc.refs[id]
	if not ref
		$stderr.puts "Could not find id = '#{id}'"
		return children_to_latex
	else
		url = ref[:url]
		#title = ref[:title] || 'no title'

		if url[0,1] == '#'
			url = url[1,url.size]
			return "\\hyperlink{#{url}}{#{children_to_latex}}"
		else
			return "\\href{#{url}}{#{children_to_latex}}"
		end
	end
	
end

#to_latex_olObject



282
# File 'lib/maruku/output/to_latex.rb', line 282

def to_latex_ol;        wrap_as_environment('enumerate')               end

#to_latex_paragraphObject



146
147
148
# File 'lib/maruku/output/to_latex.rb', line 146

def to_latex_paragraph 
	children_to_latex+"\n\n"
end

#to_latex_quoteObject



281
# File 'lib/maruku/output/to_latex.rb', line 281

def to_latex_quote;        wrap_as_environment('quote')               end

#to_latex_raw_htmlObject



428
429
430
431
# File 'lib/maruku/output/to_latex.rb', line 428

def to_latex_raw_html
	#'{\bf Raw HTML removed in latex version }'
	""
end

#to_latex_strongObject



290
# File 'lib/maruku/output/to_latex.rb', line 290

def to_latex_strong;    wrap_as_span('\bf')           end

#to_latex_tableObject



380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
# File 'lib/maruku/output/to_latex.rb', line 380

def to_latex_table
	align = self.align
	num_columns = align.size

	head = @children.slice(0, num_columns)
	rows = []
	i = num_columns
	while i<@children.size
		rows << @children.slice(i, num_columns)
		i+=num_columns
	end
	
	h = {:center=>'c',:left=>'l',:right=>'r'}
	align_string = align.map{|a| h[a]}.join('|')
	
	s = "\\begin{tabular}{#{align_string}}\n"
		
		s += array_to_latex(head, '&') + "\\\\" +"\n"
		
		s += "\\hline \n"
		
		rows.each do |row|
			s += array_to_latex(row, '&') + "\\\\" +"\n"
		end
		
	s += "\\end{tabular}"
	
	# puts table in its own paragraph
	s += "\n\n"
	
	s
end

#to_latex_ulObject



273
274
275
276
277
278
279
# File 'lib/maruku/output/to_latex.rb', line 273

def to_latex_ul;       
	if self.attributes[:toc]
		@doc.toc.to_latex
	else
		wrap_as_environment('itemize')
	end
end

#wrap_as_environment(name) ⇒ Object



297
298
299
300
301
# File 'lib/maruku/output/to_latex.rb', line 297

def wrap_as_environment(name)
"\\begin{#{name}}%
#{children_to_latex}
\\end{#{name}}\n"	
end

#wrap_as_span(c) ⇒ Object



293
294
295
# File 'lib/maruku/output/to_latex.rb', line 293

def wrap_as_span(c)
	"{#{c} #{children_to_latex}}"
end