Module: MaRuKu::Out::Latex
- Included in:
- MDElement
- Defined in:
- lib/maruku.rb,
lib/maruku/output/to_latex.rb,
lib/maruku/ext/math/to_latex.rb
Defined Under Namespace
Modules: MDDocumentExtensions
Constant Summary collapse
- Latex_preamble_enc_cjk =
"\\usepackage[C40]{fontenc} \\usepackage[cjkjis]{ucs} \\usepackage[utf8x]{inputenc}"
- Latex_preamble_enc_utf8 =
"\\usepackage{ucs} \\usepackage[utf8x]{inputenc}"
- SAFE_CHARS =
Set.new(('a'..'z').to_a + ('A'..'Z').to_a)
- LATEX_ADD_SLASH =
These are TeX’s special characters
%w({ } $ & # _ %)
- LATEX_TO_CHARCODE =
These, we transform to char<ascii code>
%w(^ ~ > <)
- OtherGoodies =
other things that are good on the eyes
{ /(\s)LaTeX/ => '\1\\LaTeX\\xspace ', # XXX not if already \LaTeX }
Instance Method Summary collapse
- #array_to_latex(array, join_char = '') ⇒ Object
-
#children_to_latex ⇒ Object
Convert each child to html.
-
#latex_color(s, command = 'color') ⇒ Object
colorname color1,01,0.2,01,0.2,0.3.
-
#latex_escape(source) ⇒ Object
the ultimate escaping (is much better than using verb).
- #render_latex_signature ⇒ Object
-
#string_to_latex(s) ⇒ Object
escapes special characters.
-
#to_latex ⇒ Object
Render as a LaTeX fragment.
- #to_latex_abbr ⇒ Object
- #to_latex_cell ⇒ Object
-
#to_latex_code ⇒ Object
begin maruku_doc Attribute: latex_use_listings Scope: document Output: latex Summary: Support for ‘listings` package.
- #to_latex_definition ⇒ Object
-
#to_latex_definition_list ⇒ Object
Definition lists ###.
- #to_latex_div ⇒ Object
- #to_latex_divref ⇒ Object
-
#to_latex_document ⇒ Object
Render as a complete LaTeX document.
- #to_latex_email_address ⇒ Object
- #to_latex_emphasis ⇒ Object
- #to_latex_entity ⇒ Object
- #to_latex_eqref ⇒ Object
- #to_latex_equation ⇒ Object
- #to_latex_footnote_reference ⇒ Object
- #to_latex_head_cell ⇒ Object
- #to_latex_header ⇒ Object
- #to_latex_hrule ⇒ Object
- #to_latex_im_link ⇒ Object
- #to_latex_image ⇒ Object
- #to_latex_immediate_link ⇒ Object
- #to_latex_inline_code ⇒ Object
- #to_latex_inline_math ⇒ Object
- #to_latex_li ⇒ Object
- #to_latex_linebreak ⇒ Object
- #to_latex_link ⇒ Object
- #to_latex_ol ⇒ Object
- #to_latex_paragraph ⇒ Object
- #to_latex_quote ⇒ Object
- #to_latex_raw_html ⇒ Object
- #to_latex_strong ⇒ Object
- #to_latex_table ⇒ Object
- #to_latex_ul ⇒ Object
- #wrap_as_environment(name) ⇒ Object
- #wrap_as_span(c) ⇒ Object
Instance Method Details
#array_to_latex(array, join_char = '') ⇒ Object
531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 |
# File 'lib/maruku/output/to_latex.rb', line 531 def array_to_latex(array, join_char='') e = [] array.each do |c| if c.kind_of?(String) e << string_to_latex(c) else method = c.kind_of?(Maruku::MDElement) ? "to_latex_#{c.node_type}" : "to_latex" next unless c.respond_to?(method) h = c.send(method) unless h raise "Nil latex for #{c.inspect} created with method #{method}" end if h.kind_of? Array e.concat h else e << h end end end e.join(join_char) end |
#children_to_latex ⇒ Object
Convert each child to html
527 528 529 |
# File 'lib/maruku/output/to_latex.rb', line 527 def children_to_latex array_to_latex(@children) end |
#latex_color(s, command = 'color') ⇒ Object
colorname colorMaRuKu::Out::Latex.1,01,0.2,01,0.2,0.3
161 162 163 164 165 166 167 168 169 |
# File 'lib/maruku/output/to_latex.rb', line 161 def latex_color(s, command='color') if s =~ /\A\#([1-9A-F]{1,2})([1-9A-F]{1,2})([1-9A-F]{1,2})\z/i # convert from 0-255 or 0-15 to 0.0-1.0 r, g, b = [$1, $2, $3].map {|c| c.hex / (c.length == 1 ? 15.0 : 255.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)
318 319 320 321 322 323 324 325 326 327 328 |
# File 'lib/maruku/output/to_latex.rb', line 318 def latex_escape(source) source.chars.inject('') do |s, b| s << if b == '\\' '~' elsif SAFE_CHARS.include? b b else "\\char%d" % b[0].ord end end end |
#render_latex_signature ⇒ Object
126 127 128 129 130 131 132 133 |
# File 'lib/maruku/output/to_latex.rb', line 126 def render_latex_signature "\\vfill \\hrule \\vspace{1.2mm} \\begin{tiny} Created by \\href{#{MaRuKu::MARUKU_URL}}{Maruku} #{self.nice_date}. \\end{tiny}" end |
#string_to_latex(s) ⇒ Object
escapes special characters
562 563 564 565 566 567 568 |
# File 'lib/maruku/output/to_latex.rb', line 562 def string_to_latex(s) s = escape_to_latex(s) OtherGoodies.each do |k, v| s.gsub!(k, v) end s end |
#to_latex ⇒ Object
Render as a LaTeX fragment
28 29 30 |
# File 'lib/maruku/output/to_latex.rb', line 28 def to_latex children_to_latex end |
#to_latex_abbr ⇒ Object
483 484 485 |
# File 'lib/maruku/output/to_latex.rb', line 483 def to_latex_abbr children_to_latex end |
#to_latex_cell ⇒ Object
438 439 440 441 442 443 444 445 446 |
# File 'lib/maruku/output/to_latex.rb', line 438 def to_latex_cell s="" if @attributes.has_key?(:colspan) # TODO figure out how to set the alignment (defaulting to left for now) s="\\multicolumn {"<< @attributes[:colspan]<<"}{|l|}{"<<children_to_latex<<"}" else children_to_latex end end |
#to_latex_code ⇒ Object
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
230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 |
# File 'lib/maruku/output/to_latex.rb', line 230 def to_latex_code if get_setting(:latex_use_listings) @doc.latex_require_package('listings') s = "\\lstset{columns=fixed,frame=shadowbox}" if get_setting(:code_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) s << "\\lstset{backgroundcolor=#{color}}\n" s << "\\lstset{basicstyle=\\ttfamily\\footnotesize}\n" lang = self.attributes[:lang] || @doc.attributes[:code_lang] || '{}' s << "\\lstset{language=#{lang}}\n" if lang "#{s}\n\\begin{lstlisting}\n#{self.raw_code}\n\\end{lstlisting}" else "\\begin{verbatim}#{self.raw_code}\\end{verbatim}\n" end end |
#to_latex_definition ⇒ Object
469 470 471 472 473 474 475 476 477 478 479 480 481 |
# File 'lib/maruku/output/to_latex.rb', line 469 def to_latex_definition s = "" self.terms.each do |t| s << "\n\\item[#{t.children_to_latex}] " end self.definitions.each do |d| s << "#{d.children_to_latex} \n" end s end |
#to_latex_definition_list ⇒ Object
Definition lists ###
463 464 465 466 467 |
# File 'lib/maruku/output/to_latex.rb', line 463 def to_latex_definition_list s = "\\begin{description}\n" s << children_to_latex s << "\\end{description}\n" end |
#to_latex_div ⇒ Object
501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 |
# File 'lib/maruku/output/to_latex.rb', line 501 def to_latex_div type = self.attributes[:class] id = self.attributes[:id] case type when /^un_(\w*)/ @children.shift s = "\\begin{u#{$1}}\n" s << children_to_latex s << "\\end{u#{$1}}\n" when /^num_(\w*)/ @children.delete_at(0) s = "\\begin{#{$1}}" s << "\n\\label{#{id}}\\hypertarget{#{id}}{}\n" s << children_to_latex s << "\\end{#{$1}}\n" when /^proof/ @children.delete_at(0) s = "\\begin{proof}\n" s << children_to_latex s << "\\end{proof}\n" else children_to_latex end end |
#to_latex_divref ⇒ Object
20 21 22 |
# File 'lib/maruku/ext/math/to_latex.rb', line 20 def to_latex_divref "\\ref{#{self.refid}}" end |
#to_latex_document ⇒ Object
Render as a complete LaTeX document
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 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 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
# File 'lib/maruku/output/to_latex.rb', line 44 def to_latex_document body = to_latex if get_setting(:maruku_signature) body << render_latex_signature end required = self.latex_required_packages.map do |p| "\\usepackage{#{p}}\n" end.join #=begin maruku_doc # Attribute: latex_cjk # Scope: document # Output: latex # Summary: Support for CJK characters. # # If the `latex_cjk` attribute is specified, then appropriate headers # are added to the LaTeX preamble to support Japanese fonts. # You have to have these fonts installed -- and this can be a pain. # # If `latex_cjk` is specified, this is added to the preamble: # # <?mrk puts "ciao" ?> # # <?mrk md_codeblock(Maruku::MDDocument::Latex_preamble_enc_cjk) ?> # # # while the default is to add this: # # <?mrk md_codeblock(Maruku::MDDocument::Latex_preamble_enc_utf8) ?> # #=end encoding = get_setting(:latex_cjk) ? Latex_preamble_enc_cjk : Latex_preamble_enc_utf8 #=begin maruku_doc # Attribute: latex_preamble # Scope: document # Output: latex # Summary: User-defined preamble. # # If the `latex_preamble` attribute is specified, then its value # will be used as a custom preamble. # # For example: # # Title: My document # Latex preamble: preamble.tex # # will produce: # # ... # \input{preamble.tex} # ... # #=end user_preamble = (file = @doc.attributes[:latex_preamble]) ? "\\input{#{file}}\n" : "" "\\documentclass{article} % Packages required to support encoding #{encoding} % Packages required by code #{required} % Packages always used \\usepackage{hyperref} \\usepackage{xspace} \\usepackage[usenames,dvipsnames]{color} \\hypersetup{colorlinks=true,urlcolor=blue} #{user_preamble} \\begin{document} #{body} \\end{document} " end |
#to_latex_email_address ⇒ Object
405 406 407 |
# File 'lib/maruku/output/to_latex.rb', line 405 def to_latex_email_address "\\href{mailto:#{self.email}}{#{latex_escape(self.email)}}" end |
#to_latex_emphasis ⇒ Object
300 301 302 |
# File 'lib/maruku/output/to_latex.rb', line 300 def to_latex_emphasis "\\emph{#{children_to_latex}}" end |
#to_latex_entity ⇒ Object
330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 |
# File 'lib/maruku/output/to_latex.rb', line 330 def to_latex_entity entity_name = self.entity_name entity = MaRuKu::Out::EntityTable.instance.entity(entity_name) unless entity maruku_error "I don't know how to translate entity '#{entity_name}' to LaTeX." return "" end replace = entity.latex_string @doc.latex_require_package entity.latex_package if entity.latex_package if replace if replace.start_with?("\\") && !replace.end_with?('$', '}') replace + "{}" else replace end else tell_user "Cannot translate entity #{entity_name.inspect} to LaTeX." entity_name end end |
#to_latex_eqref ⇒ Object
16 17 18 |
# File 'lib/maruku/ext/math/to_latex.rb', line 16 def to_latex_eqref "\\eqref{#{self.eqid}}" end |
#to_latex_equation ⇒ Object
8 9 10 11 12 13 14 |
# File 'lib/maruku/ext/math/to_latex.rb', line 8 def to_latex_equation if self.label fix_latex("\\begin{equation}\n#{self.math.strip}\n\\label{#{self.label}}\\end{equation}\n") else fix_latex("\\begin{displaymath}\n#{self.math.strip}\n\\end{displaymath}\n") end end |
#to_latex_footnote_reference ⇒ Object
448 449 450 451 452 453 454 455 |
# File 'lib/maruku/output/to_latex.rb', line 448 def to_latex_footnote_reference id = self.footnote_id if f = @doc.footnotes[id] "\\footnote{#{f.children_to_latex.strip}} " else $stderr.puts "Could not find footnote '#{id}'" end end |
#to_latex_head_cell ⇒ Object
434 435 436 |
# File 'lib/maruku/output/to_latex.rb', line 434 def to_latex_head_cell to_latex_cell end |
#to_latex_header ⇒ Object
258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 |
# File 'lib/maruku/output/to_latex.rb', line 258 def to_latex_header header_levels = %w(section subsection subsubsection) h = header_levels[self.level - 1] || 'paragraph' title = children_to_latex if number = section_number title = number + title end if id = self.attributes[:id] # drop '#' at the beginning id = id[1..-1] if id.start_with? '#' %{\\hypertarget{%s}{}\\%s*{{%s}}\\label{%s}\n\n} % [ id, h, title, id ] else %{\\%s*{%s}\n\n} % [ h, title] end end |
#to_latex_hrule ⇒ Object
135 136 137 |
# File 'lib/maruku/output/to_latex.rb', line 135 def to_latex_hrule "\n\\vspace{.5em} \\hrule \\vspace{.5em}\n" end |
#to_latex_im_link ⇒ Object
376 377 378 379 380 381 382 383 384 385 |
# File 'lib/maruku/output/to_latex.rb', line 376 def to_latex_im_link url = self.url if url.start_with? '#' url = url[1..-1] "\\hyperlink{#{url}}{#{children_to_latex}}" else "\\href{#{url}}{#{children_to_latex}}" end end |
#to_latex_image ⇒ Object
487 488 489 490 491 492 493 494 495 496 497 498 499 |
# File 'lib/maruku/output/to_latex.rb', line 487 def to_latex_image id = self.ref_id ref = @doc.refs[sanitize_ref_id(id)] || @doc.refs[sanitize_ref_id(children_to_s)] if ref url = ref[:url] $stderr.puts "Images not supported yet (#{url})" "" else maruku_error "Could not find ref #{id.inspect} for image.\n"+ "Available are: #{@docs.refs.keys.inspect}" "" end end |
#to_latex_immediate_link ⇒ Object
364 365 366 367 368 369 370 371 372 373 374 |
# File 'lib/maruku/output/to_latex.rb', line 364 def to_latex_immediate_link url = self.url text = url.gsub(/^mailto:/,'') # don't show mailto text = latex_escape(text) if url.start_with? '#' url = url[1..-1] "\\hyperlink{#{url}}{#{text}}" else "\\href{#{url}}{#{text}}" end end |
#to_latex_inline_code ⇒ Object
354 355 356 357 358 359 360 361 362 |
# File 'lib/maruku/output/to_latex.rb', line 354 def to_latex_inline_code # Convert to printable latex chars s = latex_escape(self.raw_code) color = get_setting(:code_background_color) colorspec = latex_color(color, 'colorbox') "{#{colorspec}{\\tt #{s}}}" end |
#to_latex_inline_math ⇒ Object
4 5 6 |
# File 'lib/maruku/ext/math/to_latex.rb', line 4 def to_latex_inline_math fix_latex("$#{self.math.strip}$") end |
#to_latex_li ⇒ Object
292 293 294 |
# File 'lib/maruku/output/to_latex.rb', line 292 def to_latex_li "\\item #{children_to_latex}\n" end |
#to_latex_linebreak ⇒ Object
139 140 141 |
# File 'lib/maruku/output/to_latex.rb', line 139 def to_latex_linebreak "\\newline " end |
#to_latex_link ⇒ Object
387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 |
# File 'lib/maruku/output/to_latex.rb', line 387 def to_latex_link id = self.ref_id || children_to_s ref = @doc.refs[sanitize_ref_id(id)] || @doc.refs[sanitize_ref_id(children_to_s)] if ref url = ref[:url] if url.start_with? '#' url = url[1..-1] "\\hyperlink{#{url}}{#{children_to_latex}}" else "\\href{#{url}}{#{children_to_latex}}" end else $stderr.puts "Could not find id = '#{id}'" children_to_latex end end |
#to_latex_ol ⇒ Object
288 289 290 |
# File 'lib/maruku/output/to_latex.rb', line 288 def to_latex_ol wrap_as_environment('enumerate') end |
#to_latex_paragraph ⇒ Object
143 144 145 |
# File 'lib/maruku/output/to_latex.rb', line 143 def to_latex_paragraph children_to_latex + "\n\n" end |
#to_latex_quote ⇒ Object
284 285 286 |
# File 'lib/maruku/output/to_latex.rb', line 284 def to_latex_quote wrap_as_environment('quote') end |
#to_latex_raw_html ⇒ Object
457 458 459 460 |
# File 'lib/maruku/output/to_latex.rb', line 457 def to_latex_raw_html # Raw HTML removed in latex version "" end |
#to_latex_strong ⇒ Object
296 297 298 |
# File 'lib/maruku/output/to_latex.rb', line 296 def to_latex_strong "\\textbf{#{children_to_latex}}" end |
#to_latex_table ⇒ Object
409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 |
# File 'lib/maruku/output/to_latex.rb', line 409 def to_latex_table num_columns = self.align.size head, *rows = @children h = { :center => 'c' , :left => 'l' , :right => 'r'} align_string = self.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" end |
#to_latex_ul ⇒ Object
276 277 278 279 280 281 282 |
# File 'lib/maruku/output/to_latex.rb', line 276 def to_latex_ul if self.attributes[:toc] @doc.toc.to_latex else wrap_as_environment('itemize') end end |
#wrap_as_environment(name) ⇒ Object
308 309 310 311 312 |
# File 'lib/maruku/output/to_latex.rb', line 308 def wrap_as_environment(name) "\\begin{#{name}}% #{children_to_latex} \\end{#{name}}\n" end |
#wrap_as_span(c) ⇒ Object
304 305 306 |
# File 'lib/maruku/output/to_latex.rb', line 304 def wrap_as_span(c) "{#{c} #{children_to_latex}}" end |