如何取得所有 TeX / LaTeX 符號?

如何取得所有 TeX / LaTeX 符號?

我目前正在寫我的學士論文的實踐部分,該部分將是關於手寫數學符號(最終還有公式)的線上識別。

我目前遇到的一個問題是我需要在資料庫中包含這些符號。我基本上需要

  • 符號的乳膠代碼(例如,,,,,A... )$\alpha$$\rightarrow$$\mathbb{R}$
  • 套件名稱(如果我需要)(例如\usepackage{amsmath}
  • 靜止無功發生器

我可以使用其他兩個資訊來建立 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 #

rakeSVG 輸出可以透過調整提供的任務來創建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 的轉換。

相關內容