
Actualmente estoy escribiendo la parte práctica de mi tesis de licenciatura, que tratará sobre el reconocimiento en línea de símbolos matemáticos escritos a mano (y eventualmente también de fórmulas).
Un problema que tengo actualmente con esto es que necesito tener los símbolos en mi base de datos. básicamente necesito
- El código de látex para el símbolo (por ejemplo
A
,$\alpha$
,$\rightarrow$
, ,$\mathbb{R}$
, ...) - El nombre del paquete si necesito uno (por ejemplo
\usepackage{amsmath}
) - SVG
Puedo crear el SVG con los otros dos datos (aunque los SVG que puedo crear están lejos de ser óptimos), pero actualmente no veo una mejor manera que ingresar esos símbolos manualmente. Esto parece una tremenda pérdida de tiempo, según lo que dice el desarrollador dedetexificarque tiene alrededor de 2000 símbolos (pero no puede darme la base de datos, no sé por qué).
Entonces:¿Cómo puedo obtener una lista de todos los símbolos que tiene LaTeX/TeX?
(Por cierto, el sitio eshttp://write-math.com- pero aún es una versión alfa muy temprana y podría truncar la base de datos en los próximos días, así que no pierda el tiempo y genere datos. La parte de reconocimiento de símbolos no existe en este momento).
Respuesta1
Como se menciona en los comentarios, la fuente dedetexificarestá disponible en GitHub enhttps://github.com/kirel/detexify.
La base de datos de símbolos se proporciona enlib/latex/symbols.yaml
en un formato YAML (ejemplo a continuación) que es fácilmente extensible y satisface sus requisitos de información sobre los paquetes y el modo (texto o matemático) requeridos.
# 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 #
La salida SVG se puede crear adaptando una rake
tarea proporcionada enlib/rake/symbol_task.rb
. A continuación presento mi adaptación inicial de este código.Descargo de responsabilidad:Soy un novato en Ruby y probablemente haya mejores formas de hacerlo, ya que aquí estoy eliminando la mayor parte del código de Daniel. Tómelo como un punto de partida y no como el estándar.:-)
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
Hice estas modificaciones en un clon del repositorio detexify, pero los únicos archivos necesarios sonlib/rake/symbol_task.rb
,lib/latex/symbol.rb
, ylib/latex/symbols.yaml
.
Para crear todas las salidas SVG, ejecútelas rake gen_svg
en el símbolo del sistema de Ruby.dvisvgm
se requiere; alternativamente, el código Ruby podría modificarse para usarlo pdflatex
conpdf2svg
(no probado) o Inkscape (en la línea de comando) para realizar la conversión a SVG.