
私は現在、手書きの数学記号(そして最終的には数式も)のオンライン認識に関する学士論文の実践部分を執筆中です。
現時点で私が抱えている問題は、データベースにシンボルを登録する必要があることです。
- シンボルの LaTeX コード (例:
A
、、、、$\alpha$
... )$\rightarrow$
$\mathbb{R}$
- 必要な場合はパッケージ名(例
\usepackage{amsmath}
:) - SVGA
他の2つの情報を使ってSVGを作成することもできますが(作成できるSVGは最適とは言えませんが)、現時点では手動でそれらのシンボルを入力するより良い方法が思いつきません。これは時間の無駄のように思えます。テキストを消す彼は約 2000 個のシンボルを持っている (ただし、データベースを私に提供できないのはなぜかはわかりません)。
それで:LaTeX / TeX のすべてのシンボルのリストを取得するにはどうすればいいですか?
(ちなみに、そのサイトはhttp://write-math.com- ただし、これはまだ非常に初期のアルファリリースであり、今後数日以内にデータベースを切り捨てる可能性があります。そのため、時間を無駄にせず、データを生成してください。現時点では、シンボル認識部分は存在しません。
答え1
コメントで述べたように、テキストを消すGitHubで入手可能https://github.com/kirel/detexify。
シンボルデータベースは以下で提供されています。lib/latex/symbols.yaml
YAML 形式 (以下のサンプル) は簡単に拡張でき、必要なパッケージとモード (テキストまたは数式) に関する情報の要件を満たします。
# Table 212: wasysym Biological Symbols
- package: wasysym
bothmodes:
- \female
- \male
- package: skull
mathmode:
- \skull
# Table 254: wasysym General Symbols
- package: wasysym
textmode:
- \LEFTarrow
# <...>
- \recorder
bothmodes:
- \checked #
# <...>
- \invdiameter #
rake
SVG出力は、提供されているタスクを適用することで作成できます。lib/rake/symbol_task.rb
以下に、このコードの最初の改変版を示します。免責事項:私は Ruby の初心者で、ここでは Daniel のコードのほとんどを削除しているので、これを実行するより良い方法がある可能性があります。これを標準ではなく出発点として捉えてください。:-)
require 'rake/tasklib'
require 'erb'
require 'latex/symbol'
class SymbolTask < Rake::TaskLib
TEMPLATE = ERB.new <<-LATEX #open('template.tex.erb').read
\\documentclass[10pt]{article}
\\usepackage[utf8]{inputenc}
<%= @packages %>
\\pagestyle{empty}
\\begin{document}
<%= @command %>
\\end{document}
LATEX
TMP = 'tmp'
OUT = 'images/latex'
attr_accessor :name, :tmp, :out
# initialize sets the name and calls a block to get
# the rest of the options
def initialize(name = :symbols)
@name = name
yield self if block_given?
define
end
# define creates the new task(s)
def define
#desc "prepare necessary directories"
#task :prepare do
directory TMP
directory OUT
#end
all_image_tasks = Latex::Symbol::List.map do |symbol|
define_single_tex_task symbol
define_single_dvi_task symbol
define_single_image_task symbol
end
desc "create svg images from all symbols"
task :gen_svg => all_image_tasks
end
def define_single_image_task symbol
file "#{File.join(OUT, symbol.filename)}.svg" => [OUT, "#{File.join(TMP, symbol.filename)}.dvi"] do |t|
# Now convert to image
puts "Creating image... #{t.name}"
sh %|dvisvgm -n #{File.join(TMP, symbol.filename)}.dvi #{t.name}| do |ok, res|
if ! ok
puts "Major Failure creating image! (status = #{res.exitstatus})"
end
end
end
"#{File.join(OUT, symbol.filename)}.svg" # need the names
end
def define_single_dvi_task symbol
file "#{File.join(TMP, symbol.filename)}.dvi" => [TMP, "#{File.join(TMP, symbol.filename)}.tex"] do
puts "Generating dvi for #{symbol}..."
sh %|latex -interaction=batchmode -output-directory=#{TMP} #{File.join(TMP, symbol.filename)}.tex| do |ok, res|
if ! ok
puts "Major Failure creating dvi! (status = #{res.exitstatus})"
end
end
end
end
def define_single_tex_task symbol
file "#{File.join(TMP, symbol.filename)}.tex" => TMP do |t|
open(t.name, 'w+') do |texfile|
# setup variables
@packages = ''
@packages << "\\usepackage{#{symbol[:package]}}\n" if symbol[:package]
@packages << "\\usepackage[#{symbol[:fontenc]}]{fontenc}\n" if symbol[:fontenc]
@command = symbol.mathmode ? "$#{symbol.command}$" : symbol.command
# write symbol to tempfile
puts "Generating latex for #{symbol}..."
texfile.puts TEMPLATE.result(binding)
end
end
end
end
私はこれらの変更をdetexifyリポジトリのクローン上で行いました。必要なファイルは次の通りです。lib/rake/symbol_task.rb
、lib/latex/symbol.rb
、 そしてlib/latex/symbols.yaml
。
すべての SVG 出力をビルドするには、rake gen_svg
Ruby コマンド プロンプトで実行します。dvisvgm
が必要です。代わりに、Rubyコードを変更してpdflatex
、pdf2svg
(未テスト) または Inkscape (コマンド ライン) を使用して SVG への変換を実行します。