review 3.0.0.preview2 → 3.0.0.preview3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +7 -1
  3. data/NEWS.ja.md +49 -0
  4. data/NEWS.md +49 -0
  5. data/README.md +8 -2
  6. data/doc/LICENSE +20 -0
  7. data/doc/config.yml.sample +9 -2
  8. data/doc/customize_epub.ja.md +23 -0
  9. data/doc/customize_epub.md +23 -0
  10. data/doc/format.ja.md +98 -4
  11. data/doc/format.md +98 -1
  12. data/doc/makeindex.ja.md +2 -2
  13. data/doc/pdfmaker.ja.md +12 -3
  14. data/doc/pdfmaker.md +2 -2
  15. data/doc/preproc.ja.md +2 -2
  16. data/doc/quickstart.ja.md +1 -1
  17. data/doc/quickstart.md +1 -1
  18. data/lib/review/compiler.rb +1 -1
  19. data/lib/review/configure.rb +13 -1
  20. data/lib/review/epubmaker.rb +10 -4
  21. data/lib/review/htmlbuilder.rb +31 -9
  22. data/lib/review/init.rb +72 -3
  23. data/lib/review/makerhelper.rb +180 -1
  24. data/lib/review/pdfmaker.rb +23 -4
  25. data/lib/review/version.rb +1 -1
  26. data/lib/review/webmaker.rb +14 -4
  27. data/review.gemspec +1 -1
  28. data/samples/sample-book/src/Rakefile +20 -0
  29. data/samples/sample-book/src/config.yml +3 -2
  30. data/samples/sample-book/src/images/cover-a5.ai +5836 -16
  31. data/samples/sample-book/src/images/cover-b5.ai +5735 -15
  32. data/samples/syntax-book/config.yml +1 -1
  33. data/templates/LICENSE +1 -1
  34. data/templates/latex/config.erb +24 -11
  35. data/templates/latex/layout.tex.erb +15 -5
  36. data/templates/latex/review-jlreq/README.md +2 -1
  37. data/templates/latex/review-jlreq/review-base.sty +165 -22
  38. data/templates/latex/review-jlreq/review-jlreq.cls +180 -110
  39. data/templates/latex/review-jlreq/review-style.sty +13 -125
  40. data/templates/latex/review-jlreq/reviewmacro.sty +7 -0
  41. data/templates/latex/review-jsbook/README.md +129 -0
  42. data/templates/latex/review-jsbook/review-base.sty +33 -20
  43. data/templates/latex/review-jsbook/review-jsbook.cls +545 -0
  44. data/templates/latex/review-jsbook/reviewmacro.sty +7 -0
  45. data/test/assets/test_template.tex +27 -8
  46. data/test/assets/test_template_backmatter.tex +27 -8
  47. data/test/test_helper.rb +3 -0
  48. data/test/test_htmlbuilder.rb +3 -1
  49. data/test/test_pdfmaker.rb +2 -0
  50. data/vendor/gentombow/.gitignore +163 -0
  51. data/vendor/gentombow/LICENSE +27 -0
  52. data/vendor/gentombow/Makefile +36 -0
  53. data/vendor/gentombow/README.md +49 -0
  54. data/vendor/gentombow/bounddvi-en.pdf +0 -0
  55. data/vendor/gentombow/bounddvi-en.tex +135 -0
  56. data/vendor/gentombow/bounddvi.pdf +0 -0
  57. data/vendor/gentombow/bounddvi.sty +87 -0
  58. data/vendor/gentombow/bounddvi.tex +148 -0
  59. data/vendor/gentombow/create_archive.sh +24 -0
  60. data/vendor/gentombow/gentombow-ja.pdf +0 -0
  61. data/vendor/gentombow/gentombow-ja.tex +449 -0
  62. data/vendor/gentombow/gentombow.pdf +0 -0
  63. data/vendor/gentombow/gentombow.sty +747 -0
  64. data/vendor/gentombow/gentombow.tex +298 -0
  65. data/vendor/gentombow/pxgentombow.pdf +0 -0
  66. data/vendor/gentombow/pxgentombow.sty +16 -0
  67. data/vendor/gentombow/pxgentombow.tex +25 -0
  68. data/vendor/gentombow/tests/bounddvi-01-usage.tex +7 -0
  69. data/vendor/gentombow/tests/bounddvi-02-jstombow.tex +7 -0
  70. data/vendor/gentombow/tests/bounddvi-03-grfdvips.tex +9 -0
  71. data/vendor/gentombow/tests/bounddvi-04-grfdvipdfmx.tex +9 -0
  72. data/vendor/gentombow/tests/bounddvi-05-geodvips.tex +8 -0
  73. data/vendor/gentombow/tests/bounddvi-05a-geodvips.tex +9 -0
  74. data/vendor/gentombow/tests/bounddvi-06-geodvipdfmx.tex +8 -0
  75. data/vendor/gentombow/tests/bounddvi-06a-geodvipdfmx.tex +9 -0
  76. data/vendor/gentombow/tests/pxgentombow-01-usage.tex +6 -0
  77. data/vendor/gentombow/tests/pxgentombow-02-js.tex +6 -0
  78. data/vendor/gentombow/tests/pxgentombow-02a-js-error.tex +6 -0
  79. data/vendor/gentombow/tests/pxgentombow-03-notombowdate.tex +8 -0
  80. data/vendor/gentombow/tests/pxgentombow-04-pkgoption.tex +8 -0
  81. data/vendor/gentombow/tests/pxgentombow-05-tatecls.tex +6 -0
  82. metadata +40 -3
data/doc/makeindex.ja.md CHANGED
@@ -3,12 +3,12 @@
3
3
 
4
4
  ## 注意
5
5
  * LaTeX の mendex コマンドの実装に依存しているため、 現時点では英語または日本語以外の挙動は不明です。
6
- * 形態素解析は、外部ソフトウェアの MeCab (http://taku910.github.io/mecab/)、その辞書である IPA 辞書、MeCab の Ruby バインドである mecab に依存しています。
6
+ * 形態素解析は、外部ソフトウェアの MeCab (http://taku910.github.io/mecab/) 、その辞書である IPA 辞書、MeCab の Ruby バインドである mecab に依存しています。
7
7
  * LaTeX ビルダ以外のビルダでは、埋め込んだ索引を利用する手法を提供していません。後述のヒントを参照してください。
8
8
  * LaTeX ビルダでの索引生成機能は、デフォルトで無効にしています。設定 YAML ファイルで明示的に有効にする必要があります。
9
9
 
10
10
  ## MeCab のセットアップ
11
- 形態素解析による自動読みを使用する場合、MeCab (http://taku910.github.io/mecab/) およびその辞書、Ruby バインドライブラリの mecab をインストールしておく必要があります。
11
+ 形態素解析による自動読みを使用する場合、MeCab (http://taku910.github.io/mecab/) およびその辞書、Ruby バインドライブラリの mecab をインストールしておく必要があります。
12
12
 
13
13
  Debian GNU/Linux あるいは Ubuntu の環境では、次のようにパッケージをインストールします。
14
14
 
data/doc/pdfmaker.ja.md CHANGED
@@ -7,11 +7,20 @@ Re:VIEW の review-pdfmaker は、フリーソフトウェアの簡易 DTP シ
7
7
  * https://texwiki.texjp.org/?TeX入手法
8
8
 
9
9
  ## Re:VIEW バージョンによる変化についての注意
10
+ * Re:VIEW 3.0 より、使用するデフォルトのクラスファイルを jsbook.cls から review-jsbook.cls に変更しました。以下の「review-jsbook.cls について」を参照してください。
10
11
  * Re:VIEW 2.0 より、LaTeX コンパイラのデフォルトが pLaTeX から upLaTeX になりました。以下の「upLaTeX について」を参照してください。
11
12
  * Re:VIEW 2.0 より、image タグに `scale` オプションを使って倍率数値を定義していた場合の挙動が変わりました。以下の「scale オプションの挙動について」を参照してください。
12
13
  * Re:VIEW 2.0 より、config.yml 等の設定ファイルで使われる `prt` のデフォルトが「発行所」ではなく「印刷所」になりました。「発行所」には `pbl` のほうをお使いください。
13
14
 
14
- ## upLaTeX について
15
+ ## review-jsbook.cls について
16
+
17
+ ★TBD
18
+
19
+ `texdocumentclass` で明示的な設定をしていない場合は、config.yml の `review_version` の値に基づいて切り替えられ、2.0 の場合は従来の jsbook.cls が使われるようになっています。
20
+
21
+ ## Re:VIEW 2.0 以前の情報
22
+
23
+ ### upLaTeX について
15
24
 
16
25
  2016年4月リリースの Re:VIEW 2.0 より、LaTeX のコンパイラのデフォルトが、「pLaTeX」から「upLaTeX」に切り替わりました。upLaTeX は pLaTeX の内部文字処理を Unicode 対応にしたもので、丸数字(①②…)のように pLaTeXでは otf パッケージが必要だった文字、あるいは韓国語や中国語との混植などを、直接扱うことができます。
17
26
 
@@ -27,7 +36,7 @@ dvicommand: dvipdfmx
27
36
  dvioptions: "-d 5"
28
37
  ```
29
38
 
30
- ## 旧来の pLaTeX を使用するには
39
+ ### 旧来の pLaTeX を使用するには(Re:VIEW 1.0)
31
40
 
32
41
  既存のドキュメントについて、利用しているマクロやパッケージが upLaTeX でうまく動かない、あるいはこれまでと異なる紙面ができてしまう場合は、pLaTeX に戻したいと思うかもしれません。
33
42
 
@@ -51,7 +60,7 @@ dvioptions: "-d 5"
51
60
  <% end %>
52
61
  ```
53
62
 
54
- ## scale オプションの挙動について
63
+ ### scale オプションの挙動について
55
64
  Re:VIEW 2.0 より、``//image`` タグの第3オプションに ``scale=倍率`` で数値のみで倍率を指定していたときの挙動が変わりました。以前は「画像ファイルに対する倍率」でしたが、「紙面横幅に対する倍率」となります(もともと数値以外の文字も scale の値に含めていた場合には、変化はありません)。
56
65
 
57
66
  旧来の「画像ファイルに対する倍率」に戻したいときには、config.yml にパラメータ ``image_scale2width: false`` を指定してください(デフォルトは true)。
data/doc/pdfmaker.md CHANGED
@@ -13,7 +13,7 @@ To use the command, you need to set up LaTeX system.
13
13
 
14
14
  ## about upLaTeX
15
15
 
16
- In Re:VIEW 2.0 released at April 2016, default LaTeX compiler became upLaTeX from pLaTeX. The upLaTeX support Unicode and you can use unicode characters such like ①②... and other characters without otf package.
16
+ In Re:VIEW 2.0 released at April 2016, default LaTeX compiler became upLaTeX from pLaTeX. The upLaTeX support Unicode and you can use unicode characters and other characters without otf package.
17
17
 
18
18
  Almost packages in pLaTeX can be supported in upLaTeX, but some package (such as jsbook class and otf package) need `uplatex` option.
19
19
 
@@ -22,7 +22,7 @@ Default settings of Re:VIEW is below:
22
22
  ```yaml
23
23
  texcommand: uplatex
24
24
  texoptions: "-interaction=nonstopmode -file-line-error"
25
- texdocumentclass: ["jsbook", "uplatex,oneside"]
25
+ texdocumentclass: ["review-jsbook", "uplatex,twoside"]
26
26
  dvicommand: dvipdfmx
27
27
  dvioptions: "-d 5"
28
28
  ```
data/doc/preproc.ja.md CHANGED
@@ -25,7 +25,7 @@ end
25
25
  ```
26
26
  「`#@mapfile(ファイル名)`」から「`#@end`」は、指定したファイル名のファイル全体を本文中に埋め込むための記法です。埋め込む際には、`review-preproc`コマンドを実行します。
27
27
 
28
- まず、以下のように、引用したい部分に「`#@mapfile()`」と「`#@end`」だけを書きます。ここでは`//list`ブロック内にこの2行だけを記述しています。
28
+ まず、以下のように、引用したい部分に「`#@mapfile()`」と「`#@end`」だけを書きます。ここでは`//list`ブロック内にこの2行だけを記述しています。
29
29
 
30
30
  ```review
31
31
  //list[hello.rb.1][hello.re]{
@@ -82,7 +82,7 @@ if __FILE__ == $0
82
82
  Hello.new.hello("world")
83
83
  end
84
84
  ```
85
- *.reファイルの方には、「`#@mapfile(ファイル名)`」ではなく「`#@maprange(ファイル名,ID)`」を記述します。
85
+ *.reファイルのほうには、「`#@mapfile(ファイル名)`」ではなく「`#@maprange(ファイル名,ID)`」を記述します。
86
86
 
87
87
  ```review
88
88
  //list[range.rb][range.rb(抜粋)]{
data/doc/quickstart.ja.md CHANGED
@@ -206,7 +206,7 @@ $ review-index --level 掘り下げる見出しレベル数 -a
206
206
 
207
207
  ## クレジット
208
208
 
209
- Re:VIEW は、青木峰郎によって最初に作成されました。武藤健志がこの開発・保守を引き継ぎ、20164月時点では、武藤健志、高橋征義、角征典が開発・保守を継続しています。
209
+ Re:VIEW は、青木峰郎によって最初に作成されました。武藤健志がこの開発・保守を引き継ぎ、20189月時点では、武藤健志、高橋征義、角征典が開発・保守を継続しています。
210
210
 
211
211
  バグ・パッチの報告、開発者用メーリングリストなどについての情報は、
212
212
 
data/doc/quickstart.md CHANGED
@@ -209,7 +209,7 @@ $ review-index --level <heading level> -a
209
209
 
210
210
  ## Copyright
211
211
 
212
- The original author of Re:VIEW is Minero Aoki. The current maintainer is Kenshi Muto(@kmuto), and committers are Masayoshi Takahashi and Masanori Kado (2016/04).
212
+ The original author of Re:VIEW is Minero Aoki. The current maintainer is Kenshi Muto(@kmuto), and committers are Masayoshi Takahashi and Masanori Kado (September 2018).
213
213
 
214
214
  If you want to report bugs and patches, or to get more information, see:
215
215
 
@@ -481,7 +481,7 @@ module ReVIEW
481
481
  while word = scanner.scan(/(\[\]|\[.*?[^\\]\])/)
482
482
  w2 = word[1..-2].gsub(/\\(.)/) do
483
483
  ch = $1
484
- (ch == ']' or ch == '\\') ? ch : '\\' + ch
484
+ [']', '\\'].include?(ch) ? ch : '\\' + ch
485
485
  end
486
486
  words << w2
487
487
  end
@@ -77,7 +77,7 @@ module ReVIEW
77
77
  'footnotetext' => nil,
78
78
  'texcommand' => 'uplatex',
79
79
  'texoptions' => '-interaction=nonstopmode -file-line-error',
80
- 'texdocumentclass' => ['jsbook', 'uplatex,twoside'],
80
+ '_texdocumentclass' => ['review-jsbook', ''],
81
81
  'dvicommand' => 'dvipdfmx',
82
82
  'dvioptions' => '-d 5 -z 9',
83
83
  # for PDFMaker
@@ -89,6 +89,18 @@ module ReVIEW
89
89
  'makeindex_dic' => nil,
90
90
  'makeindex_mecab' => true,
91
91
  'makeindex_mecab_opts' => '-Oyomi'
92
+ },
93
+ 'imgmath_options' => {
94
+ 'format' => 'png',
95
+ 'converter' => 'pdfcrop', # dvipng | pdfcrop
96
+ 'pdfcrop_cmd' => 'pdfcrop --hires %i %o',
97
+ 'extract_singlepage' => nil,
98
+ 'pdfextract_cmd' => 'pdfjam -q --outfile %o %i %p',
99
+ 'preamble_file' => nil,
100
+ 'fontsize' => 10,
101
+ 'lineheight' => 10 * 1.2,
102
+ 'pdfcrop_pixelize_cmd' => 'pdftocairo -png -r 90 -f %p -l %p -singlefile %i %O',
103
+ 'dvipng_cmd' => 'dvipng -T tight -z 9 -p %p -l %p -o %o %i'
92
104
  }
93
105
  ]
94
106
  conf.maker = nil
@@ -23,11 +23,13 @@ require 'rexml/document'
23
23
  require 'rexml/streamlistener'
24
24
  require 'epubmaker'
25
25
  require 'review/epubmaker/reviewheaderlistener'
26
+ require 'review/makerhelper'
26
27
 
27
28
  module ReVIEW
28
29
  class EPUBMaker
29
30
  include ::EPUBMaker
30
31
  include REXML
32
+ include MakerHelper
31
33
 
32
34
  def initialize
33
35
  @producer = nil
@@ -103,10 +105,8 @@ module ReVIEW
103
105
  if @config['debug']
104
106
  FileUtils.rm_rf(booktmpname)
105
107
  end
106
- math_dir = "./#{@config['imagedir']}/_review_math"
107
- if @config['imgmath'] && Dir.exist?(math_dir)
108
- FileUtils.rm_rf(math_dir)
109
- end
108
+
109
+ cleanup_mathimg
110
110
 
111
111
  basetmpdir = build_path
112
112
  begin
@@ -125,6 +125,11 @@ module ReVIEW
125
125
  call_hook('hook_afterbody', basetmpdir)
126
126
 
127
127
  copy_backmatter(basetmpdir)
128
+
129
+ math_dir = "./#{@config['imagedir']}/_review_math"
130
+ if @config['imgmath'] && File.exist?("#{math_dir}/__IMGMATH_BODY__.tex")
131
+ make_math_images(math_dir)
132
+ end
128
133
  call_hook('hook_afterbackmatter', basetmpdir)
129
134
 
130
135
  ## push contents in basetmpdir into @producer
@@ -267,6 +272,7 @@ module ReVIEW
267
272
  book.config = @config
268
273
  @converter = ReVIEW::Converter.new(book, ReVIEW::HTMLBuilder.new)
269
274
  @compile_errors = nil
275
+
270
276
  book.parts.each do |part|
271
277
  if part.name.present?
272
278
  if part.file?
@@ -549,14 +549,19 @@ module ReVIEW
549
549
  elsif @book.config['imgmath']
550
550
  math_str = "\\begin{equation*}\n" + unescape(lines.join("\n")) + "\n\\end{equation*}\n"
551
551
  key = Digest::SHA256.hexdigest(math_str)
552
- math_dir = "./#{@book.config['imagedir']}/_review_math"
552
+ math_dir = File.join(@book.config['imagedir'], '_review_math')
553
553
  Dir.mkdir(math_dir) unless Dir.exist?(math_dir)
554
- img_path = "./#{math_dir}/_gen_#{key}.png"
555
- make_math_image(math_str, img_path)
556
- puts %Q(<img src="#{img_path}" />)
554
+ img_path = File.join(math_dir, "_gen_#{key}.#{@book.config['imgmath_options']['format']}")
555
+ if @book.config.check_version('2', exception: false)
556
+ make_math_image(math_str, img_path)
557
+ puts %Q(<img src="#{img_path}" />)
558
+ else
559
+ defer_math_image(math_str, img_path, key)
560
+ puts %Q(<img src="#{img_path}" class="math_gen_#{key}" alt="#{escape(lines.join(' '))}" />)
561
+ end
557
562
  else
558
563
  print '<pre>'
559
- puts lines.join("\n")
564
+ puts escape(lines.join("\n"))
560
565
  puts '</pre>'
561
566
  end
562
567
  puts '</div>'
@@ -924,11 +929,16 @@ module ReVIEW
924
929
  elsif @book.config['imgmath']
925
930
  math_str = '$' + str + '$'
926
931
  key = Digest::SHA256.hexdigest(str)
927
- math_dir = "./#{@book.config['imagedir']}/_review_math"
932
+ math_dir = File.join(@book.config['imagedir'], '_review_math')
928
933
  Dir.mkdir(math_dir) unless Dir.exist?(math_dir)
929
- img_path = "./#{math_dir}/_gen_#{key}.png"
930
- make_math_image(math_str, img_path)
931
- %Q(<span class="equation"><img src="#{img_path}" /></span>)
934
+ img_path = File.join(math_dir, "_gen_#{key}.#{@book.config['imgmath_options']['format']}")
935
+ if @book.config.check_version('2', exception: false)
936
+ make_math_image(math_str, img_path)
937
+ %Q(<span class="equation"><img src="#{img_path}" /></span>)
938
+ else
939
+ defer_math_image(math_str, img_path, key)
940
+ %Q(<span class="equation"><img src="#{img_path}" class="math_gen_#{key}" alt="#{escape(str)}" /></span>)
941
+ end
932
942
  else
933
943
  %Q(<span class="equation">#{escape(str)}</span>)
934
944
  end
@@ -1192,7 +1202,19 @@ module ReVIEW
1192
1202
  @ol_num = num.to_i
1193
1203
  end
1194
1204
 
1205
+ def defer_math_image(str, path, key)
1206
+ # for Re:VIEW >3
1207
+ File.open(File.join(File.dirname(path), '__IMGMATH_BODY__.tex'), 'a+') do |f|
1208
+ f.puts str
1209
+ f.puts '\\clearpage'
1210
+ end
1211
+ File.open(File.join(File.dirname(path), '__IMGMATH_BODY__.map'), 'a+') do |f|
1212
+ f.puts key
1213
+ end
1214
+ end
1215
+
1195
1216
  def make_math_image(str, path, fontsize = 12)
1217
+ # Re:VIEW 2 compatibility
1196
1218
  fontsize2 = (fontsize * 1.2).round.to_i
1197
1219
  texsrc = <<-EOB
1198
1220
  \\documentclass[12pt]{article}
data/lib/review/init.rb CHANGED
@@ -8,6 +8,8 @@
8
8
 
9
9
  require 'fileutils'
10
10
  require 'optparse'
11
+ require 'net/http'
12
+ require 'tempfile'
11
13
  require 'review'
12
14
 
13
15
  module ReVIEW
@@ -38,6 +40,7 @@ module ReVIEW
38
40
  generate_rakefile(dir)
39
41
  generate_gemfile(dir)
40
42
  generate_doc(dir) unless @without_doc
43
+ download_and_extract_archive(dir, @archive) if @archive
41
44
  end
42
45
  end
43
46
 
@@ -58,12 +61,15 @@ module ReVIEW
58
61
  opts.on('--latex-template name', 'specify LaTeX template name. (default: review-jsbook)') do |tname|
59
62
  @template = tname
60
63
  end
61
- opts.on('', '--epub-version VERSION', 'define EPUB version') do |version|
64
+ opts.on('', '--epub-version VERSION', 'define EPUB version.') do |version|
62
65
  @epub_version = version
63
66
  end
64
- opts.on('', '--without-doc', "don't generate doc files") do
67
+ opts.on('', '--without-doc', "don't generate doc files.") do
65
68
  @without_doc = true
66
69
  end
70
+ opts.on('-p', '--package archivefile', 'extract from local or network archive.') do |archive|
71
+ @archive = archive
72
+ end
67
73
 
68
74
  begin
69
75
  opts.parse!(args)
@@ -125,15 +131,18 @@ EOS
125
131
  def generate_cover_image(dir)
126
132
  FileUtils.cp(@review_dir + '/samples/sample-book/src/images/cover.jpg',
127
133
  dir + '/images/')
134
+ FileUtils.cp(@review_dir + '/samples/sample-book/src/images/cover-a5.ai',
135
+ dir + '/images/')
128
136
  end
129
137
 
130
138
  def generate_config(dir)
131
139
  today = Time.now.strftime('%Y-%m-%d')
132
140
  content = File.read(@review_dir + '/doc/config.yml.sample', encoding: 'utf-8')
133
141
  content.gsub!(/^#\s*coverimage:.*$/, 'coverimage: cover.jpg')
142
+ content.gsub!(/^ #\s*coverimage:.*$/, ' coverimage: cover-a5.ai')
134
143
  content.gsub!(/^#\s*date:.*$/, "date: #{today}")
135
144
  content.gsub!(/^#\s*history:.*$/, %Q(history: [["#{today}"]]))
136
- content.gsub!(/^#\s*texstyle:.*$/, 'texstyle: reviewmacro')
145
+ content.gsub!(/^#\s*texstyle:.*$/, 'texstyle: ["reviewmacro"]')
137
146
  content.gsub!(/^(#\s*)?stylesheet:.*$/, %Q(stylesheet: ["style.css"]))
138
147
  if @epub_version.to_i == 2
139
148
  content.gsub!(/^#.*epubversion:.*$/, 'epubversion: 2')
@@ -152,6 +161,8 @@ EOS
152
161
  tdir = File.join(@review_dir, '/templates/latex', @template)
153
162
  @logger.error "#{tdir} not found." unless File.exist?(tdir)
154
163
  FileUtils.cp Dir.glob(tdir + '/*.*'), texmacrodir
164
+ # provide gentombow from vendor/. current version is 2018/08/30 v0.9j
165
+ FileUtils.cp File.join(@review_dir, '/vendor/gentombow/gentombow.sty'), File.join(texmacrodir, 'gentombow09j.sty')
155
166
  end
156
167
 
157
168
  def generate_rakefile(dir)
@@ -190,5 +201,63 @@ EOS
190
201
  md_files = Dir.glob(@review_dir + '/doc/*.md').map.to_a
191
202
  FileUtils.cp md_files, docdir
192
203
  end
204
+
205
+ def download_and_extract_archive(dir, filename)
206
+ begin
207
+ require 'zip'
208
+ rescue LoadError
209
+ @logger.error 'extracting needs rubyzip.'
210
+ exit 1
211
+ end
212
+
213
+ if filename =~ %r{\Ahttps?://}
214
+ begin
215
+ @logger.info "Downloading from #{filename}"
216
+ zipdata = Net::HTTP.get(URI.parse(filename))
217
+ rescue StandardError => err
218
+ @logger.error "Failed to download #{filename}: #{err.message}"
219
+ exit 1
220
+ end
221
+
222
+ Tempfile.create('reviewinit') do |f|
223
+ zipfilename = f.path
224
+ f.write zipdata
225
+
226
+ extract_archive(dir, zipfilename, filename)
227
+ end
228
+ else
229
+ unless File.readable?(filename)
230
+ @logger.error "Failed to open #{filename}"
231
+ exit 1
232
+ end
233
+ extract_archive(dir, filename, filename)
234
+ end
235
+ end
236
+
237
+ def extract_archive(dir, filename, originalfilename)
238
+ made = nil
239
+ begin
240
+ Zip::File.open(filename) do |zip|
241
+ zip.each do |entry|
242
+ fname = entry.name.gsub('\\', '/')
243
+ if fname =~ /__MACOSX/ || fname =~ /\.DS_Store/
244
+ next
245
+ end
246
+
247
+ if fname =~ %r{\A/} || fname =~ /\.\./ # simple fool proof
248
+ made = nil
249
+ break
250
+ end
251
+
252
+ # `true' means override
253
+ entry.extract(File.join(dir, fname)) { true }
254
+ end
255
+ made = true
256
+ end
257
+ raise Zip::Error unless made
258
+ rescue Zip::Error => err
259
+ @logger.error "#{originalfilename} seems invalid or broken zip file: #{err.message}"
260
+ end
261
+ end
193
262
  end
194
263
  end
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2012-2017 Yuto HAYAMIZU, Kenshi Muto
1
+ # Copyright (c) 2012-2018 Yuto HAYAMIZU, Kenshi Muto
2
2
  #
3
3
  # This program is free software.
4
4
  # You can distribute or modify this program under the terms of
@@ -8,6 +8,7 @@
8
8
  require 'pathname'
9
9
  require 'fileutils'
10
10
  require 'yaml'
11
+ require 'shellwords'
11
12
 
12
13
  module ReVIEW
13
14
  module MakerHelper
@@ -64,5 +65,183 @@ module ReVIEW
64
65
  image_files
65
66
  end
66
67
  module_function :copy_images_to_dir
68
+
69
+ def cleanup_mathimg
70
+ math_dir = "./#{@config['imagedir']}/_review_math"
71
+ if @config['imgmath'] && Dir.exist?(math_dir)
72
+ FileUtils.rm_rf(math_dir)
73
+ end
74
+ end
75
+
76
+ def default_imgmath_preamble
77
+ <<-EOB
78
+ \\documentclass[uplatex]{jsarticle}
79
+ \\usepackage[deluxe,uplatex]{otf}
80
+ \\usepackage[T1]{fontenc}
81
+ \\usepackage{textcomp}
82
+ \\usepackage{lmodern}
83
+ \\usepackage[dvipdfmx]{graphicx}
84
+ \\usepackage[dvipdfmx,table]{xcolor}
85
+ \\usepackage[utf8]{inputenc}
86
+ \\usepackage{ascmac}
87
+ \\usepackage{float}
88
+ \\usepackage{alltt}
89
+ \\usepackage{amsmath}
90
+ \\usepackage{amssymb}
91
+ \\usepackage{amsfonts}
92
+ \\usepackage{anyfontsize}
93
+ \\usepackage{bm}
94
+ \\pagestyle{empty}
95
+ EOB
96
+ end
97
+
98
+ def make_math_images(math_dir)
99
+ fontsize = @config['imgmath_options']['fontsize'].to_f
100
+ lineheight = @config['imgmath_options']['lineheight'].to_f
101
+
102
+ texsrc = default_imgmath_preamble
103
+ if @config['imgmath_options']['preamble_file'] && File.readable?(@config['imgmath_options']['preamble_file'])
104
+ texsrc = File.read(@config['imgmath_options']['preamble_file'])
105
+ end
106
+
107
+ texsrc << <<-EOB
108
+ \\begin{document}
109
+ \\fontsize{#{fontsize}}{#{lineheight}}\\selectfont
110
+ \\input{__IMGMATH_BODY__}
111
+ \\end{document}
112
+ EOB
113
+
114
+ math_dir = File.realpath(math_dir)
115
+ Dir.mktmpdir do |tmpdir|
116
+ FileUtils.cp([File.join(math_dir, '__IMGMATH_BODY__.tex'),
117
+ File.join(math_dir, '__IMGMATH_BODY__.map')],
118
+ tmpdir)
119
+ tex_path = File.join(tmpdir, '__IMGMATH__.tex')
120
+ File.write(tex_path, texsrc)
121
+
122
+ begin
123
+ case @config['imgmath_options']['converter']
124
+ when 'pdfcrop'
125
+ make_math_images_pdfcrop(tmpdir, tex_path, math_dir)
126
+ when 'dvipng'
127
+ make_math_images_dvipng(tmpdir, tex_path, math_dir)
128
+ else
129
+ error "unknown math converter error. imgmath_options/converter parameter should be 'pdfcrop' or 'dvipng'."
130
+ end
131
+ rescue CompileError
132
+ FileUtils.cp([tex_path,
133
+ File.join(File.dirname(tex_path), '__IMGMATH__.log')],
134
+ math_dir)
135
+ error "LaTeX math compile error. See #{math_dir}/__IMGMATH__.log for details."
136
+ end
137
+ end
138
+ FileUtils.rm_f([File.join(math_dir, '__IMGMATH_BODY__.tex'),
139
+ File.join(math_dir, '__IMGMATH_BODY__.map')])
140
+ end
141
+
142
+ def make_math_images_pdfcrop(dir, tex_path, math_dir)
143
+ Dir.chdir(dir) do
144
+ dvi_path = '__IMGMATH__.dvi'
145
+ pdf_path = '__IMGMATH__.pdf'
146
+ out, status = Open3.capture2e(*[@config['texcommand'], @config['texoptions'].shellsplit, tex_path].flatten.compact)
147
+ if !status.success? || (!File.exist?(dvi_path) && !File.exist?(pdf_path))
148
+ raise CompileError
149
+ end
150
+ if File.exist?(dvi_path)
151
+ out, status = Open3.capture2e(*[@config['dvicommand'], @config['dvioptions'].shellsplit, dvi_path].flatten.compact)
152
+ if !status.success? || !File.exist?(pdf_path)
153
+ warn "error in #{@config['dvicommand']}. Error log:\n#{out}"
154
+ raise CompileError
155
+ end
156
+ end
157
+
158
+ args = @config['imgmath_options']['pdfcrop_cmd'].shellsplit
159
+ args.map! do |m|
160
+ m.sub('%i', pdf_path).
161
+ sub('%o', '__IMGMATH__pdfcrop.pdf')
162
+ end
163
+ out, status = Open3.capture2e(*args)
164
+ unless status.success?
165
+ warn "error in pdfcrop. Error log:\n#{out}"
166
+ raise CompileError
167
+ end
168
+ pdf_path = '__IMGMATH__pdfcrop.pdf'
169
+ pdf_path2 = pdf_path
170
+
171
+ File.open('__IMGMATH_BODY__.map') do |f|
172
+ page = 0
173
+ f.each_line do |key|
174
+ page += 1
175
+ key.chomp!
176
+ if File.exist?(File.join(math_dir, "_gen_#{key}.#{@config['imgmath_options']['format']}"))
177
+ # made already
178
+ next
179
+ end
180
+
181
+ if @config['imgmath_options']['extract_singlepage']
182
+ # if extract_singlepage = true, split each page
183
+ args = @config['imgmath_options']['pdfextract_cmd'].shellsplit
184
+
185
+ args.map! do |m|
186
+ m.sub('%i', pdf_path).
187
+ sub('%o', "__IMGMATH__pdfcrop_p#{page}.pdf").
188
+ sub('%O', "__IMGMATH__pdfcrop_p#{page}").
189
+ sub('%p', page.to_s)
190
+ end
191
+ out, status = Open3.capture2e(*args)
192
+ unless status.success?
193
+ warn "error in pdf extracting. Error log:\n#{out}"
194
+ raise CompileError
195
+ end
196
+
197
+ pdf_path2 = "__IMGMATH__pdfcrop_p#{page}.pdf"
198
+ end
199
+
200
+ args = @config['imgmath_options']['pdfcrop_pixelize_cmd'].shellsplit
201
+ args.map! do |m|
202
+ m.sub('%i', pdf_path2).
203
+ sub('%o', File.join(math_dir, "_gen_#{key}.#{@config['imgmath_options']['format']}")).
204
+ sub('%O', File.join(math_dir, "_gen_#{key}")).
205
+ sub('%p', page.to_s)
206
+ end
207
+ out, status = Open3.capture2e(*args)
208
+ unless status.success?
209
+ warn "error in pdf pixelizing. Error log:\n#{out}"
210
+ raise CompileError
211
+ end
212
+ end
213
+ end
214
+ end
215
+ end
216
+
217
+ def make_math_images_dvipng(dir, tex_path, math_dir)
218
+ Dir.chdir(dir) do
219
+ dvi_path = '__IMGMATH__.dvi'
220
+ out, status = Open3.capture2e(*[@config['texcommand'], @config['texoptions'].shellsplit, tex_path].flatten.compact)
221
+ if !status.success? || !File.exist?(dvi_path)
222
+ raise CompileError
223
+ end
224
+
225
+ File.open('__IMGMATH_BODY__.map') do |f|
226
+ page = 0
227
+ f.each_line do |key|
228
+ page += 1
229
+ key.chomp!
230
+ args = @config['imgmath_options']['dvipng_cmd'].shellsplit
231
+ args.map! do |m|
232
+ m.sub('%i', dvi_path).
233
+ sub('%o', File.join(math_dir, "_gen_#{key}.#{@config['imgmath_options']['format']}")).
234
+ sub('%O', File.join(math_dir, "_gen_#{key}")).
235
+ sub('%p', page.to_s)
236
+ end
237
+ out, status = Open3.capture2e(*args)
238
+ unless status.success?
239
+ warn "error in dvipng. Error log:\n#{out}"
240
+ raise CompileError
241
+ end
242
+ end
243
+ end
244
+ end
245
+ end
67
246
  end
68
247
  end