Ruby on Rails 2.3.8 で jsMathを使う

まだ、使い始めたばかりだけどとりあえずできたのでメモ。環境は以下のとおり。

実験用プロジェクトの作成

% rails math
% cd math
% ruby script/generate scaffold equation title:string equation:text

jsMathのダウンロード

jsMath公式から、jsMathとフォントをダウンロードする。今回は以下をダウンロードした。

  • jsMath-3.6e.zip
  • jsMath-fonts-1.3.zip

これを public/javascriptsにjsMathというディレクトリを作ってそこに置くこととする。

% cd public/javascripts
% unzip ~/jsMath-3.6e.zip
% mv jsMath-3.6e/ jsMath
% unzip ~/jsMath-3.6e.zip

Webブラウザで public/javascripts/jsMath/test/index.html を開いて jsMathがちゃんと動いていたらインストール成功。

jsMathをRuby on Railsから使う

まずは、データベースを作成する。

% rake db:migrate
% ruby script/server

http://localhost:3000/equations/ にアクセスしてRuby on Railsがちゃんと動いていることを確認する。

次に、jsMathを呼び出す設定をする。app/views/layouts/equations.html.erb に次のように編集する。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
  <title>Equations: <%= controller.action_name %></title>
  <%= stylesheet_link_tag 'scaffold' %>
  <%= javascript_include_tag 'jsMath/easy/load.js' %> #変更点
</head>
<body>

<p style="color: green"><%= notice %></p>

<%= yield %>

</body>
<script> jsMath.ConvertTeX() </script> #変更点
</html>

次にpublic/javascripts/jsMath/easy/load.jsを編集する。以下の項目に関して1(有効にする)、0(向こうにする)を決定する。デフォルトは以下のとおり。

  processSlashParens: 1,       // process \(...\) in text?
  processSlashBrackets: 1,     // process \[...\] in text?
  processDoubleDollars: 1,     // process $$...$$ in text?
  processSingleDollars: 0,     // process $...$ in text?
  processLaTeXenvironments: 0, // process \begin{xxx}...\end{xxx} outside math mode?
  fixEscapedDollars: 0,        // convert \$ to $ outside of math mode?
  doubleDollarsAreInLine: 0,   // make $$...$$ be in-line math?
  allowDisableTag: 1,          // allow ID="tex2math_off" to disable tex2math?

LaTeXのmathモード(文中で使える。LaTeXでは、$〜$で囲う)に関する設定は以下のとおり。

  • processSlashParens : 文中の \(〜 \)で囲われた部分を数式に読み替える。
  • processSingleDollars: 文中の $〜$で囲われた部分を数式に読み替える。
  • < span class="math" > 〜 < / span > :HTMLレベルでは、上の囲い記号はこれに変換される。

LaTeXのdisplaymathモード(数式が1行表示される。LaTeXでは、\[〜\]で囲う)に関する設定は以下のとおり。

  • processSlashBrackets : 文中の \[〜 \]で囲われた部分を数式に読み替える。
  • processDoubleDollars: 文中の $$〜$$で囲われた部分を数式に読み替える。
  • < div class="math" > 〜 < / div > :HTMLレベルでは、上の囲い記号はこれに変換される。

とりあえず、デフォルトの設定のままとする。

http://localhost:3000/equations/にアクセスし、データを追加してみる。Titleに

\(a^2\)の奇跡

equationに

\[\sum_0^n \frac{n^3(n+1)}{2}\]
\[
\int^1_\kappa
\left[\bigl(1-w^2\bigr)\bigl(\kappa^2-w^2\bigr)\right]^{-1/2} dw
= \frac{4}{\left(1+\sqrt{\kappa}\,\right)^2} K
\left(\left(\frac{1-\sqrt{\kappa}}{1+\sqrt{\kappa}}\right)^{\!\!2}\right)
\]

を入力し、showでちゃんと数式が表示されたら成功。

覚書

SQLのエスケープ文字とLaTeXの数式で使う記号が被らないかを調べないとセキュリティホールを作り込んでしまいそう。

  • XSSに関しては、とりあえず <%=h 変数 > として、HTMLタグをエスケープして扱うことにする。LaTeXにおける < と > の役割は何かのタグの一部分ではないので表示としては &ltと&gtに置き換えられても問題ない。