【概要】

dmath,math環境をequationに変換

【入力:hiki】

mathがうまくいくかどうかの検討用サンプルです.
さらにinlineで{{math 'x_i'}}なんかもできるといいのですが.

mathがうまくいくかどうかの検討用サンプルです. さらにinlineで'x_i'}なんかもできるといいのですが.

【出力:latex】

\begin{document}
mathがうまくいくかどうかの検討用サンプルです.
\begin{equation}
f_x
\end{equation}
さらにinlineで$x_i$なんかもできるといいのですが.
注2016/02/20
このあたりでhiki, rubyを指定するとlistingsがうまく処理できない.preformatted\_without\_styleで対応.

【コード解説】

evaluate_plugin_block

すこしトリッキーだったので,メモです.

  def evaluate_plugin_block(str, buf = nil)
    buf ||= @output.container
    str.split(/(\0\d+\0)/).each do |s|
      if s[0, 1] == "\0" and s[-1, 1] == "\0"
        buf << @output.inline_plugin(plugin_block(s[1..-2].to_i))
      else
        buf << @output.text(s)
      end
    end
    buf
  end

としてinline_pluginはblock_pluginと違った扱いになっています.bufに一度溜め込んでそれを@fに吐いているようです. そこで,@output.inline_pluginで行き着く先が,LatexOutputの

  def inline_plugin(src)
    tmp=[]
    if ( /(\w+)\((.+)\)/ =~ src ) or ( /(\w+).\'(.+)\'/ =~src ) or (/(\w+)/ =~ src)
      tmp = [$1,$2]
    end

    case tmp[0]
    when 'dmath'
      "\\begin{equation}\n#{tmp[1]}\n\\end{equation}"
    when 'math'
      "\$#{tmp[1]}\$"
    else
      %Q(<span class="plugin">{{#{src}}}</span>)
    end
  end

としてmath,dmathを処理しています.必要ならそれ以外のinlineもここに付け足すことで対応できます.

snake_nameがlatexで引っかかる

math環境の移し替えはうまくいったが,underscore_namesがすべて引っかかるequationとして引っかかる.

\usepackage{underscore}

だけでもできるようだが,できればto_latexで対応したい.ということで,paragraphにescape_snake_namesを入れた.

paragraphはpreformattedからは呼ばれない.しかし,\verb|$$|や\verb|\beginequation...\endequation|が含まれる.そこで 一旦全置換してそこだけ戻すようにした.gsubのなかでなんどもできるか自信がなくて.二重のgsubにしているが...

  def escape_snake_names(str)
    str.gsub!(/_/,"\\_")
    str.gsub!(/\$.+?\$/){ |text| text.gsub!(/\\_/,"_")  }
    str.gsub!(/equation.+?equation/m){ |text| text.gsub!(/\\_/,"_") }
  end

  def paragraph(lines)
    lines.each{|line| line = escape_snake_names(line) }
    @f << "#{lines.join("\n")}\n\n"
  end

gsub!で置換できなかったときには,nilが返るので対応.なんかえらく冗長.

  def escape_snake_names(str)
    str.gsub!(/_/,"\\_")
    str.gsub!(/\$.+?\$/){ |text|
      if text =~ /\\_/ then
        text.gsub!(/\\_/,"_")
        else
        text
      end
    }
    str.gsub!(/equation.+?equation/m){ |text|
      if text =~ /\\_/ then
        text.gsub!(/\\_/,"_")
        else
        text
      end
    }
    str
  end

escape_snake_namesを改良(2016/02/14)

gemへの公開にあたって冗長部を簡略化.verbだけはここを切り出した検証とは違う.testにuriを埋め込んでverb変換とsnakeを検証.

  def escape_snake_names(str)
    str.gsub!(/_/,"\\_")
    patterns = [/\$(.+?)\$/ , /\\verb\|(.+?)\|/, /equation(.+?)equation/m ]
    patterns.each{|pattern|
      str.gsub!(/\\_/,"_")    if str.match(pattern)
    }
    str
  end

escape_snake_namesを再改良(2016/02/16)

underscoreではincludeなどでsnake_named_fileも変換してしまい,だめ.hiki2latexで対応.

上のやり方では,うまくいかない場合が存在.元へ戻す.

def escape_snake_names(str)
    str.gsub!(/_/,"\\_")
    patterns = [/\$(.+?)\$/ , /\\verb\|(.+?)\|/, /equation(.+?)equation/m ]
    patterns.each{|pattern|
#      str.gsub!(/\\_/,"_")    if str.match(pattern)                                                                                   
      str.gsub!(pattern){|text|
        if text =~ /\\_/ then
          text.gsub!(/\\_/,'_')
        else
          text
        end
      }
    }
    str
  end

さらに tableでescape_snake_namesを通ってなかった.

#        buf << "#{ele} &"
buf << escape_snake_names(ele)+" &"

【copyright】

cc by Shigeto R. Nishitani, 2015