Como posso obter todos os símbolos TeX/LaTeX?

Como posso obter todos os símbolos TeX/LaTeX?

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.yamlem 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 raketarefa 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_svgem um prompt de comando Ruby.dvisvgmé necessário; alternativamente, o código Ruby poderia ser modificado para uso pdflatexcompdf2svg(não testado) ou Inkscape (na linha de comando) para realizar a conversão para SVG.

informação relacionada