rb_latex 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +14 -0
- data/.travis.yml +5 -0
- data/Gemfile +6 -0
- data/README.md +25 -0
- data/Rakefile +10 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/rb_latex/error.rb +4 -0
- data/lib/rb_latex/item_list.rb +22 -0
- data/lib/rb_latex/logger.rb +22 -0
- data/lib/rb_latex/maker.rb +122 -0
- data/lib/rb_latex/meta_info.rb +84 -0
- data/lib/rb_latex/utils.rb +24 -0
- data/lib/rb_latex/version.rb +3 -0
- data/lib/rb_latex.rb +11 -0
- data/rb_latex.gemspec +27 -0
- data/templates/book.tex.erb +27 -0
- metadata +130 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 332e63029cbc407687ca8e1be20e219298b71d1c3c039c721d346d0962c2bc71
|
4
|
+
data.tar.gz: 832edab1700efb464c3518b535faee2b87681e3fbdc51665cb8d122de06ab092
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 635b369534dbd88cd7046d8fcdf8bf5b6e4deee31605ab4d83abaf77c31aca718b6b2f74af092a7472c36e5d678c86430c7e6a3a6f08f476c189a8b9d460471c
|
7
|
+
data.tar.gz: 20663cb0c708a2b9bcd0cdd328fcecccde1ba63f311a6641234cab139da7b6ef2a82def6f8bc9eca6678e4ca876a8d30a3592ecb78a852635bbdea4c49e4abb1
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# RbLatex
|
2
|
+
|
3
|
+
RbLatex is a library to use LaTeX (and dvipdfmx, if you need) from Ruby.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'rb_latex'
|
11
|
+
```
|
12
|
+
|
13
|
+
## Usage
|
14
|
+
|
15
|
+
TODO: Write usage instructions here
|
16
|
+
|
17
|
+
## Development
|
18
|
+
|
19
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
20
|
+
|
21
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
22
|
+
|
23
|
+
## Contributing
|
24
|
+
|
25
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/takahashim/rb_latex.
|
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "rb_latex"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start(__FILE__)
|
data/bin/setup
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
module RbLatex
|
2
|
+
class ItemList
|
3
|
+
def initialize()
|
4
|
+
@items = Hash.new
|
5
|
+
end
|
6
|
+
|
7
|
+
def add_item(filename, content)
|
8
|
+
@items[filename] = content
|
9
|
+
end
|
10
|
+
|
11
|
+
def filenames
|
12
|
+
@items.keys
|
13
|
+
end
|
14
|
+
|
15
|
+
def generate(dir)
|
16
|
+
@items.each do |filename, content|
|
17
|
+
path = File.join(dir, filename)
|
18
|
+
File.write(path, content)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'logger'
|
2
|
+
|
3
|
+
module RbLatex
|
4
|
+
class Logger < ::Logger
|
5
|
+
def initialize(logdev = STDERR, *args, **kargs)
|
6
|
+
super
|
7
|
+
if !kargs[:formatter]
|
8
|
+
self.formatter = proc do |severity, _time, _progname, message|
|
9
|
+
"#{datetime}: #{message}\n"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.logger
|
15
|
+
@logger ||= self::Logger.new
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.logger=(logger)
|
19
|
+
@logger = logger
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,122 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
require 'fileutils'
|
3
|
+
require "open3"
|
4
|
+
|
5
|
+
module RbLatex
|
6
|
+
class Maker
|
7
|
+
extend Forwardable
|
8
|
+
|
9
|
+
def_delegator :@meta_info, :title
|
10
|
+
def_delegator :@meta_info, :title=
|
11
|
+
def_delegator :@meta_info, :creator
|
12
|
+
def_delegator :@meta_info, :creator=
|
13
|
+
def_delegator :@meta_info, :date
|
14
|
+
def_delegator :@meta_info, :date=
|
15
|
+
def_delegator :@meta_info, :lastmodified
|
16
|
+
def_delegator :@meta_info, :lastmodified=
|
17
|
+
def_delegator :@meta_info, :page_progression_direction
|
18
|
+
def_delegator :@meta_info, :page_progression_direction=
|
19
|
+
def_delegator :@meta_info, :add_creator
|
20
|
+
|
21
|
+
attr_reader :work_dir
|
22
|
+
|
23
|
+
def initialize(root_dir)
|
24
|
+
@root_dir = root_dir
|
25
|
+
@root_fullpath = File.absolute_path(root_dir)
|
26
|
+
@config = default_config
|
27
|
+
@work_dir = ".rblatex_work"
|
28
|
+
@item_list = RbLatex::ItemList.new
|
29
|
+
@meta_info = RbLatex::MetaInfo.new
|
30
|
+
@latex_cmd = "uplatex"
|
31
|
+
@dvipdfmx_cmd = "dvipdfmx"
|
32
|
+
end
|
33
|
+
|
34
|
+
def default_config
|
35
|
+
{}
|
36
|
+
end
|
37
|
+
|
38
|
+
def add_item(filename, content)
|
39
|
+
@item_list.add_item(filename, content)
|
40
|
+
end
|
41
|
+
|
42
|
+
def generate_pdf(filename, debug: nil)
|
43
|
+
in_working_dir(debug) do |dir|
|
44
|
+
copy_files(dir)
|
45
|
+
Dir.chdir(dir) do
|
46
|
+
generate_src(dir)
|
47
|
+
exec_latex(dir)
|
48
|
+
exec_dvipdfmx(dir)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def copy_files(dir)
|
54
|
+
Dir.entries(@root_dir).each do |path|
|
55
|
+
next if path == "." or path == ".."
|
56
|
+
FileUtils.cp_r(File.join(@root_dir, path), dir, dereference_root: true)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def generate_src(dir)
|
61
|
+
@item_list.generate(dir)
|
62
|
+
book_tex = apply_template("book.tex.erb")
|
63
|
+
File.write(File.join(dir, "book.tex"), book_tex)
|
64
|
+
end
|
65
|
+
|
66
|
+
def exec_latex(dir)
|
67
|
+
cmd = "#{@latex_cmd} book.tex"
|
68
|
+
3.times do |i|
|
69
|
+
out, status = Open3.capture2e(cmd)
|
70
|
+
if !status.success?
|
71
|
+
@error_log = out
|
72
|
+
raise RbLatex::Error, "fail to exec latex #{i}: #{cmd}"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def exec_dvipdfmx(dir)
|
78
|
+
cmd = "#{@dvipdfmx_cmd} book.dvi"
|
79
|
+
out, status = Open3.capture2e(cmd)
|
80
|
+
if !status.success?
|
81
|
+
@error_log = out
|
82
|
+
raise RbLatex::Error, "fail to exec latex #{i}: #{cmd}"
|
83
|
+
end
|
84
|
+
FileUtils.cp("book.pdf", File.join(@root_fullpath, "book.pdf"))
|
85
|
+
end
|
86
|
+
|
87
|
+
def work_dir=(dir)
|
88
|
+
if dir =~ /\A[A-Za-z0-9_\.-]+\z/
|
89
|
+
@work_dir = dir
|
90
|
+
else
|
91
|
+
raise RbLatex::Error, "work_dir should use characters 'A-Za-z0-9_.-' only."
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def in_working_dir(debug)
|
96
|
+
work_dir = prepare_working_dir(debug)
|
97
|
+
begin
|
98
|
+
yield work_dir
|
99
|
+
ensure
|
100
|
+
if !debug
|
101
|
+
FileUtils.remove_entry_secure(work_dir)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def prepare_working_dir(debug)
|
107
|
+
if !debug
|
108
|
+
Dir.mktmpdir('rblatex')
|
109
|
+
else
|
110
|
+
FileUtils.remove_entry_secure(@work_dir)
|
111
|
+
Dir.mkdir(@work_dir)
|
112
|
+
@work_dir
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def apply_template(template_file)
|
117
|
+
template = File.read(File.join(RbLatex::TEMPLATES_DIR, template_file))
|
118
|
+
return ERB.new(template).result(binding)
|
119
|
+
end
|
120
|
+
|
121
|
+
end
|
122
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
module RbLatex
|
2
|
+
class MetaInfo
|
3
|
+
|
4
|
+
ATTRS = %i(title creator page_progression_direction language)
|
5
|
+
|
6
|
+
ATTRS.each do |name|
|
7
|
+
define_method(name) do
|
8
|
+
@info[name]
|
9
|
+
end
|
10
|
+
name_eq = "#{name}=".to_sym
|
11
|
+
define_method(name_eq) do |val|
|
12
|
+
@info[name] = val
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def initialize
|
17
|
+
@info = Hash.new
|
18
|
+
@info[:creator] = Hash.new
|
19
|
+
end
|
20
|
+
|
21
|
+
def date=(time)
|
22
|
+
if time.kind_of? String
|
23
|
+
@info[:date] = Time.parse(time)
|
24
|
+
else
|
25
|
+
@info[:date] = time
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def date
|
30
|
+
@info[:date]
|
31
|
+
end
|
32
|
+
|
33
|
+
def date_to_s
|
34
|
+
date_format(@info[:date])
|
35
|
+
end
|
36
|
+
|
37
|
+
def lastmodified=(time)
|
38
|
+
if time.kind_of? String
|
39
|
+
@info[:lastmodified] = Time.parse(time)
|
40
|
+
else
|
41
|
+
@info[:lastmodified] = time
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def lastmodified
|
46
|
+
@info[:lastmodified]
|
47
|
+
end
|
48
|
+
|
49
|
+
def lastmodified_to_s
|
50
|
+
date_format(@info[:lastmodified])
|
51
|
+
end
|
52
|
+
|
53
|
+
def all
|
54
|
+
@info
|
55
|
+
end
|
56
|
+
|
57
|
+
def to_latex
|
58
|
+
"\\newcommand{\\rblatexTitle}{#{escape_latex(title)}}\n"+
|
59
|
+
"\\newcommand{\\rblatexAuthor}{#{escape_latex(author)}}\n"+
|
60
|
+
"\\newcommand{\\rblatexPubdate}{#{escape_latex(date_to_s)}}\n"+
|
61
|
+
"\\newcommand{\\rblatexPageDirection}{#{escape_latex(page_progression_direction)}}\n"
|
62
|
+
end
|
63
|
+
|
64
|
+
def date_format(time)
|
65
|
+
time.strftime("%Y年%-m月%-d日")
|
66
|
+
end
|
67
|
+
|
68
|
+
def add_creator(name, role)
|
69
|
+
if !@info[:creator][role]
|
70
|
+
!@info[:creator][role] = Array.new
|
71
|
+
end
|
72
|
+
@info[:creator][role] << name
|
73
|
+
end
|
74
|
+
|
75
|
+
def author(sep = ", ")
|
76
|
+
aut = @info[:creator]["aut"]
|
77
|
+
if aut
|
78
|
+
aut.join(sep)
|
79
|
+
else
|
80
|
+
""
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module RbLatex
|
2
|
+
module Utils
|
3
|
+
|
4
|
+
ESCAPE_CHARS = {
|
5
|
+
"{" => "\\{",
|
6
|
+
"}" => "\\}",
|
7
|
+
"\\" => "\\textbackslash{}",
|
8
|
+
"#" => "\\#",
|
9
|
+
"$" => "\\$",
|
10
|
+
"%" => "\\%",
|
11
|
+
"&" => "\\&",
|
12
|
+
"^" => "\\textasciicircum{}",
|
13
|
+
"_" => "\\_",
|
14
|
+
"~" => "\\textasciitilde{}",
|
15
|
+
}
|
16
|
+
|
17
|
+
def escape_latex(str)
|
18
|
+
str.each_char.map do |char|
|
19
|
+
ESCAPE_CHARS[char] || char
|
20
|
+
end.join("")
|
21
|
+
end
|
22
|
+
module_function :escape_latex
|
23
|
+
end
|
24
|
+
end
|
data/lib/rb_latex.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
require "rb_latex/version"
|
2
|
+
require "rb_latex/error"
|
3
|
+
require "rb_latex/maker"
|
4
|
+
require "rb_latex/item_list"
|
5
|
+
require "rb_latex/meta_info"
|
6
|
+
require "rb_latex/logger"
|
7
|
+
require "rb_latex/utils"
|
8
|
+
|
9
|
+
module RbLatex
|
10
|
+
TEMPLATES_DIR = File.join(File.dirname(__FILE__), "../templates")
|
11
|
+
end
|
data/rb_latex.gemspec
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
lib = File.expand_path("../lib", __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require "rb_latex/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "rb_latex"
|
7
|
+
spec.version = RbLatex::VERSION
|
8
|
+
spec.authors = ["takahashim"]
|
9
|
+
spec.email = ["maki@rubycolor.org"]
|
10
|
+
|
11
|
+
spec.summary = %q{wrapper library of LaTeX}
|
12
|
+
spec.description = %q{wrapper library of LaTeX}
|
13
|
+
spec.homepage = "https://github.com/takahashim/rb_latex"
|
14
|
+
|
15
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
16
|
+
f.match(%r{^(test|spec|features)/})
|
17
|
+
end
|
18
|
+
spec.bindir = "exe"
|
19
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
|
+
spec.require_paths = ["lib"]
|
21
|
+
|
22
|
+
spec.add_development_dependency "bundler", "~> 1.16"
|
23
|
+
spec.add_development_dependency "rake", "~> 12.0"
|
24
|
+
spec.add_development_dependency "test-unit", "~> 3.2"
|
25
|
+
spec.add_development_dependency "test-unit-notify"
|
26
|
+
spec.add_development_dependency "terminal-notifier"
|
27
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
\documentclass[uplatex,dvipdfmx]{jsbook}
|
2
|
+
\usepackage[utf8]{inputenc}
|
3
|
+
\usepackage[T1]{fontenc}
|
4
|
+
\usepackage{plext}
|
5
|
+
\usepackage{listings}
|
6
|
+
\usepackage[dvipdfmx]{hyperref}
|
7
|
+
\usepackage{pxjahyper}
|
8
|
+
\usepackage{fancyvrb}
|
9
|
+
\usepackage{amssymb}
|
10
|
+
\usepackage{amsmath}
|
11
|
+
\usepackage{amsthm}
|
12
|
+
\usepackage{amsfonts}
|
13
|
+
\usepackage{longtable}
|
14
|
+
\usepackage{graphicx}
|
15
|
+
\usepackage{pxrubrica}
|
16
|
+
|
17
|
+
%%\usepackage{acronym}
|
18
|
+
|
19
|
+
\VerbatimFootnotes
|
20
|
+
|
21
|
+
\hypersetup{colorlinks=true,urlcolor=blue}
|
22
|
+
|
23
|
+
\begin{document}
|
24
|
+
<% @item_list.filenames.each do |filename| %>
|
25
|
+
\input{<%= filename %>}
|
26
|
+
<% end %>
|
27
|
+
\end{document}
|
metadata
ADDED
@@ -0,0 +1,130 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rb_latex
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- takahashim
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-05-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.16'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.16'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '12.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '12.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: test-unit
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.2'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.2'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: test-unit-notify
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: terminal-notifier
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
description: wrapper library of LaTeX
|
84
|
+
email:
|
85
|
+
- maki@rubycolor.org
|
86
|
+
executables: []
|
87
|
+
extensions: []
|
88
|
+
extra_rdoc_files: []
|
89
|
+
files:
|
90
|
+
- ".gitignore"
|
91
|
+
- ".travis.yml"
|
92
|
+
- Gemfile
|
93
|
+
- README.md
|
94
|
+
- Rakefile
|
95
|
+
- bin/console
|
96
|
+
- bin/setup
|
97
|
+
- lib/rb_latex.rb
|
98
|
+
- lib/rb_latex/error.rb
|
99
|
+
- lib/rb_latex/item_list.rb
|
100
|
+
- lib/rb_latex/logger.rb
|
101
|
+
- lib/rb_latex/maker.rb
|
102
|
+
- lib/rb_latex/meta_info.rb
|
103
|
+
- lib/rb_latex/utils.rb
|
104
|
+
- lib/rb_latex/version.rb
|
105
|
+
- rb_latex.gemspec
|
106
|
+
- templates/book.tex.erb
|
107
|
+
homepage: https://github.com/takahashim/rb_latex
|
108
|
+
licenses: []
|
109
|
+
metadata: {}
|
110
|
+
post_install_message:
|
111
|
+
rdoc_options: []
|
112
|
+
require_paths:
|
113
|
+
- lib
|
114
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - ">="
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
119
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - ">="
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: '0'
|
124
|
+
requirements: []
|
125
|
+
rubyforge_project:
|
126
|
+
rubygems_version: 2.7.3
|
127
|
+
signing_key:
|
128
|
+
specification_version: 4
|
129
|
+
summary: wrapper library of LaTeX
|
130
|
+
test_files: []
|