Thu 2009-04-23 ( En pr )

TeX is much to complicated for me, especially when it comes to simple text – I prefer the simplicity of Textile. But when it comes to typesetting formulas, there’s no real alternative.

So I’m trying to combine them, with this little Ruby script which runs on Leopard and uses latex2png:

require 'redcloth'
TEX_PATTERN = /\$(\$)?(\{[^\}]+\})?(\S[^\$]*)\$\$?/
QUALITY = 1
math_textile = ARGF.read
IMAGE_PREFIX = 'temp'
TEX_TEMPLATE = <<'TEX_DOCUMENT'
\documentclass{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}  % math...
\usepackage{pxfonts}  % \mathbb
\begin{document}
\pagestyle{empty}  % no page number
<TEX>
\end{document}
TEX_DOCUMENT
def generate_image tex, image_file_name
  File.open image_file_name + '.tex', 'w' do |file|
    file.puts TEX_TEMPLATE.sub('<TEX>', tex)
  end
  `latex2png -s #{115 * QUALITY} #{image_file_name}.tex`
  `rm #{image_file_name}.tex`
end
textile = math_textile.gsub(TEX_PATTERN) do
  big, styles, tex = $1, $2 || '{}', $3
  if big
    tex = "\\[#{tex}\\]"
  else
    tex = "$#{tex}$"
  end
  image_file_name = "temp-#{tex.hash.%(2**32).to_s(16)}"
  unless File.exist?(image_file_name + '.png')
    generate_image tex, image_file_name
  end
  width = `file #{image_file_name}.png`[/(\d+) x /, 1].to_i
  styles.sub!('{', "{vertical-align: middle; width: #{width / QUALITY}px; ")
  "!#{styles}#{"file://#{Dir.pwd}/" if ENV['TM_FILEPATH']}#{image_file_name}.png(#{tex.tr '()', '[]' })!"
end
puts RedCloth.new(textile).to_html

Here’s an example input and output, and a TextMate Command.

I call it “Fabrik” (German for factory), because it sounds like fabric, a synonym for textile.

Say something! / Sag was!

No markup, just plain monospace text. / Kein Markup, nur Normschrift-Klartext.