
В настоящее время я пишу практическую часть своей бакалаврской диссертации, которая будет посвящена онлайн-распознаванию рукописных математических символов (а в перспективе и формул).
Одна из проблем, с которой я сейчас сталкиваюсь, заключается в том, что мне нужно иметь символы в моей базе данных. Мне в основном нужно
- Латексный код символа (например
A
,$\alpha$
,$\rightarrow$
, ,$\mathbb{R}$
, ...) - Имя пакета, если оно мне нужно (например
\usepackage{amsmath}
) - SVG
Я могу создать 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 #
Вывод SVG можно создать, адаптировав rake
задачу, представленную вlib/rake/symbol_task.rb
Ниже я представляю свою первоначальную адаптацию этого кода.Отказ от ответственности:Я новичок в Ruby, и, вероятно, есть лучшие способы сделать это, поскольку я убираю большую часть кода Дэниела здесь. Примите это как отправную точку, а не как стандарт.:-)
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.