47

卒研発表

  • Upload
    yayugu

  • View
    549

  • Download
    8

Embed Size (px)

Citation preview

電子書籍を

つくるクラウド

組版システムの開発

大矢研究室

電子情報工学科五年

矢口裕也

概要

•日本語用縦書き電子書籍システムを開発した

既存技術への不満

Amazon Kindle

•日本語組版→☓

•多デバイス対応→○

TeaTime, XMDF(国産ビューア・フォーマット)

•日本語組版→○

•多デバイス対応→☓

evalbook(本研究で開発)

•日本語組版→◎

•多デバイス対応→◎

evalbook

HTML

PDF

<html> <title>こころ</title> <author>夏目漱石</author> <h2>上 先生と私</h2> <rb>私</rb><rt>わたくし</rt>はその人を常に先生と呼んでいた。<br />......

端末

電子書籍アプリ

端末

PDF / imageviewer

サーバ

evalbook

従来 evalbookの方式

従来 evalbook

端末毎にアプリの開発が必要

1つのサーバ上で動作するプログラムだけで済む

evalbook

Web UI

pLaTeX

pLaTeX code generator

HTML parser

Web UI

•Ruby•Sinatra•簡単なWebアプリ

pLaTeX code generator

•テンプレート

•生成されるpLaTeXコードの外枠

1 \documentclass[a4j,<%=t.column%>]{tarticle} 2 \usepackage[dvipdfm]{graphicx} 3 \usepackage[deluxe, burasage]{otf} 4 \usepackage[dvipdfm]{color} 5 \usepackage[dvipdfm,% 6 bookmarks=true,% 7 bookmarksnumbered=true,% 8 colorlinks=true]{hyperref} 9 \usepackage{fancyvrb}10 \usepackage{fancyhdr}

<%= %>の部分に動的に値/

文字列が埋め込まれる

1 \documentclass[a4j,<%=t.column%>]{tarticle}

<%= %>の部分に動的に値/

文字列が埋め込まれる

・onecolumn

・twocolumn

12 \makeatletter13 \DeclareFontShape{JT1}{hmc}{m}{n}{<-> s * [0.9375] brsgnmlminr-v}{}14 \renewcommand{\normalsize}{\@setfontsize\normalsize{<%=t.normalsize%>pt}{<%=t.lineskip(t.normalsize)%>}}15 \renewcommand{\tiny}{\@setfontsize\tiny{<%=t.tiny%>pt}{<%=t.lineskip(t.tiny)%>}}........19 \renewcommand{\huge}{\@setfontsize\huge{<%=t.huge%>pt}{<%=t.lineskip(t.huge)%>}}

normalsize, largeなどを再定義する.フォントの大きさは対象デバイス・ユーザの指定により毎回変化する

14 \renewcommand{\normalsize}{\@setfontsize\normalsize{<%=t.normalsize%>pt}{<%=t.lineskip(t.normalsize)%>}}

normalsize, largeなどを再定義する.フォントの大きさは対象デバイス・ユーザの指定により毎回変化する

13pt

19.5pt = 13pt × 1.5

フォントサイズ

行送り

21 \def\ps@myhead{\let\ps@jpl@in\ps@headnombre22 \let\@oddfoot\@empty\let\@evenfoot\@empty23 \def\@evenhead{{\tiny <%= t.title || '' %> <%= t.author || '' %>\hfill \thepage{}}}%24 \def\@oddhead{{\tiny <%= t.title || '' %> <%= t.author || '' %>\hfill \thepage{}}}%25 \let\@mkboth\markboth26 }27 \pagestyle{myhead}28 \makeatother

本の作者・タイトルの情報があれば各ページのヘッダに挿入

23 \def\@evenhead{{\tiny <%= t.title || '' %> <%= t.author || '' %>\hfill \thepage{}}}%24 \def\@oddhead{{\tiny <%= t.title || '' %> <%= t.author || '' %>\hfill \thepage{}}}%

本の作者・タイトルの情報があれば各ページのヘッダに挿入

奇数ページ

偶数ページ

タイトルこころ

著者夏目漱石

HTML Parser

•HTMLをpLaTeXのコード片に変換・Ruby ・Nokogiri・内部DSL(自作)

93 tag(:rb) {"\\kana{#{recur}}"} 94 tag(:rt) {"{#{recur}}"} 95 tag(:rp) {""} 96 97 tag(:br) {'\\par{}'} 98 tag :hr do 99 "\100 \\vspace{1zw plus .1zw minus .4zw}\n\n101 \n\n\\noindent102 \\hfil103 \\rule{#{@t.textwidth_consider_column * 0.7}pt}{.01zw}104 \\hfill\n\n"105 end

Ruby内部DSLによる再帰的なHTMLパーサ・pLaTeXコードジェネレータ使用例

93 tag(:rb) {"\\kana{#{recur}}"} 94 tag(:rt) {"{#{recur}}"}

Ruby内部DSLによる再帰的なHTMLパーサ・pLaTeXコードジェネレータ使用例

<rb>檸檬</rb><rt>れもん</rt>

→ \kana{檸檬}{れもん}

pLaTeX等の実行24 open("#{$dir_tmp}/#{filename}.tex", 'w'){|fp| fp.write(Erubis::Eruby.new(template).result(binding))}25 open("#{$dir_tmp}/#{filename}.sh", 'w'){|fp| fp.write(<<-"EOF")}26 ebb *.pdf27 platex -interaction=nonstopmode #{$dir_tmp}/#{filename}.tex28 dvipdfmx -f #{$dir_sty}/notembed.map -p #{t.width}pt,#{t.height}pt #{$dir_tmp}/#{filename}.dvi29 mv #{filename}.pdf #{$dir_public_tmp}30 rm #{filename}.tex #{filename}.dvi31 EOF32 do_command($dir_tmp, "sh #{filename}.sh")

組版•基本的な箇所は既存パッケージを利用

•カバーできない箇所はpLaTeXコード生成時に自力対応(Ruby側で)

利用したパッケージ•ふりがな

•furiganaパッケージ

•正方形フォントメトリック・ぶら下げ組

•OTF beta

自力対応した箇所

•版面のパラメタの値

•画像の貼り付け

版面のパラメタの値•版面(画面)の大きさはデバイス毎に異なる

•Ruby側でWebUIからの入力(画面サイズ・アスペクト比など)をもとに計算する

各パラメタの計算66 def textheight67 ((width * 0.925 / lineskip(@fontsize)).to_i - 1) * lineskip(@fontsize) + @fontsize68 end69 70 def oddsidemargin71 (width - textheight - tiny / 2) / 272 end73 74 def column75 if textwidth / @fontsize > 4076 "twocolumn"77 else78 "onecolumn"79 end80 end

版面のパラメタの値(出力例) \paperwidth=143.90825102604714pt \paperheight=206.86811084994275pt \textwidth=177.1875pt \textheight=119.25pt \topmargin=4.5pt \oddsidemargin=11.20412551302357pt \columnsep=16.875pt \headheight=4.5pt \headsep=13.480610849942753pt \topskip=0pt

画像

•pLaTeX, ghostscriptに画像を扱わせない戦略

画像

•Ruby側で画像の情報を取得,全ての画像をPDFに変換しgsを不要に→ImageMagickを利用

画像のハイパーリンク•pLaTeX及びgraphicxパッケージの命令では対応できない→dvipdfmxにspecial命令を送る

171 def a_img width, height172 "\173 \\begingroup\174 \\catcode`\\_=11\175 \\catcode`\\%=11\176 \\catcode`\\#=11\177 \\catcode`\\$=11\178 \\catcode`\\&=11\179 \\special{pdf:ann width #{width}pt height #{height}pt \180 << /Subtype /Link /A << /S /URI /URI (#{@a_url}) >> >>}\\endgroup \181 "182 end

174 \\catcode`\\_=11\175 \\catcode`\\%=11\176 \\catcode`\\#=11\177 \\catcode`\\$=11\178 \\catcode`\\&=11\

URLに使う記号(_%#...)

をTeXで通常の文字列として扱うように

179 \\special{pdf:ann width #{width}pt height #{height}pt \180 << /Subtype /Link /A << /S /URI /URI (#{@a_url}) >> >>}

special命令(TeXでは解釈されずdviwareにそのまま届く命令)で画像の上に同じ大きさのハイパーリンクを重ねる

640

480

http://example.com/hoge_fuga.php?a=b&c=d

1行の長さは40~45文字を超えると読みづらい →40文字を超えると自動的に2段組に

幅を5.5cmに指定したとき →長さが足りないと自動的に収まるサイズに

幅をページいっぱいに指定したとき

その他細かい調整•和欧間文字比

•kanjiskip, xkanjiskip•禁則(行頭の「っ」を許すなど)

•dvipdfmxのfontMap

ParseDVI 1 bop [8] 2 down 3113.3460235595703125 3 down -3164.9630889892578125 4 right -52.047943115234375 5 xxx color push gray 0 6 xxx pdf:dest (page.8) [@thispage /XYZ @xpos @ypos] 7 right 442.75 8 xxx color pop 9 down 319.687510 right -52.04794311523437511 down -319.687512 dir tate13 down -437.5937514 fnt brsgnmlminr-v 10.312515 set ち16 w -0.006240844726562517 set な18 w0 -0.006240844726562519 set み20 w0 -0.006240844726562521 set に22 w0 -0.006240844726562523 set 元24 w0 -0.006240844726562525

今ある/今後でるほぼ全てのデバイスに対応

evalbook

PC

Kindle 2Kindle DX

PSP

iPhoneiPad

携帯電話(au)

携帯電話(softbank)携帯電話(docomo)

WindowsPhone7Galapagos

Android

人間失格

8

とこそ、謂わば万世一系の人間の「真理」とかい

うものに違いない、自分にはその真理を行う力が

無いのだから、もはや人間と一緒に住めないので

はないかしら、と思い込んでしまうのでした。だ

から自分には、言い争いも自己弁解も出来ないの

でした。人から悪く言われると、いかにも、もっ

とも、自分がひどい思い違いをしているような気

がして来て、いつもその攻撃を黙して受け、内心、

狂うほどの恐怖を感じました。

 それは誰でも、人から非難せられたり、怒られ

たりしていい気持がするものでは無いかも知れま

せんが、自分は怒っている人間の顔に、 しし

獅子 より

も  わに鰐 よりも竜よりも、もっとおそろしい動物の本

性を見るのです。ふだんは、その本性をかくして

いるようですけれども、何かの機会に、たとえば、

牛が草原でおっとりした形で寝ていて、突如、

 しっぽ

尻尾 でピシッと腹の  あぶ虻 を打ち殺すみたいに、不意

に人間のおそろしい正体を、怒りに依って暴露す

る様子を見て、自分はいつも髪の逆立つほどの

  せんりつ

戦慄 を覚え、この本性もまた人間の生きて行く資

格の一つなのかも知れないと思えば、ほとんど自

分に絶望を感じるのでした。

 人間に対して、いつも恐怖に震いおののき、ま

た、人間としての自分の言動に、みじんも自信を

持てず、そうして自分ひとりの  おうのう

懊悩 は胸の中の小

箱に秘め、その憂鬱、ナアヴァスネスを、ひたか

くしに隠して、ひたすら無邪気の楽天性を装い、

自分はお道化たお変人として、次第に完成されて

行きました。

 何でもいいから、笑わせておればいいのだ、そ

うすると、人間たちは、自分が彼等の所謂「生

活」の外にいても、あまりそれを気にしないので

はないかしら、とにかく、彼等人間たちの目障り

になってはいけない、自分は無だ、風だ、  そら空 だ、

というような思いばかりが募り、自分はお道化に

依って家族を笑わせ、また、家族よりも、もっと

不可解でおそろしい下男や下女にまで、必死のお

道化のサーヴィスをしたのです。

両立

•美しい組版

•多くのデバイスに対応

•HTMLのURLで入力

まとめ

利用したプログラム・コンテンツ

•Ruby, 各種gemライブラリ

•pLaTeX, 各種マクロファイル

•Google Search API•青空文庫

今後の展開

•evalbookのさらなる開発

•pure javascriptなevalbookの開発