
Atualmente estou escrevendo a parte prática da minha tese de bacharelado, que será sobre o reconhecimento on-line de símbolos matemáticos manuscritos (e eventualmente também de fórmulas).
Um problema que tenho atualmente com isso é que preciso ter os símbolos em meu banco de dados. Eu basicamente preciso
- O código de látex para o símbolo (por exemplo
A
,$\alpha$
,$\rightarrow$
, ,$\mathbb{R}$
, ...) - O nome do pacote, se eu precisar de um (por exemplo
\usepackage{amsmath}
) - SVG
Posso criar o SVG com as outras duas informações (embora os SVGs que posso criar estejam longe de serem ideais), mas atualmente não vejo maneira melhor do que inserir manualmente esses símbolos. Parece uma tremenda perda de tempo ouvir o desenvolvedor dodetexificarque ele tem cerca de 2.000 símbolos (mas ele não pode me fornecer o banco de dados - não sei por quê).
Então:Como posso obter uma lista de todos os símbolos que o LaTeX/TeX possui?
(Aliás, o site éhttp://write-math.com- mas ainda é uma versão alfa muito inicial e posso truncar o banco de dados nos próximos dias, então não perca tempo e gere dados. A parte de reconhecimento de símbolos não existe no momento.)
Responder1
Conforme mencionado nos comentários, a fonte dedetexificarestá disponível no GitHub emhttps://github.com/kirel/detexify.
O banco de dados de símbolos é fornecido emlib/latex/symbols.yaml
em um formato YAML (exemplo abaixo) que é facilmente extensível e satisfaz seus requisitos de informações sobre os pacotes e modos necessários (texto ou matemática).
# 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 #
A saída SVG pode ser criada adaptando uma rake
tarefa fornecida emlib/rake/symbol_task.rb
. Apresento abaixo minha adaptação inicial deste código.Isenção de responsabilidade:Sou um novato em Ruby e provavelmente existem maneiras melhores de fazer isso, já que estou eliminando a maior parte do código de Daniel aqui. Tome isso como um ponto de partida e não como um padrão.:-)
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
Fiz essas modificações em um clone do repositório detexify, mas os únicos arquivos necessários sãolib/rake/symbol_task.rb
,lib/latex/symbol.rb
, elib/latex/symbols.yaml
.
Para construir todas as saídas SVG, execute rake gen_svg
em um prompt de comando Ruby.dvisvgm
é necessário; alternativamente, o código Ruby poderia ser modificado para uso pdflatex
compdf2svg
(não testado) ou Inkscape (na linha de comando) para realizar a conversão para SVG.