
Ich schreibe derzeit den praktischen Teil meiner Bachelorarbeit, in dem es um die Online-Erkennung handgeschriebener mathematischer Symbole (und eventuell auch Formeln) gehen wird.
Ein Problem, das ich derzeit damit habe, ist, dass ich die Symbole in meiner Datenbank haben muss. Ich brauche im Grunde
- Der Latex-Code für das Symbol (z. B.
A
,$\alpha$
,$\rightarrow$
,$\mathbb{R}$
, …) - Der Paketname, falls ich einen brauche (zB
\usepackage{amsmath}
) - SVG
Ich kann das SVG mit den anderen beiden Informationen erstellen (obwohl die SVGs, die ich erstellen kann, alles andere als optimal sind), aber ich sehe derzeit keinen besseren Weg, als diese Symbole manuell einzugeben. Dies scheint eine enorme Zeitverschwendung zu sein, wenn man vom Entwickler vonenttextendass er über etwa 2000 Symbole verfügt (er kann mir die Datenbank aber nicht geben – ich weiß nicht, warum).
Also:Wie kann ich eine Liste aller Symbole in LaTeX/TeX erhalten?
(Die Seite ist übrigenshttp://write-math.com- aber es ist noch eine sehr frühe Alpha-Version und ich werde die Datenbank in den nächsten Tagen möglicherweise kürzen, also verschwenden Sie bitte nicht Ihre Zeit und generieren Sie Daten. Der Teil zur Symbolerkennung existiert im Moment noch nicht.)
Antwort1
Wie in den Kommentaren erwähnt, die Quelle fürenttextenist auf GitHub verfügbar unterhttps://github.com/kirel/detexify.
Die Symboldatenbank finden Sie unterlib/latex/symbols.yaml
in einem YAML-Format (Beispiel unten), das leicht erweiterbar ist und Ihren Anforderungen an Informationen zu den erforderlichen Paketen und dem Modus (Text oder Mathematik) entspricht.
# 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-Ausgaben können durch Anpassen einer rake
Aufgabe erstellt werden, die inlib/rake/symbol_task.rb
. Unten stelle ich meine erste Anpassung dieses Codes vor.Haftungsausschluss:Ich bin ein Ruby-Neuling und es gibt wahrscheinlich bessere Möglichkeiten, dies zu tun, da ich hier den größten Teil von Daniels Code entferne. Betrachten Sie dies als Ausgangspunkt und nicht als Standard.:-)
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
Ich habe diese Änderungen an einem Klon des Detexify-Repositorys vorgenommen, aber die einzigen erforderlichen Dateien sindlib/rake/symbol_task.rb
,lib/latex/symbol.rb
, Undlib/latex/symbols.yaml
.
Um alle SVG-Ausgaben zu erstellen, führen Sie sie rake gen_svg
in einer Ruby-Eingabeaufforderung aus.dvisvgm
erforderlich; alternativ kann der Ruby-Code so geändert werden, dass er pdflatex
mitpdf2svg
(ungetestet) oder Inkscape (auf der Befehlszeile), um die Konvertierung in SVG durchzuführen.