小説家になろうのコンテンツから縦書きpdfを作成する その2

小説家になろうのコンテンツから縦書きpdfを作成する その1 - k-igrsの日記

からの続き

 

シェルスクリプト

 その1での変換をスクリプトにした例を以下に示す。

#!/bin/bash

if [ -e ./tmpfile ]; then \rm -r tmpfile fi mkdir -p tmpfile if [ -e ./outputb.tex ]; then \rm -r outputb.tex fi touch outputb.tex onetimeflag=0 for fh in input/*.html do # if [ $onetimeflag -eq 0 ]; then grep '^作者:<a href' $fh |sed -e 's/^作者.*">//' -e 's/<\/a>$//' > ./tmpfile/tmp_auth grep '^dc:title="' $fh |sed -e 's/^dc:title="//' -e 's/"$//' > ./tmpfile/tmp_title echo "" > ./tmpfile/tmp_section onetimeflag=1 fi # perl -e ' while(<>){ if(/^<p class="chapter_title">/){ chomp; s/^<p class=.*title">//; s/<\/p>$//; $section=$_; open(RDFILE, "< ./tmpfile/tmp_section"); $tmp_section=<RDFILE>; chomp($tmp_section); close(RDFILE); if( $section ne $tmp_section ){ print "\\Section{$section}\n" ; open(WRFILE, "> ./tmpfile/tmp_section"); print WRFILE "$section\n"; close(WRFILE); } } if(/^<p class="novel_subtitle">/){ chomp; s/^<p class=.*title">//; s/<\/p>$//; $subsection=$_; print "\\Subsection{$subsection}\n"; print "\\markright{$subsection}\n";
} }' $fh >> outputb.tex # perl -e ' while(<>){ if(/^<p id="L[0-9]+"/){ s/<\/rb><rp>\(<\/rp><rt>/<\/rb><rp>(<\/rp><rt>/g; s/<\/rt><rp>\)<\/rp><\/ruby>/<\/rt><rp>)<\/rp><\/ruby>/g; s/\&quot\;/"/g; s/&lt;/</g; s/&gt;/>/g; s/\#/#/g; s/\$/$/g; s/%/%/g; s/&/&/g; print $_ } }' $fh > ./tmpfile/tmpf1 # perl -e ' while(<>){ s/^<p id="L[0-9]+"> *<br \/><\/p>/\\vskip\\baselineskip/; s/<ruby><rb>(.*?)<\/rb><rp>(<\/rp><rt>(.*?)<\/rt><rp>)<\/rp><\/ruby>/\\ruby{$1}{$2}/g; s/<ruby><rb>(.*?)<\/rb><rp>《<\/rp><rt>(.*?)<\/rt><rp>》<\/rp><\/ruby>/\\ruby{$1}{$2}/g; s/!\?/\\rensuji{!\?}/g; print $_; }' ./tmpfile/tmpf1 > ./tmpfile/tmpf2 # perl -e ' while(<>){ s/^<p id="L[0-9]+">(.*)<\/p>$/$1\n/; s/^ +//; print $_ }' ./tmpfile/tmpf2 >> outputb.tex done perl -e ' open(RDFILE, "< ./tmpfile/tmp_auth"); $tmp_auth=<RDFILE>; chomp($tmp_auth); close(RDFILE); open(RDFILE, "< ./tmpfile/tmp_title"); $tmp_title=<RDFILE>; chomp($tmp_title); close(RDFILE); # print "\\documentclass[a5j,12pt]{ltjtarticle}\n"; print "\n"; print "% -----章を番号無しで表示し目次に表示するマクロ-----\n"; print "\\newcommand{\\Section}[1]{\\section*{#1}\n"; print "\\addcontentsline{toc}{section}{#1}}\n"; print "\\newcommand{\\Subsection}[1]{\\section*{#1}\n"; print "\\addcontentsline{toc}{subsection}{#1}}\n"; print "\n"; print "% -----図の設定-----\n"; print "\\usepackage{graphicx}\n"; print "\\usepackage{float}\n"; print "\n"; print "% -----ルビ使用の設定-----\n"; print "\\usepackage{luatexja-ruby}\n"; print "\n"; print "% -----囲みの設定-----\n"; print "\\usepackage{boites}\n"; print "\n"; print "% -----ヘッダ・フッタの設定-----\n"; print "\\usepackage{fancyhdr}\n"; print "\\pagestyle{myheadings}\n"; print "\\renewcommand{\\headrulewidth}{0pt}\n"; print "\n"; print "% -----余白の設定-----\n"; print "\\usepackage[top=20mm,left=10mm,right=10mm]{geometry}\n"; print "\n"; print "% -----タイトル、筆者の設定-----\n"; print "\\title{\\vspace{3cm} \\Huge $tmp_title}\n"; print "\\author{\\Large $tmp_auth}\n"; print "\\date{\\hspace{\\fill}\\today}\n"; print "\n"; print "% -----本文-----\n"; print "\\begin{document}\n"; print "\n"; print "% -----タイトル表示-----\n"; print "\\maketitle\n"; print "\\thispagestyle{empty}\n"; print "\\newpage\n"; print "\n"; print "% -----目次-----\n"; print "\\tableofcontents\n"; print "\n"; print "\\newpage\n"; open(RDFILE, "< ./outputb.tex"); while(<RDFILE>){ print $_; } close(RDFILE); print "\n\n"; print "\\end{document}"; ' > outputc.tex sed -e 's/^<a href=/%<a href=/' outputc.tex > output.tex \rm -rf outputb.tex outputc.tex tmpfile

TeXの実行とpdfの作成

 inputディレクトリに小説のhtmlファイルを格納してスクリプトを実行すると、カレントディレクトリにoutput.texができているはずである。

TeXファイルが生成されていればコンパイルを実行する。

インストール時にTeXのpathを通してあれば、

lualatex output.tex

コンパイルが開始される。

エラーがあればtexファイルを修正しよう。

エラーなくコンパイルが完了するとoutput.pdfという縦書きpdfが生成されているはず。

open output.pdf

とやってプレビューで生成物を確認する。

なお、小説によってはtexファイルの修正を行う必要がある。

・図がある場合

小説の中で図がある場合は削除するかエディタでTexの図挿入の記述を追加する。

図の準備

必要な図はブラウザを開いて持ってくる。jpegファイルなら、convertコマンドを使用して

convert -rotate 270  図ファイル.jpg 図ファイル.eps

のようにして縦書き用に横倒ししたepsファイルを作成しておく。

convertコマンドをインストールしていないときは

コマンドラインから画像ファイルを操作する - k-igrsの日記

を参照してインストールする。

TeXの図挿入コマンドは

 \begin{figure}[H]
\includegraphics[keepaspectratio, scale=1]{図ファイル.eps}
\end{figure}

とすると、コマンド挿入位置に図が挿入される。scaleの値は生成されたpdfを見て調整する。

・VS等の縦書きにする文字の処理

巨人 VS 阪神みたいにVSが横倒しになるのを避けたい場合、

\rensuji{VS}

のように置換する。スクリプトで一律置換すると、英単語中のものまで置換されてしまうので手修正を行う。

・漢字の置き換え

TeXコンパイルログ texfile.logを見てみる。

Missing character: There is no 漢字

のワーニングが出ていたら、対応する漢字が存在しないので常用漢字に置き換える。

 

TeX実行の注意

TeXコンパイル時に中間ファイルを作成する。こいつが悪さをすることがあるのでエラーがおきたら削除しよう。

目次を生成するには3回コンパイルを実行する必要がある。一回のみの結果をみて慌てないように。

 

好みの変更

出力形式を変更してみる。

例えば、\begin{document}の前に

% -----2段組の幅と線の指定------
\setlength{\columnsep}{6mm}
\columnseprule = 0.1mm

として、目次を生成して改ページしたのち、先頭に

\twocolumn

とすれば、2段組みになる。

※線が必要ない場合は\columnsepruleを記述しない。

出力例は以下の通り。

江戸川乱歩:心理試験から

f:id:k_igrs:20190313020326j:plain