¿Cómo puedo obtener todos los símbolos TeX/LaTeX?

¿Cómo puedo obtener todos los símbolos TeX/LaTeX?

Actualmente estoy escribiendo la parte práctica de mi tesis de licenciatura, que tratará sobre el reconocimiento en línea de símbolos matemáticos escritos a mano (y eventualmente también de fórmulas).

Un problema que tengo actualmente con esto es que necesito tener los símbolos en mi base de datos. básicamente necesito

  • El código de látex para el símbolo (por ejemplo A, $\alpha$, $\rightarrow$, , $\mathbb{R}$, ...)
  • El nombre del paquete si necesito uno (por ejemplo \usepackage{amsmath})
  • SVG

Puedo crear el SVG con los otros dos datos (aunque los SVG que puedo crear están lejos de ser óptimos), pero actualmente no veo una mejor manera que ingresar esos símbolos manualmente. Esto parece una tremenda pérdida de tiempo, según lo que dice el desarrollador dedetexificarque tiene alrededor de 2000 símbolos (pero no puede darme la base de datos, no sé por qué).

Entonces:¿Cómo puedo obtener una lista de todos los símbolos que tiene LaTeX/TeX?

(Por cierto, el sitio eshttp://write-math.com- pero aún es una versión alfa muy temprana y podría truncar la base de datos en los próximos días, así que no pierda el tiempo y genere datos. La parte de reconocimiento de símbolos no existe en este momento).

Respuesta1

Como se menciona en los comentarios, la fuente dedetexificarestá disponible en GitHub enhttps://github.com/kirel/detexify.

La base de datos de símbolos se proporciona enlib/latex/symbols.yamlen un formato YAML (ejemplo a continuación) que es fácilmente extensible y satisface sus requisitos de información sobre los paquetes y el modo (texto o matemático) requeridos.

# 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 #

La salida SVG se puede crear adaptando una raketarea proporcionada enlib/rake/symbol_task.rb. A continuación presento mi adaptación inicial de este código.Descargo de responsabilidad:Soy un novato en Ruby y probablemente haya mejores formas de hacerlo, ya que aquí estoy eliminando la mayor parte del código de Daniel. Tómelo como un punto de partida y no como el estándar.:-)

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

Hice estas modificaciones en un clon del repositorio detexify, pero los únicos archivos necesarios sonlib/rake/symbol_task.rb,lib/latex/symbol.rb, ylib/latex/symbols.yaml.

Para crear todas las salidas SVG, ejecútelas rake gen_svgen el símbolo del sistema de Ruby.dvisvgmse requiere; alternativamente, el código Ruby podría modificarse para usarlo pdflatexconpdf2svg(no probado) o Inkscape (en la línea de comando) para realizar la conversión a SVG.

información relacionada