class ReVIEW::LATEXBuilder

Constants

BOUTEN
HEADLINE

Public Instance Methods

bibpaper_bibpaper(_id, _caption, lines) click to toggle source
# File lib/review/latexbuilder.rb, line 1395
def bibpaper_bibpaper(_id, _caption, lines)
  if @book.config['join_lines_by_lang']
    print split_paragraph(lines).join("\n\n")
  else
    print split_paragraph(lines).map(&:chomp).join("\n")
  end

  puts ''
end
bibpaper_header(id, caption) click to toggle source
# File lib/review/latexbuilder.rb, line 1390
def bibpaper_header(id, caption)
  puts "[#{@chapter.bibpaper(id).number}] #{compile_inline(caption)}"
  puts macro('label', bib_label(id))
end
blankline() click to toggle source
# File lib/review/latexbuilder.rb, line 1040
def blankline
  puts '\par\vspace{\baselineskip}\par'
end
box(lines, caption = nil) click to toggle source
# File lib/review/latexbuilder.rb, line 304
def box(lines, caption = nil)
  blank
  puts macro('reviewboxcaption', compile_inline(caption)) if caption.present?
  puts '\begin{reviewbox}'
  lines.each do |line|
    puts detab(line)
  end
  puts '\end{reviewbox}'
  blank
end
captionblock(type, lines, caption) click to toggle source
# File lib/review/latexbuilder.rb, line 276
def captionblock(type, lines, caption)
  check_nested_minicolumn
  if @book.config.check_version('2', exception: false)
    type = 'minicolumn'
  end

  print "\\begin{review#{type}}"

  @doc_status[:caption] = true
  if @book.config.check_version('2', exception: false)
    puts
    if caption.present?
      puts "\\reviewminicolumntitle{#{compile_inline(caption)}}"
    end
  else
    if caption.present?
      print "[#{compile_inline(caption)}]"
    end
    puts
  end

  @doc_status[:caption] = nil
  blocked_lines = split_paragraph(lines)
  puts blocked_lines.join("\n\n")

  puts "\\end{review#{type}}"
end
center(lines) click to toggle source
# File lib/review/latexbuilder.rb, line 955
def center(lines)
  latex_block('center', lines)
end
Also aliased as: centering
centering(lines)
Alias for: center
cmd(lines, caption = nil, lang = nil) click to toggle source
# File lib/review/latexbuilder.rb, line 458
def cmd(lines, caption = nil, lang = nil)
  if highlight_listings?
    common_code_block_lst(nil, lines, 'reviewcmdlst', 'title', caption, lang)
  else
    blank
    common_code_block(nil, lines, 'reviewcmd', caption, lang) { |line, idx| code_line('cmd', line, idx, nil, caption, lang) }
  end
end
code_line(_type, line, _idx, _id, _caption, _lang) click to toggle source
# File lib/review/latexbuilder.rb, line 412
def code_line(_type, line, _idx, _id, _caption, _lang)
  detab(line) + "\n"
end
code_line_num(_type, line, first_line_num, idx, _id, _caption, _lang) click to toggle source
# File lib/review/latexbuilder.rb, line 416
def code_line_num(_type, line, first_line_num, idx, _id, _caption, _lang)
  detab((idx + first_line_num).to_s.rjust(2) + ': ' + line) + "\n"
end
column_begin(level, label, caption) click to toggle source
# File lib/review/latexbuilder.rb, line 198
def column_begin(level, label, caption)
  blank
  @doc_status[:column] = true

  target = if label
             "\\hypertarget{#{column_label(label)}}{}"
           else
             "\\hypertarget{#{column_label(caption)}}{}"
           end

  @doc_status[:caption] = true
  if @book.config.check_version('2', exception: false)
    puts '\\begin{reviewcolumn}'
    puts target
    puts macro('reviewcolumnhead', nil, compile_inline(caption))
  else
    # ver.3
    print '\\begin{reviewcolumn}'
    puts "[#{compile_inline(caption)}#{target}]"
  end
  @doc_status[:caption] = nil

  if level <= @book.config['toclevel'].to_i
    puts "\\addcontentsline{toc}{#{HEADLINE[level]}}{#{compile_inline(caption)}}"
  end
end
column_end(_level) click to toggle source
# File lib/review/latexbuilder.rb, line 225
def column_end(_level)
  puts '\\end{reviewcolumn}'
  blank
  @doc_status[:column] = nil
end
comment(lines, comment = nil) click to toggle source
# File lib/review/latexbuilder.rb, line 1017
def comment(lines, comment = nil)
  return true unless @book.config['draft']

  lines ||= []
  unless comment.blank?
    lines.unshift(escape(comment))
  end
  str = lines.join('\par ')
  puts macro('pdfcomment', str)
end
common_block_begin(type, caption = nil) click to toggle source
# File lib/review/latexbuilder.rb, line 231
def common_block_begin(type, caption = nil)
  check_nested_minicolumn
  if @book.config.check_version('2', exception: false)
    type = 'minicolumn'
  end

  @doc_status[:minicolumn] = type
  print "\\begin{review#{type}}"

  @doc_status[:caption] = true
  if @book.config.check_version('2', exception: false)
    puts
    if caption.present?
      puts "\\reviewminicolumntitle{#{compile_inline(caption)}}"
    end
  else
    if caption.present?
      print "[#{compile_inline(caption)}]"
    end
    puts
  end
  @doc_status[:caption] = nil
end
common_block_end(type) click to toggle source
# File lib/review/latexbuilder.rb, line 255
def common_block_end(type)
  if @book.config.check_version('2', exception: false)
    type = 'minicolumn'
  end

  puts "\\end{review#{type}}"
  @doc_status[:minicolumn] = nil
end
common_code_block(id, lines, command, caption, _lang) { |line, idx| ... } click to toggle source
# File lib/review/latexbuilder.rb, line 467
def common_code_block(id, lines, command, caption, _lang)
  @doc_status[:caption] = true
  captionstr = nil
  unless @book.config.check_version('2', exception: false)
    puts '\\begin{reviewlistblock}'
  end
  if caption.present?
    if command =~ /emlist/ || command =~ /cmd/ || command =~ /source/
      captionstr = macro(command + 'caption', compile_inline(caption))
    else
      begin
        captionstr = if get_chap.nil?
                       macro('reviewlistcaption', "#{I18n.t('list')}#{I18n.t('format_number_header_without_chapter', [@chapter.list(id).number])}#{I18n.t('caption_prefix')}#{compile_inline(caption)}")
                     else
                       macro('reviewlistcaption', "#{I18n.t('list')}#{I18n.t('format_number_header', [get_chap, @chapter.list(id).number])}#{I18n.t('caption_prefix')}#{compile_inline(caption)}")
                     end
      rescue KeyError
        app_error "no such list: #{id}"
      end
    end
  end
  @doc_status[:caption] = nil

  if caption_top?('list') && captionstr
    puts captionstr
  end

  body = ''
  lines.each_with_index do |line, idx|
    body.concat(yield(line, idx))
  end
  puts macro('begin', command)
  print body
  puts macro('end', command)

  if !caption_top?('list') && captionstr
    puts captionstr
  end

  unless @book.config.check_version('2', exception: false)
    puts '\\end{reviewlistblock}'
  end
  blank
end
common_code_block_lst(_id, lines, command, title, caption, lang, first_line_num: 1) click to toggle source
# File lib/review/latexbuilder.rb, line 512
def common_code_block_lst(_id, lines, command, title, caption, lang, first_line_num: 1)
  if title == 'title' && caption.blank? && @book.config.check_version('2', exception: false)
    print '\vspace{-1.5em}'
  end
  body = lines.inject('') { |i, j| i + detab(j) + "\n" }
  args = make_code_block_args(title, caption, lang, first_line_num: first_line_num)
  puts %Q(\\begin{#{command}}[#{args}])
  print body
  puts %Q(\\end{#{command}})
  blank
end
compile_href(url, label) click to toggle source
# File lib/review/latexbuilder.rb, line 1436
def compile_href(url, label)
  if /\A[a-z]+:/.match?(url)
    if label
      macro('href', escape_url(url), escape(label))
    else
      macro('url', escape_url(url))
    end
  else
    macro('ref', url)
  end
end
compile_kw(word, alt) click to toggle source
# File lib/review/latexbuilder.rb, line 1428
def compile_kw(word, alt)
  if alt
    macro('reviewkw', escape(word)) + "(#{escape(alt.strip)})"
  else
    macro('reviewkw', escape(word))
  end
end
compile_ruby(base, ruby) click to toggle source
# File lib/review/latexbuilder.rb, line 1173
def compile_ruby(base, ruby)
  macro('ruby', escape(base), escape(ruby).gsub('\\textbar{}', '|'))
end
dd(lines) click to toggle source
# File lib/review/latexbuilder.rb, line 369
def dd(lines)
  if @book.config['join_lines_by_lang']
    puts join_lines_to_paragraph(lines)
  else
    puts lines.map(&:chomp).join("\n")
  end
end
direct(lines, fmt) click to toggle source
# File lib/review/latexbuilder.rb, line 1009
def direct(lines, fmt)
  return unless fmt == 'latex'

  lines.each do |line|
    puts line
  end
end
dl_begin() click to toggle source
# File lib/review/latexbuilder.rb, line 359
def dl_begin
  blank
  puts '\begin{description}'
end
dl_end() click to toggle source
# File lib/review/latexbuilder.rb, line 377
def dl_end
  puts '\end{description}'
  blank
end
dt(str) click to toggle source
# File lib/review/latexbuilder.rb, line 364
def dt(str)
  str = str.gsub('[', '\lbrack{}').gsub(']', '\rbrack{}')
  puts '\item[' + str + '] \mbox{} \\\\'
end
emlist(lines, caption = nil, lang = nil) click to toggle source
# File lib/review/latexbuilder.rb, line 420
def emlist(lines, caption = nil, lang = nil)
  blank
  if highlight_listings?
    common_code_block_lst(nil, lines, 'reviewemlistlst', 'title', caption, lang)
  else
    common_code_block(nil, lines, 'reviewemlist', caption, lang) { |line, idx| code_line('emlist', line, idx, nil, caption, lang) }
  end
end
emlistnum(lines, caption = nil, lang = nil) click to toggle source
# File lib/review/latexbuilder.rb, line 429
def emlistnum(lines, caption = nil, lang = nil)
  blank
  first_line_num = line_num
  if highlight_listings?
    common_code_block_lst(nil, lines, 'reviewemlistnumlst', 'title', caption, lang, first_line_num: first_line_num)
  else
    common_code_block(nil, lines, 'reviewemlist', caption, lang) { |line, idx| code_line_num('emlistnum', line, first_line_num, idx, nil, caption, lang) }
  end
end
emtable(lines, caption = nil) click to toggle source
# File lib/review/latexbuilder.rb, line 896
def emtable(lines, caption = nil)
  table(lines, nil, caption)
end
extname() click to toggle source
# File lib/review/latexbuilder.rb, line 26
def extname
  '.tex'
end
flushright(lines) click to toggle source
# File lib/review/latexbuilder.rb, line 961
def flushright(lines)
  latex_block('flushright', lines)
end
footnote(id, content) click to toggle source
# File lib/review/latexbuilder.rb, line 1132
def footnote(id, content)
  if @book.config['footnotetext'] || @foottext[id]
    if @doc_status[:column]
      warn "//footnote[#{id}] is in the column block. It is recommended to move out of the column block.", location: location
    end
    puts macro("footnotetext[#{@chapter.footnote(id).number}]", compile_inline(content.strip))
  end
end
handle_metric(str) click to toggle source
# File lib/review/latexbuilder.rb, line 567
def handle_metric(str)
  if @book.config['pdfmaker']['image_scale2width'] && str =~ /\Ascale=([\d.]+)\Z/
    return "width=#{$1}\\maxwidth"
  end

  str
end
headline(level, label, caption) click to toggle source
# File lib/review/latexbuilder.rb, line 132
def headline(level, label, caption)
  _, anchor = headline_prefix(level)
  headline_name = HEADLINE[level]
  if @chapter.is_a?(ReVIEW::Book::Part)
    if @book.config.check_version('2', exception: false)
      headline_name = 'part'
    elsif level == 1
      headline_name = 'part'
      puts '\begin{reviewpart}'
    end
  end
  prefix = ''
  if level > @book.config['secnolevel'] || (@chapter.number.to_s.empty? && level > 1)
    prefix = '*'
  end
  blank unless @output.pos == 0
  @doc_status[:caption] = true
  puts macro(headline_name + prefix, compile_inline(caption))
  @doc_status[:caption] = nil
  if prefix == '*' && level <= @book.config['toclevel'].to_i
    puts "\\addcontentsline{toc}{#{headline_name}}{#{compile_inline(caption)}}"
  end
  if level == 1
    puts macro('label', chapter_label)
  else
    puts macro('label', sec_label(anchor))
    puts macro('label', label) if label
  end
rescue StandardError
  app_error "unknown level: #{level}"
end
highlight?() click to toggle source
# File lib/review/latexbuilder.rb, line 402
def highlight?
  @book.config['highlight'] &&
    @book.config['highlight']['latex']
end
hr() click to toggle source
# File lib/review/latexbuilder.rb, line 1028
def hr
  puts '\hrule'
end
image_dummy(id, caption, lines) click to toggle source
# File lib/review/latexbuilder.rb, line 615
def image_dummy(id, caption, lines)
  warn "image not bound: #{id}", location: location
  puts '\begin{reviewdummyimage}'
  puts escape("--[[path = #{id} (#{existence(id)})]]--")
  lines.each do |line|
    puts "\n"
    puts detab(line.rstrip)
  end
  puts macro('label', image_label(id))
  @doc_status[:caption] = true
  if @book.config.check_version('2', exception: false)
    puts macro('caption', compile_inline(caption)) if caption.present?
  elsif caption.present?
    puts macro('reviewimagecaption', compile_inline(caption))
  end
  @doc_status[:caption] = nil
  puts '\end{reviewdummyimage}'
end
image_ext() click to toggle source
# File lib/review/latexbuilder.rb, line 1452
def image_ext
  'pdf'
end
image_header(id, caption) click to toggle source
# File lib/review/latexbuilder.rb, line 555
def image_header(id, caption)
end
image_image(id, caption = '', metric = nil) click to toggle source
# File lib/review/latexbuilder.rb, line 579
def image_image(id, caption = '', metric = nil)
  @doc_status[:caption] = true
  captionstr = if @book.config.check_version('2', exception: false)
                 macro('caption', compile_inline(caption)) + "\n"
               else
                 macro('reviewimagecaption', compile_inline(caption)) + "\n"
               end
  captionstr << macro('label', image_label(id))
  @doc_status[:caption] = nil

  metrics = parse_metric('latex', metric)
  # image is always bound here
  puts "\\begin{reviewimage}%%#{id}"

  if caption_top?('image')
    puts captionstr
  end

  command = 'reviewincludegraphics'
  if @book.config.check_version('2', exception: false)
    command = 'includegraphics'
  end

  if metrics.present?
    puts "\\#{command}[#{metrics}]{#{@chapter.image(id).path}}"
  else
    puts "\\#{command}[width=\\maxwidth]{#{@chapter.image(id).path}}"
  end

  unless caption_top?('image')
    puts captionstr
  end

  puts '\end{reviewimage}'
end
imgtable(lines, id, caption = nil, metric = nil) click to toggle source
# File lib/review/latexbuilder.rb, line 900
def imgtable(lines, id, caption = nil, metric = nil)
  unless @chapter.image_bound?(id)
    warn "image not bound: #{id}", location: location
    image_dummy(id, caption, lines)
    return
  end

  captionstr = nil
  begin
    if caption.present?
      puts "\\begin{table}[h]%%#{id}"
      @doc_status[:caption] = true
      captionstr = macro('reviewimgtablecaption', compile_inline(caption))
      @doc_status[:caption] = nil
      if caption_top?('table')
        puts captionstr
      end
    end
    puts macro('label', table_label(id))
  rescue ReVIEW::KeyError
    app_error "no such table: #{id}"
  end
  imgtable_image(id, caption, metric)

  if caption.present?
    unless caption_top?('table')
      puts captionstr
    end
    puts '\end{table}'
  end
  blank
end
imgtable_image(id, _caption, metric) click to toggle source
# File lib/review/latexbuilder.rb, line 933
def imgtable_image(id, _caption, metric)
  metrics = parse_metric('latex', metric)
  # image is always bound here
  puts "\\begin{reviewimage}%%#{id}"

  command = 'reviewincludegraphics'
  if @book.config.check_version('2', exception: false)
    command = 'includegraphics'
  end

  if metrics.present?
    puts "\\#{command}[#{metrics}]{#{@chapter.image(id).path}}"
  else
    puts "\\#{command}[width=\\maxwidth]{#{@chapter.image(id).path}}"
  end
  puts '\end{reviewimage}'
end
indepimage(lines, id, caption = nil, metric = nil) click to toggle source
# File lib/review/latexbuilder.rb, line 674
def indepimage(lines, id, caption = nil, metric = nil)
  metrics = parse_metric('latex', metric)

  captionstr = nil
  if caption.present?
    @doc_status[:caption] = true
    captionstr = macro('reviewindepimagecaption',
                       %Q(#{I18n.t('numberless_image')}#{I18n.t('caption_prefix')}#{compile_inline(caption)}))
    @doc_status[:caption] = nil
  end

  if @chapter.image(id).path
    puts "\\begin{reviewimage}%%#{id}"

    if caption_top?('image') && captionstr
      puts captionstr
    end

    command = 'reviewincludegraphics'
    if @book.config.check_version('2', exception: false)
      command = 'includegraphics'
    end

    if metrics.present?
      puts "\\#{command}[#{metrics}]{#{@chapter.image(id).path}}"
    else
      puts "\\#{command}[width=\\maxwidth]{#{@chapter.image(id).path}}"
    end
  else
    warn "image not bound: #{id}", location: location
    puts '\begin{reviewdummyimage}'
    puts escape("--[[path = #{escape(id)} (#{existence(id)})]]--")
    lines.each do |line|
      puts "\n"
      puts detab(line.rstrip)
    end
  end

  if !caption_top?('image') && captionstr
    puts captionstr
  end

  if @chapter.image(id).path
    puts '\end{reviewimage}'
  else
    puts '\end{reviewdummyimage}'
  end
end
Also aliased as: numberlessimage
index(str) click to toggle source
# File lib/review/latexbuilder.rb, line 1405
def index(str)
  # XXX: mendex/upmendex specific
  sa = str.split('<<>>')

  sa.map! do |item|
    if @index_db[item]
      escape_mendex_key(escape_index(@index_db[item])) + '@' + escape_mendex_display(escape_index(escape(item)))
    elsif item =~ /\A[[:ascii:]]+\Z/ || @index_mecab.nil?
      esc_item = escape_mendex_display(escape_index(escape(item)))
      if esc_item == item
        esc_item
      else
        "#{escape_mendex_key(escape_index(item))}@#{esc_item}"
      end
    else
      yomi = NKF.nkf('-w --hiragana', @index_mecab.parse(item).force_encoding('UTF-8').chomp)
      escape_mendex_key(escape_index(yomi)) + '@' + escape_mendex_display(escape_index(escape(item)))
    end
  end

  "\\index{#{sa.join('!')}}"
end
inline_ami(str) click to toggle source
# File lib/review/latexbuilder.rb, line 1347
def inline_ami(str)
  macro('reviewami', escape(str))
end
inline_b(str) click to toggle source

bold

# File lib/review/latexbuilder.rb, line 1211
def inline_b(str)
  if @book.config.check_version('2', exception: false)
    macro('textbf', escape(str))
  else
    macro('reviewbold', escape(str))
  end
end
inline_balloon(str) click to toggle source
# File lib/review/latexbuilder.rb, line 1386
def inline_balloon(str)
  macro('reviewballoon', escape(str))
end
inline_bib(id) click to toggle source
# File lib/review/latexbuilder.rb, line 1274
def inline_bib(id)
  macro('reviewbibref', "[#{@chapter.bibpaper(id).number}]", bib_label(id))
end
inline_bou(str) click to toggle source
# File lib/review/latexbuilder.rb, line 1169
def inline_bou(str)
  macro('reviewbou', escape(str))
end
inline_br(_str) click to toggle source

line break

# File lib/review/latexbuilder.rb, line 1220
def inline_br(_str)
  "\\\\\n"
end
inline_chap(id) click to toggle source
# File lib/review/latexbuilder.rb, line 1060
def inline_chap(id)
  if @book.config['chapterlink']
    "\\reviewchapref{#{@book.chapter_index.number(id)}}{chap:#{id}}"
  else
    @book.chapter_index.number(id)
  end
rescue KeyError
  app_error "unknown chapter: #{id}"
  nofunc_text("[UnknownChapter:#{id}]")
end
inline_chapref(id) click to toggle source
Calls superclass method ReVIEW::Builder#inline_chapref
# File lib/review/latexbuilder.rb, line 1048
def inline_chapref(id)
  title = super
  if @book.config['chapterlink']
    "\\reviewchapref{#{title}}{chap:#{id}}"
  else
    title
  end
rescue KeyError
  app_error "unknown chapter: #{id}"
  nofunc_text("[UnknownChapter:#{id}]")
end
inline_code(str) click to toggle source

@<code> is same as @<tt>

# File lib/review/latexbuilder.rb, line 1230
def inline_code(str)
  if @book.config.check_version('2', exception: false)
    macro('texttt', escape(str))
  else
    macro('reviewcode', escape(str))
  end
end
inline_column_chap(chapter, id) click to toggle source
# File lib/review/latexbuilder.rb, line 1315
def inline_column_chap(chapter, id)
  macro('reviewcolumnref',
        I18n.t('column', compile_inline(chapter.column(id).caption)),
        column_label(id, chapter))
rescue KeyError
  app_error "unknown column: #{id}"
end
inline_comment(str) click to toggle source
# File lib/review/latexbuilder.rb, line 1374
def inline_comment(str)
  if @book.config['draft']
    macro('pdfcomment', escape(str))
  else
    ''
  end
end
inline_del(str) click to toggle source
# File lib/review/latexbuilder.rb, line 1254
def inline_del(str)
  macro('reviewstrike', escape(str))
end
inline_dtp(_str) click to toggle source
# File lib/review/latexbuilder.rb, line 1224
def inline_dtp(_str)
  # ignore
  ''
end
inline_em(str) click to toggle source
# File lib/review/latexbuilder.rb, line 1335
def inline_em(str)
  macro('reviewem', escape(str))
end
inline_endnote(id) click to toggle source
# File lib/review/latexbuilder.rb, line 1154
def inline_endnote(id)
  macro('endnote', compile_inline(@chapter.endnote(id).content.strip))
rescue KeyError
  app_error "unknown footnote: #{id}"
end
inline_eq(id) click to toggle source
# File lib/review/latexbuilder.rb, line 1121
def inline_eq(id)
  chapter, id = extract_chapter_id(id)
  if get_chap(chapter).nil?
    macro('reviewequationref', I18n.t('format_number_without_chapter', [chapter.equation(id).number]))
  else
    macro('reviewequationref', I18n.t('format_number', [get_chap(chapter), chapter.equation(id).number]))
  end
rescue KeyError
  app_error "unknown equation: #{id}"
end
inline_fn(id) click to toggle source
# File lib/review/latexbuilder.rb, line 1141
def inline_fn(id)
  if @book.config['footnotetext']
    macro("footnotemark[#{@chapter.footnote(id).number}]", '')
  elsif @doc_status[:caption] || @doc_status[:table] || @doc_status[:column] || @doc_status[:dt]
    @foottext[id] = @chapter.footnote(id).number
    macro('protect\\footnotemark', '')
  else
    macro('footnote', compile_inline(@chapter.footnote(id).content.strip))
  end
rescue KeyError
  app_error "unknown footnote: #{id}"
end
inline_hd_chap(chap, id) click to toggle source
# File lib/review/latexbuilder.rb, line 1278
def inline_hd_chap(chap, id)
  n = chap.headline_index.number(id)
  str = if n.present? && chap.number && over_secnolevel?(n)
          I18n.t('hd_quote', [chap.headline_index.number(id), compile_inline(chap.headline(id).caption)])
        else
          I18n.t('hd_quote_without_number', compile_inline(chap.headline(id).caption))
        end
  if @book.config['chapterlink']
    anchor = n.tr('.', '-')
    macro('reviewsecref', str, sec_label(anchor))
  else
    str
  end
end
inline_hi(str) click to toggle source

hidden index

# File lib/review/latexbuilder.rb, line 1187
def inline_hi(str)
  index(str)
end
inline_hidx(str) click to toggle source

hidden index

# File lib/review/latexbuilder.rb, line 1206
def inline_hidx(str)
  index(str)
end
inline_i(str) click to toggle source

index -> italic

# File lib/review/latexbuilder.rb, line 1192
def inline_i(str)
  if @book.config.check_version('2', exception: false)
    macro('textit', escape(str))
  else
    macro('reviewit', escape(str))
  end
end
inline_icon(id) click to toggle source
# File lib/review/latexbuilder.rb, line 1351
def inline_icon(id)
  if @chapter.image(id).path
    command = 'reviewicon'
    if @book.config.check_version('2', exception: false)
      command = 'includegraphics'
    end
    macro(command, @chapter.image(id).path)
  else
    warn "image not bound: #{id}", location: location
    "\\verb|--[[path = #{id} (#{existence(id)})]]--|"
  end
end
inline_idx(str) click to toggle source

index

# File lib/review/latexbuilder.rb, line 1201
def inline_idx(str)
  escape(str) + index(str)
end
inline_img(id) click to toggle source
# File lib/review/latexbuilder.rb, line 1110
def inline_img(id)
  chapter, id = extract_chapter_id(id)
  if get_chap(chapter).nil?
    macro('reviewimageref', I18n.t('format_number_without_chapter', [chapter.image(id).number]), image_label(id, chapter))
  else
    macro('reviewimageref', I18n.t('format_number', [get_chap(chapter), chapter.image(id).number]), image_label(id, chapter))
  end
rescue KeyError
  app_error "unknown image: #{id}"
end
inline_ins(str) click to toggle source
# File lib/review/latexbuilder.rb, line 1250
def inline_ins(str)
  macro('reviewinsert', escape(str))
end
inline_list(id) click to toggle source

FIXME: use TeX native label/ref.

# File lib/review/latexbuilder.rb, line 1088
def inline_list(id)
  chapter, id = extract_chapter_id(id)
  if get_chap(chapter).nil?
    macro('reviewlistref', I18n.t('format_number_without_chapter', [chapter.list(id).number]))
  else
    macro('reviewlistref', I18n.t('format_number', [get_chap(chapter), chapter.list(id).number]))
  end
rescue KeyError
  app_error "unknown list: #{id}"
end
inline_m(str) click to toggle source

math

# File lib/review/latexbuilder.rb, line 1178
def inline_m(str)
  if @book.config.check_version('2', exception: false)
    " $#{str}$ "
  else
    "$#{str}$"
  end
end
inline_pageref(id) click to toggle source
# File lib/review/latexbuilder.rb, line 1083
def inline_pageref(id)
  "\\pageref{#{id}}"
end
inline_raw(str) click to toggle source
Calls superclass method ReVIEW::Builder#inline_raw
# File lib/review/latexbuilder.rb, line 1323
def inline_raw(str) # rubocop:disable Lint/UselessMethodDefinition
  super
end
inline_sec(id) click to toggle source
Calls superclass method ReVIEW::Builder#inline_sec
# File lib/review/latexbuilder.rb, line 1293
def inline_sec(id)
  if @book.config['chapterlink']
    n = super
    anchor = n.tr('.', '-')
    macro('reviewsecref', n, sec_label(anchor))
  else
    super
  end
rescue KeyError
  app_error "unknown headline: #{id}"
end
inline_sectitle(id) click to toggle source
Calls superclass method ReVIEW::Builder#inline_sectitle
# File lib/review/latexbuilder.rb, line 1305
def inline_sectitle(id)
  if @book.config['chapterlink']
    chap, id2 = extract_chapter_id(id)
    anchor = chap.headline_index.number(id2).tr('.', '-')
    macro('reviewsecref', super, sec_label(anchor))
  else
    super
  end
end
inline_strong(str) click to toggle source
# File lib/review/latexbuilder.rb, line 1339
def inline_strong(str)
  macro('reviewstrong', escape(str))
end
inline_sub(str) click to toggle source
# File lib/review/latexbuilder.rb, line 1327
def inline_sub(str)
  macro('textsubscript', escape(str))
end
inline_sup(str) click to toggle source
# File lib/review/latexbuilder.rb, line 1331
def inline_sup(str)
  macro('textsuperscript', escape(str))
end
inline_table(id) click to toggle source
# File lib/review/latexbuilder.rb, line 1099
def inline_table(id)
  chapter, id = extract_chapter_id(id)
  if get_chap(chapter).nil?
    macro('reviewtableref', I18n.t('format_number_without_chapter', [chapter.table(id).number]), table_label(id, chapter))
  else
    macro('reviewtableref', I18n.t('format_number', [get_chap(chapter), chapter.table(id).number]), table_label(id, chapter))
  end
rescue KeyError
  app_error "unknown table: #{id}"
end
inline_tcy(str) click to toggle source
# File lib/review/latexbuilder.rb, line 1382
def inline_tcy(str)
  macro('reviewtcy', escape(str))
end
inline_title(id) click to toggle source
Calls superclass method ReVIEW::Builder#inline_title
# File lib/review/latexbuilder.rb, line 1071
def inline_title(id)
  title = super
  if @book.config['chapterlink']
    "\\reviewchapref{#{title}}{chap:#{id}}"
  else
    title
  end
rescue KeyError
  app_error "unknown chapter: #{id}"
  nofunc_text("[UnknownChapter:#{id}]")
end
inline_tt(str) click to toggle source
# File lib/review/latexbuilder.rb, line 1242
def inline_tt(str)
  if @book.config.check_version('2', exception: false)
    macro('texttt', escape(str))
  else
    macro('reviewtt', escape(str))
  end
end
inline_ttb(str) click to toggle source
# File lib/review/latexbuilder.rb, line 1266
def inline_ttb(str)
  if @book.config.check_version('2', exception: false)
    macro('texttt', macro('textbf', escape(str)))
  else
    macro('reviewttb', escape(str))
  end
end
inline_tti(str) click to toggle source
# File lib/review/latexbuilder.rb, line 1258
def inline_tti(str)
  if @book.config.check_version('2', exception: false)
    macro('texttt', macro('textit', escape(str)))
  else
    macro('reviewtti', escape(str))
  end
end
inline_u(str) click to toggle source
# File lib/review/latexbuilder.rb, line 1343
def inline_u(str)
  macro('reviewunderline', escape(str))
end
inline_uchar(str) click to toggle source
# File lib/review/latexbuilder.rb, line 1364
def inline_uchar(str)
  if @texcompiler && @texcompiler.start_with?('platex')
    # with otf package
    macro('UTF', escape(str))
  else
    # passthrough
    [str.to_i(16)].pack('U')
  end
end
label(id) click to toggle source
# File lib/review/latexbuilder.rb, line 1032
def label(id)
  puts macro('label', id)
end
latextsize(str) click to toggle source
# File lib/review/latexbuilder.rb, line 1448
def latextsize(str)
  @latex_tsize = str
end
lead(lines)
Alias for: read
list(lines, id, caption, lang = nil) click to toggle source

override Builder#list

# File lib/review/latexbuilder.rb, line 440
def list(lines, id, caption, lang = nil)
  if highlight_listings?
    common_code_block_lst(id, lines, 'reviewlistlst', 'caption', caption, lang)
  else
    common_code_block(id, lines, 'reviewlist', caption, lang) { |line, idx| code_line('list', line, idx, id, caption, lang) }
  end
end
listnum(lines, id, caption, lang = nil) click to toggle source

override Builder#listnum

# File lib/review/latexbuilder.rb, line 449
def listnum(lines, id, caption, lang = nil)
  first_line_num = line_num
  if highlight_listings?
    common_code_block_lst(id, lines, 'reviewlistnumlst', 'caption', caption, lang, first_line_num: first_line_num)
  else
    common_code_block(id, lines, 'reviewlist', caption, lang) { |line, idx| code_line_num('listnum', line, first_line_num, idx, id, caption, lang) }
  end
end
load_idxdb(file) click to toggle source
# File lib/review/latexbuilder.rb, line 68
def load_idxdb(file)
  table = {}
  File.foreach(file) do |line|
    key, value = *line.strip.split(/\t+/, 2)
    table[key] = value
  end
  table
end
make_code_block_args(title, caption, lang, first_line_num: 1) click to toggle source
# File lib/review/latexbuilder.rb, line 524
def make_code_block_args(title, caption, lang, first_line_num: 1)
  caption_str = compile_inline((caption || ''))
  if title == 'title' && caption_str == '' && @book.config.check_version('2', exception: false)
    caption_str = '\relax' ## dummy charactor to remove lstname
  end
  lexer = if @book.config['highlight'] && @book.config['highlight']['lang']
            @book.config['highlight']['lang'] # default setting
          else
            ''
          end
  lexer = lang if lang.present?
  args = "language={#{lexer}}"
  if title == 'title' && caption_str == ''
    # ignore
  else
    args = "#{title}={#{caption_str}}," + args
  end
  if first_line_num != 1
    args << ",firstnumber=#{first_line_num}"
  end
  args
end
nodisp_begin(level, _label, caption) click to toggle source
# File lib/review/latexbuilder.rb, line 185
def nodisp_begin(level, _label, caption)
  if @output.pos == 0
    puts macro('clearpage')
  else
    blank
  end
  puts macro('addcontentsline', 'toc', HEADLINE[level], compile_inline(caption))
  # FIXME: headings
end
nodisp_end(level) click to toggle source
# File lib/review/latexbuilder.rb, line 195
def nodisp_end(level)
end
nofunc_text(str) click to toggle source
# File lib/review/latexbuilder.rb, line 1238
def nofunc_text(str)
  escape(str)
end
noindent() click to toggle source
# File lib/review/latexbuilder.rb, line 1044
def noindent
  print '\noindent'
end
nonum_begin(level, _label, caption) click to toggle source
# File lib/review/latexbuilder.rb, line 164
def nonum_begin(level, _label, caption)
  blank unless @output.pos == 0
  @doc_status[:caption] = true
  puts macro(HEADLINE[level] + '*', compile_inline(caption))
  @doc_status[:caption] = nil
  puts macro('addcontentsline', 'toc', HEADLINE[level], compile_inline(caption))
end
nonum_end(level) click to toggle source
# File lib/review/latexbuilder.rb, line 172
def nonum_end(level)
end
notoc_begin(level, _label, caption) click to toggle source
# File lib/review/latexbuilder.rb, line 175
def notoc_begin(level, _label, caption)
  blank unless @output.pos == 0
  @doc_status[:caption] = true
  puts macro(HEADLINE[level] + '*', compile_inline(caption))
  @doc_status[:caption] = nil
end
notoc_end(level) click to toggle source
# File lib/review/latexbuilder.rb, line 182
def notoc_end(level)
end
numberlessimage(lines, id, caption = nil, metric = nil)
Alias for: indepimage
ol_begin() click to toggle source
# File lib/review/latexbuilder.rb, line 335
def ol_begin
  blank
  puts '\begin{enumerate}'
  return true unless @ol_num

  puts "\\setcounter{enumi}{#{@ol_num - 1}}"
  @ol_num = nil
end
ol_end() click to toggle source
# File lib/review/latexbuilder.rb, line 354
def ol_end
  puts '\end{enumerate}'
  blank
end
ol_item(lines, _num) click to toggle source
# File lib/review/latexbuilder.rb, line 344
def ol_item(lines, _num)
  str = join_lines_to_paragraph(lines)
  unless @book.config['join_lines_by_lang']
    str = lines.map(&:chomp).join("\n")
  end

  str.sub!(/\A(\[)/) { '\lbrack{}' }
  puts '\item ' + str
end
olnum(num) click to toggle source
# File lib/review/latexbuilder.rb, line 1456
def olnum(num)
  @ol_num = num.to_i
end
pagebreak() click to toggle source
# File lib/review/latexbuilder.rb, line 1036
def pagebreak
  puts '\pagebreak'
end
paragraph(lines) click to toggle source
# File lib/review/latexbuilder.rb, line 382
def paragraph(lines)
  blank
  if @book.config['join_lines_by_lang']
    puts join_lines_to_paragraph(lines)
  else
    lines.each { |line| puts line }
  end
  blank
end
parasep() click to toggle source
# File lib/review/latexbuilder.rb, line 392
def parasep
  puts '\\parasep'
end
parse_metric(type, metric) click to toggle source
Calls superclass method ReVIEW::Builder#parse_metric
# File lib/review/latexbuilder.rb, line 558
def parse_metric(type, metric)
  s = super
  if @book.config['pdfmaker']['use_original_image_size'] && s.empty? && !metric.present?
    return ' ' # pass empty to \reviewincludegraphics
  end

  s
end
printendnotes() click to toggle source
# File lib/review/latexbuilder.rb, line 1160
def printendnotes
  @shown_endnotes = true
  blank
  puts '\theendnotes'
  blank
end
quote(lines) click to toggle source
# File lib/review/latexbuilder.rb, line 951
def quote(lines)
  latex_block('quote', lines)
end
read(lines) click to toggle source
# File lib/review/latexbuilder.rb, line 396
def read(lines)
  latex_block('quotation', lines)
end
Also aliased as: lead
result() click to toggle source
# File lib/review/latexbuilder.rb, line 100
def result
  check_printendnotes

  if @chapter.is_a?(ReVIEW::Book::Part) && !@book.config.check_version('2', exception: false)
    puts '\end{reviewpart}'
  end
  solve_nest(@output.string)
end
result_metric(array) click to toggle source
# File lib/review/latexbuilder.rb, line 575
def result_metric(array)
  array.join(',')
end
separate_tsize(size) click to toggle source
# File lib/review/latexbuilder.rb, line 821
def separate_tsize(size)
  ret = []
  s = ''
  brace = nil
  size.chars.each do |ch|
    case ch
    when '|'
      next
    when '{'
      brace = true
      s << ch
    when '}'
      brace = nil
      s << ch
      ret << s
      s = ''
    else
      if brace || s.empty?
        s << ch
      else
        ret << s
        s = ch
      end
    end
  end

  unless s.empty?
    ret << s
  end

  ret
end
setup_index() click to toggle source
# File lib/review/latexbuilder.rb, line 45
def setup_index
  @index_db = {}
  @index_mecab = nil
  return true unless @book.config['pdfmaker']['makeindex']

  if @book.config['pdfmaker']['makeindex_dic']
    @index_db = load_idxdb(@book.config['pdfmaker']['makeindex_dic'])
  end
  return true unless @book.config['pdfmaker']['makeindex_mecab']

  begin
    begin
      require 'MeCab'
    rescue LoadError
      require 'mecab'
    end
    require 'nkf'
    @index_mecab = MeCab::Tagger.new(@book.config['pdfmaker']['makeindex_mecab_opts'])
  rescue LoadError
    warn 'not found MeCab', location: location
  end
end
solve_nest(s) click to toggle source
# File lib/review/latexbuilder.rb, line 109
def solve_nest(s)
  check_nest
  s.gsub("\\end{description}\n\n\x01→dl←\x01\n", "\n").
    gsub("\x01→/dl←\x01", "\\end{description}←END\x01").
    gsub("\\end{itemize}\n\n\x01→ul←\x01\n", "\n").
    gsub("\x01→/ul←\x01", "\\end{itemize}←END\x01").
    gsub("\\end{enumerate}\n\n\x01→ol←\x01\n", "\n").
    gsub("\x01→/ol←\x01", "\\end{enumerate}←END\x01").
    gsub("\\end{description}←END\x01\n\n\\begin{description}", '').
    gsub("\\end{itemize}←END\x01\n\n\\begin{itemize}", '').
    gsub("\\end{enumerate}←END\x01\n\n\\begin{enumerate}", '').
    gsub("←END\x01", '')
end
source(lines, caption = nil, lang = nil) click to toggle source
# File lib/review/latexbuilder.rb, line 547
def source(lines, caption = nil, lang = nil)
  if highlight_listings?
    common_code_block_lst(nil, lines, 'reviewsourcelst', 'title', caption, lang)
  else
    common_code_block(nil, lines, 'reviewsource', caption, lang) { |line, idx| code_line('source', line, idx, nil, caption, lang) }
  end
end
table(lines, id = nil, caption = nil) click to toggle source
# File lib/review/latexbuilder.rb, line 725
def table(lines, id = nil, caption = nil)
  if caption.present?
    if @book.config.check_version('2', exception: false)
      puts "\\begin{table}[h]%%#{id}"
    else
      puts "\\begin{table}%%#{id}"
    end
  end

  sepidx, rows = parse_table_rows(lines)
  begin
    if caption_top?('table') && caption.present?
      table_header(id, caption)
    end
  rescue KeyError
    app_error "no such table: #{id}"
  end
  table_begin(rows.first.size)
  table_rows(sepidx, rows)
  table_end
  if caption.present?
    unless caption_top?('table')
      table_header(id, caption)
    end
    puts '\end{table}'
  end
  blank
end
table_begin(ncols) click to toggle source
# File lib/review/latexbuilder.rb, line 800
def table_begin(ncols)
  if @latex_tsize
    @tsize = @latex_tsize
  end

  if @tsize
    if /\A[\d., ]+\Z/.match?(@tsize)
      @cellwidth = @tsize.split(/\s*,\s*/)
      @cellwidth.collect! { |i| "p{#{i}mm}" }
      puts macro('begin', 'reviewtable', '|' + @cellwidth.join('|') + '|')
    else
      @cellwidth = separate_tsize(@tsize)
      puts macro('begin', 'reviewtable', @tsize)
    end
  else
    puts macro('begin', 'reviewtable', (['|'] * (ncols + 1)).join('l'))
    @cellwidth = ['l'] * ncols
  end
  puts '\\hline'
end
table_end() click to toggle source
# File lib/review/latexbuilder.rb, line 889
def table_end
  puts macro('end', 'reviewtable')
  @tsize = nil
  @latex_tsize = nil
  @cellwidth = nil
end
table_header(id, caption) click to toggle source
# File lib/review/latexbuilder.rb, line 783
def table_header(id, caption)
  if id.nil?
    if caption.present?
      @doc_status[:caption] = true
      puts macro('reviewtablecaption*', compile_inline(caption))
      @doc_status[:caption] = nil
    end
  else
    if caption.present?
      @doc_status[:caption] = true
      puts macro('reviewtablecaption', compile_inline(caption))
      @doc_status[:caption] = nil
    end
    puts macro('label', table_label(id))
  end
end
table_rows(sepidx, rows) click to toggle source
# File lib/review/latexbuilder.rb, line 754
def table_rows(sepidx, rows)
  if sepidx
    sepidx.times do
      cno = -1
      tr(rows.shift.map do |s|
           cno += 1
           th(s, @cellwidth[cno])
         end)
    end
    rows.each do |cols|
      cno = -1
      tr(cols.map do |s|
           cno += 1
           td(s, @cellwidth[cno])
         end)
    end
  else
    rows.each do |cols|
      h, *cs = *cols
      cno = 0
      tr([th(h, @cellwidth[0])] +
         cs.map do |s|
           cno += 1
           td(s, @cellwidth[cno])
         end)
    end
  end
end
table_separator() click to toggle source
# File lib/review/latexbuilder.rb, line 854
def table_separator
  # puts '\hline'
end
td(s, cellwidth = 'l') click to toggle source
# File lib/review/latexbuilder.rb, line 871
def td(s, cellwidth = 'l')
  if /\\\\/.match?(s)
    if !@book.config.check_version('2', exception: false) && cellwidth =~ /\{/
      s.gsub("\\\\\n", '\\newline{}')
    else
      ## use shortstack for @<br>
      macro('shortstack[l]', s)
    end
  else
    s
  end
end
texequation(lines, id = nil, caption = '') click to toggle source
# File lib/review/latexbuilder.rb, line 965
def texequation(lines, id = nil, caption = '')
  blank
  captionstr = nil

  if id
    puts macro('begin', 'reviewequationblock')
    captionstr = if get_chap.nil?
                   macro('reviewequationcaption', "#{I18n.t('equation')}#{I18n.t('format_number_header_without_chapter', [@chapter.equation(id).number])}#{I18n.t('caption_prefix')}#{compile_inline(caption)}")
                 else
                   macro('reviewequationcaption', "#{I18n.t('equation')}#{I18n.t('format_number_header', [get_chap, @chapter.equation(id).number])}#{I18n.t('caption_prefix')}#{compile_inline(caption)}")
                 end
  end

  if caption_top?('equation') && captionstr
    puts captionstr
  end

  puts macro('begin', 'equation*')
  lines.each do |line|
    puts line
  end
  puts macro('end', 'equation*')

  if !caption_top?('equation') && captionstr
    puts captionstr
  end

  if id
    puts macro('end', 'reviewequationblock')
  end

  blank
end
th(s, cellwidth = 'l') click to toggle source
# File lib/review/latexbuilder.rb, line 858
def th(s, cellwidth = 'l')
  if /\\\\/.match?(s)
    if !@book.config.check_version('2', exception: false) && cellwidth =~ /\{/
      macro('reviewth', s.gsub("\\\\\n", '\\newline{}'))
    else
      ## use shortstack for @<br>
      macro('reviewth', macro('shortstack[l]', s))
    end
  else
    macro('reviewth', s)
  end
end
tr(rows) click to toggle source
# File lib/review/latexbuilder.rb, line 884
def tr(rows)
  print rows.join(' & ')
  puts ' \\\\  \hline'
end
ul_begin() click to toggle source
# File lib/review/latexbuilder.rb, line 315
def ul_begin
  blank
  puts '\begin{itemize}'
end
ul_end() click to toggle source
# File lib/review/latexbuilder.rb, line 330
def ul_end
  puts '\end{itemize}'
  blank
end
ul_item(lines) click to toggle source
# File lib/review/latexbuilder.rb, line 320
def ul_item(lines)
  str = join_lines_to_paragraph(lines)
  unless @book.config['join_lines_by_lang']
    str = lines.map(&:chomp).join("\n")
  end

  str.sub!(/\A(\[)/) { '\lbrack{}' }
  puts '\item ' + str
end

Private Instance Methods

bib_label(id) click to toggle source
# File lib/review/latexbuilder.rb, line 661
def bib_label(id)
  "bib:#{id}"
end
blank() click to toggle source
# File lib/review/latexbuilder.rb, line 77
def blank
  @blank_needed = true
end
builder_init_file() click to toggle source
Calls superclass method ReVIEW::Builder#builder_init_file
# File lib/review/latexbuilder.rb, line 30
def builder_init_file
  super
  @chapter.book.image_types = %w[.ai .eps .pdf .tif .tiff .png .bmp .jpg .jpeg .gif]
  @blank_needed = false
  @latex_tsize = nil
  @tsize = nil
  @cellwidth = nil
  @ol_num = nil
  @first_line_num = nil
  @foottext = {}
  setup_index
  initialize_metachars(@book.config['texcommand'])
end
chapter_label() click to toggle source
# File lib/review/latexbuilder.rb, line 645
def chapter_label
  "chap:#{@chapter.id}"
end
column_label(id, chapter = nil) click to toggle source
# File lib/review/latexbuilder.rb, line 666
def column_label(id, chapter = nil)
  chapter ||= @chapter
  filename = chapter.id
  num = chapter.column(id).number
  "column:#{filename}:#{num}"
end
existence(id) click to toggle source
# File lib/review/latexbuilder.rb, line 634
def existence(id)
  @chapter.image_bound?(id) ? 'exist' : 'not exist'
end
highlight_listings?() click to toggle source
# File lib/review/latexbuilder.rb, line 407
def highlight_listings?
  @book.config['highlight'] && @book.config['highlight']['latex'] == 'listings'
end
image_label(id, chapter = nil) click to toggle source
# File lib/review/latexbuilder.rb, line 639
def image_label(id, chapter = nil)
  chapter ||= @chapter
  "image:#{chapter.id}:#{id}"
end
latex_block(type, lines) click to toggle source
# File lib/review/latexbuilder.rb, line 999
def latex_block(type, lines)
  blank
  puts macro('begin', type)
  blocked_lines = split_paragraph(lines)
  puts blocked_lines.join("\n\n")
  puts macro('end', type)
  blank
end
print(*s) click to toggle source
Calls superclass method ReVIEW::Builder#print
puts(*s) click to toggle source
Calls superclass method ReVIEW::Builder#puts
# File lib/review/latexbuilder.rb, line 91
def puts(*s)
  if @blank_needed
    @output.puts
    @blank_needed = false
  end
  super
end
sec_label(sec_anchor) click to toggle source
# File lib/review/latexbuilder.rb, line 650
def sec_label(sec_anchor)
  "sec:#{sec_anchor}"
end
table_label(id, chapter = nil) click to toggle source
# File lib/review/latexbuilder.rb, line 655
def table_label(id, chapter = nil)
  chapter ||= @chapter
  "table:#{chapter.id}:#{id}"
end