すべての TeX / LaTeX シンボルを取得するにはどうすればよいですか?

すべての TeX / LaTeX シンボルを取得するにはどうすればよいですか?

私は現在、手書きの数学記号(そして最終的には数式も)のオンライン認識に関する学士論文の実践部分を執筆中です。

現時点で私が抱えている問題は、データベースにシンボルを登録する必要があることです。

  • シンボルの LaTeX コード (例: A、、、、$\alpha$... )$\rightarrow$$\mathbb{R}$
  • 必要な場合はパッケージ名(例\usepackage{amsmath}:)
  • SVGA

他の2つの情報を使ってSVGを作成することもできますが(作成できるSVGは最適とは言えませんが)、現時点では手動でそれらのシンボルを入力するより良い方法が思いつきません。これは時間の無駄のように思えます。テキストを消す彼は約 2000 個のシンボルを持っている (ただし、データベースを私に提供できないのはなぜかはわかりません)。

それで:LaTeX / TeX のすべてのシンボルのリストを取得するにはどうすればいいですか?

(ちなみに、そのサイトはhttp://write-math.com- ただし、これはまだ非常に初期のアルファリリースであり、今後数日以内にデータベースを切り捨てる可能性があります。そのため、時間を無駄にせず、データを生成してください。現時点では、シンボル認識部分は存在しません。

答え1

コメントで述べたように、テキストを消すGitHubで入手可能https://github.com/kirel/detexify

シンボルデータベースは以下で提供されています。lib/latex/symbols.yamlYAML 形式 (以下のサンプル) は簡単に拡張でき、必要なパッケージとモード (テキストまたは数式) に関する情報の要件を満たします。

# 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.rblib/latex/symbol.rb、 そしてlib/latex/symbols.yaml

すべての SVG 出力をビルドするには、rake gen_svgRuby コマンド プロンプトで実行します。dvisvgmが必要です。代わりに、Rubyコードを変更してpdflatexpdf2svg(未テスト) または Inkscape (コマンド ライン) を使用して SVG への変換を実行します。

関連情報