Class RDoc::Markup::ToXHtmlTexParser
In: markup/to_xhtml_texparser.rb
Parent: RDoc::Markup::ToHtmlCrossref

Note that Japanese and English are described in parallel.

TeX の数式を MathML に変換

TeX で記述された数式を MathML に変換します. インラインで表示したい場合, TeX の数式を以下のように $ … $ でくくって 記述してください. $ の 前後には半角空白を一文字以上入れて下さい. (なお, "$ID: … $" や "$LOG: … $ といった, CVS のキーワードとして 用いられている書き方は数式として扱われません.)

  インラインで表示する数式は $ f(x) = x^2 + 1 $ のように記述します.
  ($ の前後に空白をお忘れなく).

ブロックで表示する場合, 以下のように \[ と \] とでくくって記述してください. \[, は必ず行頭に記述してください.

  \[
     \sum_{i=1}^nf_n(x)
  \]

数式を複数行で表示する場合には, 改行する部分に "\] \[" を記述してください.

 \[
     d\zeta/dt + J(\psi,\zeta) = Ra \; dT/dx + \nabla\zeta, \] \[
     dT/dt + J(\psi,T) - d\psi/dx = \nabla T,               \] \[
     \nabla\psi = \zeta
 \]

TeX の数式から MathML 変換には Ruby 用 MathML ライブラリのバージョン 0.8 を使用しています. このライブラリはひらくの工房 にて公開されています. 使用できる TeX コマンドの詳細に関しても こちらのサイトを参照してください.

作成されたドキュメントを閲覧する際には MathML に対応した ブラウザを使用する必要が あります. MathML 日本語情報MathML Software - Browsers などを参照してください.

TeX is converted to MathML

TeX formula is converted to MathML. When inline display, TeX formula should be bundled by $ … $ as follows. One or more normal-width blank is necessary before and behind "$". (The format of CVS keywords, that is "$ID: … $" or "$LOG: … $ etc. is ignored.)

  Inline formula is $ f(x) = x^2 + 1 $ .

When block display, TeX formula should be bundled by \[ … \] as follows. Describe \[ at the head of line.

  \[
     \sum_{i=1}^nf_n(x)
  \]

To write equations across multiple lines, describe "\] \[" as follows.

 \[
     d\zeta/dt + J(\psi,\zeta) = Ra \; dT/dx + \nabla\zeta, \] \[
     dT/dt + J(\psi,T) - d\psi/dx = \nabla T,               \] \[
     \nabla\psi = \zeta
 \]

MathML library for Ruby version 0.8 is needed to convert TeX formula to MathML. This library is available from Bottega of Hiraku (JAPANESE only). See this site about available TeX commands.

When you browse generated documents, you need to use browers that can handle MathML. See MathML Software - Browsers, etc.

newcommand, newenvironment の使用方法

newcommand や newenvironment 命令によるマクロを使用するには, Ruby のロードパス以下に ‘mathml/macro’ ディレクトリを 作成し, そのディレクトリ以下にマクロ命令を記したファイルを置いてください. ファイル名は問いません.

例えば, ‘/usr/lib/ruby/1.8’ が Ruby のロードパスである場合, ‘/usr/lib/ruby/1.8/mathml’ および ‘/usr/lib/ruby/1.8/mathml/macro’ ディレクトリを作成し, そのディレクトリ以下に, ‘D6math.sty’ というファイルを作成します (前述したようにこのファイル名は何でも構いません). そのファイル内に 以下のような newcommand 命令を記述しておくことで, ‘DP{}{}’ (偏微分を簡単に記述するためのマクロ) コマンドが使用可能になります.

    \newcommand{\DP}[2]{\frac{\partial #1}{\partial #2}}

地球流体電脳倶楽部で提供している TeX マクロ (通称: 電脳スタイル) に含まれる ‘D6math.sty’ を Ruby 用 Mathml ライブラリで使用できるように 修正したパッケージを libmathml-macro-dennou-ruby として 提供しています. サンプルとして利用してみてください.

Usage of newcommand and newenvironment

If you want to use macros defined by newcommand and newenvironment commands, make ‘mathml/macro’ directory under load paths of Ruby, and prepare a file that macro commands are described in the directory. A name of the file is free.

For example, if your load path of Ruby is ‘/usr/lib/ruby/1.8’, you should make ‘/usr/lib/ruby/1.8/mathml’ and ‘/usr/lib/ruby/1.8/mathml/macro’ directories, and make ‘D6math.sty’ file (already mentioned, the file name is free). When you describe a following newcommand command, you can use ‘DP{}{}’ (a macro for partial differentiations) command.

    \newcommand{\DP}[2]{\frac{\partial #1}{\partial #2}}

As a sample, please use libmathml-macro-dennou-ruby. The original style file is ‘D6math.sty’ in TeX macro (Dennou style). libmathml-macro-dennou-ruby is a reconfigured package for Mathml library for Ruby.

Methods

Public Class methods

We need to record the html path of our caller so we can generate correct relative paths for any hyperlinks that we find

[Source]

     # File markup/to_xhtml_texparser.rb, line 140
140:   def initialize(from_path, context, show_hash, mathml=nil)
141:     super(from_path, context, show_hash)
142:     @mathml = mathml
143: 
144:     if @mathml
145:       # TeX inline form
146:       @markup.add_special(/(\$(.*?)[^\\]\$)/im, :TEXINLINE)
147: 
148:       # TeX inline delimiter
149:       @markup.add_special(/(\\\$)/im, :TEXINLINEDELIMITER)
150: 
151:       # TeX block form
152:       @markup.add_special(/(\\\[(.+?)\\\])/im, :TEXBLOCK)
153:     end
154: 
155:     @block_exceptions = []
156:     if @markup
157:       @block_exceptions << {
158:         'name'     => :texblockform,
159:         'start'    => Regexp.new("^\\\\\\["),
160:         'end'      => Regexp.new("\\\\\\]$"),
161:         'replaces' => []
162:       }
163:       @block_exceptions[0]['replaces'] << {
164:         'from' => Regexp.new("\\\\\\\\"),
165:         'to'   => "\\\\\\\\\\\\\\\\",
166:       }
167:     end
168: 
169:   end

Public Instance methods

[Source]

     # File markup/to_xhtml_texparser.rb, line 171
171:   def file_location
172:     if @context.context.parent
173:       class_or_method = @context.context.name
174:     end
175:     context = @context.context
176:     while context.parent
177:       context = context.parent
178:     end
179:     location = context.file_relative_name
180:     if class_or_method
181:       location += "#"+class_or_method
182:     end
183:     return location
184:   end

TEXBLOCK pattern \[…\] is converted to MathML format when —mathml option is given.

[Source]

     # File markup/to_xhtml_texparser.rb, line 220
220:   def handle_special_TEXBLOCK(special)
221:     text = special.text
222:     return text unless @mathml
223:     text.sub!(/^\\\[/, '')
224:     text.sub!(/\\\]$/, '')
225:     tex = MathMLWrapper.new
226:     mathml, stat = tex.parse(text, true)
227:     if !(stat == 0)
228:       $stderr.puts "Warning: in #{file_location}, following TeX commands can not be converted to MathML\n\n",
229:       "    #{text}\n\n"
230:     end
231:     return mathml
232:   end

TEXINLINE pattern $…$ is converted to MathML format when —mathml option is given.

[Source]

     # File markup/to_xhtml_texparser.rb, line 190
190:   def handle_special_TEXINLINE(special)
191:     text = special.text
192:     return text unless @mathml
193:     raw_text = text.scan(/^.*?\$/).to_s.sub(/\$$/, '')
194:     return text if text =~ /^.*?\$[A-Z]\w+:/  # CVS keywords are skipped
195:     text.sub!(/^.*?\$/, '')
196:     text.sub!(/\$$/, '')
197:     tex = MathMLWrapper.new
198:     mathml, stat = tex.parse(text)
199:     if !(stat == 0)
200:       $stderr.puts "Warning: in #{file_location}, following TeX commands can not be converted to MathML\n\n",
201:       "    #{text}\n\n"
202:     end
203:     return raw_text + mathml
204:   end

TEXINLINEDELIMITER pattern "\$" is converted to single dollar "$" when —mathml option is given.

[Source]

     # File markup/to_xhtml_texparser.rb, line 210
210:   def handle_special_TEXINLINEDELIMITER(special)
211:     text = special.text
212:     return text unless @mathml
213:     return text.gsub(/\\\$/, '$')
214:   end

[Validate]