Как получить все символы TeX / LaTeX?

Как получить все символы TeX / LaTeX?

В настоящее время я пишу практическую часть своей бакалаврской диссертации, которая будет посвящена онлайн-распознаванию рукописных математических символов (а в перспективе и формул).

Одна из проблем, с которой я сейчас сталкиваюсь, заключается в том, что мне нужно иметь символы в моей базе данных. Мне в основном нужно

  • Латексный код символа (например 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.

Связанный контент