我目前正在撰写学士论文的实践部分,内容涉及手写数学符号(最终也包括公式)的在线识别。
我目前遇到的一个问题是我需要在数据库中包含符号。我基本上需要
- 符号的乳胶代码(例如
A
、$\alpha$
、$\rightarrow$
、$\mathbb{R}$
、 ...) - 如果需要的话,包名称(例如
\usepackage{amsmath}
) - SVG
我可以用另外两条信息创建 SVG(尽管我能创建的 SVG 远非最佳),但目前我看不出比手动输入这些符号更好的方法。从开发人员那里听说,这似乎是极大的浪费时间解纤他有大约 2000 个符号(但他不能给我数据库 - 我不知道为什么)。
所以:如何获取 LaTeX / TeX 的所有符号列表?
(顺便说一下,该网站是http://write-math.com- 但它仍然是一个非常早期的 alpha 版本,我可能会在接下来的几天内截断数据库,所以请不要浪费时间生成数据。符号识别部分目前不存在。)
答案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 的转换。