adbird(広告鳥) 備忘録

カクヨムの小説をA5・2段組・縦書きのPDFデータにする

カクヨムのUIが変更になり、目次ページから各話のリンクが取得できなくなってしまっているため、2023年12月現在、下記スクリプトは使用できません。


下記の通り、環境はUbuntuLinux)です。

環境

ディレクトリ構成

カクヨム
  ├── download.sh
  ├── A5_Kakuyomu_tex.sh
  └── 小説タイトル (このディレクトリ名がpdfファイル名になる)
       ├── 000001.html
       └── 000002.html
           ︙

スクリプト作成

ダウンロード用スクリプト(download.sh)

以下の内容を download.sh として保存。

#!/bin/sh

#目次ページダウンロード

wget -O 目次.html $1

#各話URL取得、ダウンロードスクリプトwget.sh生成。 
#wgetの直前に「sleep 10」で10秒待ちを入れている。任意で変更を。wgetは-ncオプションで同じファイル名のものは上書きしない。

sed -e "s/^[ \t]*//" -e "/DOCTYPE html/,/widget-toc-main/d" -e "/id\=\"reviews\"/,/<\/html>/d" 目次.html | grep -e "<a href" | sed -e "s/<a href=\"//g" -e "s/\" class=\"widget-toc-episode-episodeTitle\">//g" -e "s/\/works/https\:\/\/kakuyomu.jp\/works/g" | nl -n rz | sed -e "s/^/sleep 10\nwget -nc -O /g" -e "s/\thttp/.html http/g" | sed -e "1d" > wget.sh

# wget.sh実行
sh wget.sh

PDF変換スクリプト(A5_Kakuyomu_tex.sh)

以下の内容を A5_Kakuyomu_tex.shとして保存。

#!/bin/bash

if [ -e ./tmpfile ]; then
    \rm -r tmpfile
fi

mkdir -p tmpfile
if [ -e ./output-a.tex ]; then
    \rm -r output-a.tex
fi

onetimeflag=0

for fh in *.html
do
#タイトルと作者名を抽出
if [ $onetimeflag -eq 0 ]; then
    grep '<h1 class' $fh | sed -e "s/^[ \t]*//" -e "s/<li .*\">//g"  -e "s/<\/span>/\n/g" | sed -e "/<\/h1>/d" > ./tmpfile/tmp_title
    grep 'contentMain-header-author' $fh | sed -e "s/^[ \t]*//" -e "s/<p .*\">//g" -e "s/<\/p>//g" > ./tmpfile/tmp_auth
    echo "" > ./tmpfile/tmp_section
    onetimeflag=1
fi

done

#テキストの見出し部分をtex記法に。「<p id=p」「\section」「\subsection」の行だけ抽出。
sed -e "s/^[ \t]*//" -e '/chapterTitle level1/s/<\/span><\/p>/}/g' -e '/chapterTitle level1/s/<p .*\"><span>/\\section{/g' -e '/chapterTitle level2/s/<\/span><\/p>/}/g' -e '/chapterTitle level2/s/<p .*\"><span>/\\section{/g' -e '/widget-episodeTitle/s/<\/p>/}/g' -e '/widget-episodeTitle/s/<p .*\">/\\subsection{/g' -e "s/<p id=\"p1\"/\n<p id=\"p1\"/g" *.html | grep -e "<p id=\"p" -e "\\\section" -e "\\\subsection"  > output-a.tex
#傍点、ルビ(pxrubricaパッケージ対応)
sed -i -e 's/<em class=\"emphasisDots\">/\\kenten\[s\]{/g' -e 's/<\/span><\/em>/\}/g' -e 's/<span>//g' -e 's/<ruby><rb>/\\ruby\[g\]{/g' -e 's/<\/rb><rp>(<\/rp><rt>/}{/g' -e 's/<\/rt><rp>)<\/rp><\/ruby>/}/g' -e 's/<\/span>//g' -e 's/<\/a>//g' output-a.tex
#「<p id=p」の行からテキストだけを抽出。空行1つ分は削除、空行2つ分は空行1つに
perl -e 'while(<>){s/^<p id="p[0-9]+">(.*)<\/p>$/$1\n/;print $_;}' output-a.tex | sed -e '/class=\"blank\"><br \/><\/p>$/d' -e "s/^ *//" | perl -e 'while(<>){s/^<p id="p[0-9]+" class="blank">(.*)<\/p>$/\\vskip\\baselineskip/;print $_;}' > outputb.tex

#アポストロフィー変換、半角数字を全角数字など諸々置換
sed -i -e "s/\&#39;/\'/g" -e 'y/1234567890/1234567890/' -e 's/“/〝/g' -e 's/”/〟/g' -e 's/\&quot\;/"/g' -e "s/&lt;/</g" -e "s/&gt;/>/g" -e "s/\#/#/g" -e 's/\$/$/g' -e 's/%/%/g' -e "s/&/&/g" -e 's/\~/〜/g'  -e 's/?/?/g' -e 's/!/!/g' outputb.tex
#タイトルも諸々置換
sed -i -e "s/\&#39;/\'/g" -e 'y/1234567890/1234567890/' -e 's/“/〝/g' -e 's/”/〟/g' -e 's/\&quot\;/"/g' -e "s/&lt;/</g" -e "s/&gt;/>/g" -e "s/\#/#/g" -e 's/\$/$/g' -e 's/%/%/g' -e "s/&/&/g" -e 's/\~/〜/g'  -e 's/?/?/g' -e 's/!/!/g' ./tmpfile/tmp_title
#作者名も諸々置換
sed -i -e "s/\&#39;/\'/g" -e 'y/1234567890/1234567890/' -e 's/“/〝/g' -e 's/”/〟/g' -e 's/\&quot\;/"/g' -e "s/&lt;/</g" -e "s/&gt;/>/g" -e "s/\#/#/g" -e 's/\$/$/g' -e 's/%/%/g' -e "s/&/&/g" -e 's/\~/〜/g'  -e 's/?/?/g' -e 's/!/!/g' ./tmpfile/tmp_auth
# http://〜を含む行
sed -i -e 's/<a href.*\">//g' -e '/http/s/^/\\begin{verbatim}/g' -e '/http/s/$/\\end{verbatim}/g' -e '/http/y/1234567890/1234567890/' outputb.tex
# 括弧(「)の行の字下げ(半文字だけ字下げ)
sed -i -e 's/^「/\\noindent\\hspace{0.5em}「/g' outputb.tex


#LaTex
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[a5paper,twocolumn,twoside,openleft]{ltjtbook}\n";
    print "\n";
    print "%ページ余白等\n";
    print "\\usepackage[top=17mm,bottom=17mm,left=17mm,width=111mm,right=20mm,headsep=5mm,footskip=9mm]{geometry}\n";
    print "\n";
    print "%行間\n";
    print "\\renewcommand{\\baselinestretch}{1}\n"; 
    print "\n";
    print "%段と段の間隔を10mm\n";
    print "\\setlength{\\columnsep}{10mm}\n";
    print "\n";
    print "% -----章番号を無しにする-----\n";
    print "\\setcounter{secnumdepth}{0}\n";
    print "\n";
    print "%目次をハイパーリンク付きにする\n";
    print "\\usepackage[luatex,pdfencoding=auto,hidelinks]{hyperref}\n";
    print "\n";
    print "%フォント指定のためのパッケージ\n";
    print "\\usepackage{luatexja-fontspec}\n";
    print "%欧文・数字フォント(フォントによっては文字が欠落する場合があるので注意)\n";
    print "\\setmainfont{GenEiChikugoMin2-R}\n";
    print "\\setsansfont{IPAexGothic}\n";
    print "%ここで日本語フォント指定 (フォントによっては文字が欠落する場合があるので注意)\n";
    print "\\setmainjfont{GenEiChikugoMin2-R}\n";
    print "\\setsansjfont{IPAexGothic}\n";
    print "\n";
    print "%見出しのフォントサイズ(smallやfootnotesizeに)等\n";
    print "\\makeatletter\\renewcommand{\\section}{\\\@startsection{section}{2}{\\z\@}{1.5\\Cvs \\\@plus.5\\Cvs \\\@minus.2\\Cvs}{.5\\Cvs \\\@plus.3\\Cvs}{\\gtfamily\\small\\mdseries}}\\makeatother\n";
    print "\\makeatletter\\renewcommand{\\subsection}{\\\@startsection{subsection}{3}{\\z\@}{1.5\\Cvs \\\@plus.5\\Cvs \\\@minus.2\\Cvs}{.5\\Cvs \\\@plus.3\\Cvs}{\\gtfamily\\small\\mdseries}}\\makeatother\n";
    print "\\makeatletter\\renewcommand{\\subsubsection}{\\\@startsection{subsubsection}{3}{\\z\@}{1.5\\Cvs \\\@plus.5\\Cvs \\\@minus.2\\Cvs}{.5\\Cvs \\\@plus.3\\Cvs}{\\gtfamily\\footnotesize\\mdseries}}\\makeatother\n";
    print "\n";
    print "% -----図の設定-----\n";
    print "\\usepackage{graphicx}\n";
    print "\\usepackage{float}\n";
    print "\n";
    print "% -----ルビ使用の設定-----\n";
    print "%\\usepackage{luatexja-ruby}\n";
    print "\\usepackage{pxrubrica}\n";
    print "\n";
    print "% -----囲みの設定-----\n";
    print "\\usepackage{boites}\n";
    print "\n";
    print "% -----ヘッダ・フッタの設定 フォントサイズをfootnotesizeに-----\n";
    print "\\makeatletter\\def\\ps\@myheadings{\\let\\ps\@jpl\@in\\ps\@plain\\let\\\@oddfoot\\\@empty\\let\\\@evenfoot\\\@empty\\def\\\@evenhead{{\\leftmark}\\hfil\\footnotesize{\\thepage}}\\def\\\@oddhead{\\footnotesize{\\thepage}\\hfil\\rightmark}\\let\\\@mkboth\\\@gobbletwo\\let\\sectionmark\\\@gobble\\let\\subsectionmark\\\@gobble}\\makeatother\n";
    print "\\pagestyle{myheadings}\n";
    print "%------ヘッダの右にsubsubsectionmark=節 を表示。章を表示させたい場合は subsectionmark に----\n";
    print "%\\renewcommand{\\subsectionmark}[1]{\\markright{#1}}\n";
    print "\n";
    print "%-------------目次ページ再設定---------------\n";
    print "\\makeatletter\n";
    print "\\renewcommand{\\tableofcontents}{%\n";
    print "  \\if\@twocolumn\\\@restonecoltrue\\onecolumn\n";
    print "  \\else\\\@restonecolfalse\\fi\n";
    print "  \\chapter*{\\contentsname\n";
    print "    \\\@mkboth{\\contentsname}{\\contentsname}%\n";
    print "\\thispagestyle{myheadings}\n";
    print "  }\\\@starttoc{toc}%\n";
    print "  \\if\@restonecol\\twocolumn\\fi\n";
    print "}\n";
    print "\\makeatother\n";
    print "\n";
    print "% hyperref.styの関係で、目次ページ番号が寝てしまうので、正しく縦向きに。 参考:http://id.fnshr.info/2017/05/20/my-latex-templates-201705/\n";
    print "\\makeatletter\n";
    print "\\def\\contentsline#1#2#3#4{\\csname l\@#1\\endcsname{\\hyper\@linkstart{link}{#4}{#2}\\hyper\@linkend}{\\rensuji{#3}}}\n";
    print "\\makeatother\n";
    print "\n";
    print "%目次のリーダー(点線)を消す。節(section)以降のページ下余白調整\n";
    print "\\makeatletter\n";
    print "\\def\\\@dottedtocline#1#2#3#4#5{%\n";
    print "  \\vskip\\toclineskip \\\@plus.2\\p\@%\n";
    print "  {\\setlength{\\parfillskip}{2em} %節(section)以降の下余白\n";
    print "    \\parindent #2\\relax\\\@afterindenttrue\n";
    print "   \\interlinepenalty\\\@M\n";
    print "   \\leavevmode\n";
    print "   \\\@lnumwidth #3\\relax\n";
    print "   \\advance\\leftskip \\\@lnumwidth \\hbox{}\\hskip -\\leftskip\n";
    print "    {#4}\\nobreak\n";
    print " \\leaders\\hbox to 3pt{\\hfil\\raise3pt\\hbox{}\\hfil}% ここのhbox{}でリーダーを設定\n";
    print "     \\hfill \\nobreak\\hbox to\\\@pnumwidth{%\n";
    print "         \\hss\\reset\@font\\rmfamily\\small \\normalcolor #5}\\par}}\n";
    print "\\makeatother\n";
    print "\n";
    print "%--------タイトルページの再定義-----------\n";
    print "\\makeatletter\n";
    print "\\if\@titlepage\n";
    print "  \\renewcommand{\\maketitle}{\\begin{titlepage}%\n";
    print "  \\let\\footnotesize\\small\n";
    print "  \\let\\footnoterule\\relax\n";
    print "  \\let\\thanks\\p\@thanks\n";
    print "  \\let\\footnote\\thanks\n";
    print "  \\vbox to\\textheight\\bgroup\\tate\\hsize\\textwidth\n";
    print "  \\null\\vfil\n";
    print "  \\begin{center}%\n";
    print "%タイトルの下に作者名を表示する場合\n";
    print "  \\vskip 65\\p\@ %右余白\n";
    print "    {\\Large $tmp_title}\\hspace{4em}{\\large $tmp_auth \\par}% \n";
    print "%タイトルと作者を別々の行で表示する場合\n";
    print "%  \\vskip 95\\p\@ %右余白\n";
    print "%    {\\Large $tmp_title} %タイトル\n";
    print "%    \\vskip 3em \n";
    print "%    {\\begin{flushright}\\large $tmp_auth \\end{flushright} \\par} %作者 \n";
    print "%タイトルのみ表示\n";
    print "%  \\vskip 55\\p\@ %右余白\n";
    print "%    {\\Large $tmp_title}%\n";
    print "  \\end{center}\\par\n";
    print "  \\vfil{\\centering\\\@thanks}\\vfil\\null\n";
    print "  \\egroup\n";
    print "  \\end{titlepage}%\n";
    print "  }%\n";
    print "\\makeatother\n";
    print "\n";
    print "% -----本文-----\n";
    print "\\begin{document}\n";
    print "\n";
    print "% -----タイトル表示-----\n";
    print "\\maketitle\n";
    print "% -----目次-----\n";
    print "\\tableofcontents\n";
    print "\n";
    open(RDFILE, "< ./outputb.tex");
    while(<RDFILE>){ print $_; }
    close(RDFILE);
    print "\n\n";
    print "\\end{document}";
' > output.tex

#一時ファイル削除
\rm -rf outputb.tex output-a.tex tmpfile

#lualatex実行
lualatex output
lualatex output

#output.pdfファイルの名前をカレントディレクトリ名のファイルに変換。上位ディレクトリにPDFが生成がされるので、カレントディレクトリに戻す。
mv output.pdf $(pwd)-a5.pdf
mv $(pwd)-a5.pdf ./

スクリプト実行

ダウンロード

小説タイトルのフォルダ内で右クリックで端末を開いて、以下を実行。[url]は作品の目次ページのURL。

$ sh ../download.sh [url]

実行すると、小説タイトルのフォルダ内に000001.html、000002.html、…とhtmlファイルとしてダウンロードされていく。

PDF変換

$ bash ../A5_Kakuyomu_tex.sh

web小説をAozoraEpub3でepub化

環境はいつものようにLinuxUbuntu)。

OpenJDKをインストールする

$ sudo apt install default-jdk

AozoraEpub3をダウンロード

AozoraEpub3をダウンロードして、zipファイルを展開。

AozoraEpub3を起動、epub変換

zipを展開してできたファルダ内に入って、AozoraEpub3を起動。

$ java -jar AozoraEpub3.jar

あとは使い方を調べながら変換。

小説家になろうなどのweb小説では、詳細設定の空行除去で、「5行減らす 最大1行」にすると改行が減って良さげ。

完成したepubスマホの方へ移動させる。

スマホ(アンドロイド)側の設定

日本語、縦書きのEpubを表示させるためのEpibビューアとしては、次のようなものがある。

僕オススメの源暎ちくご明朝で表示させる方法。

スマホ(アンドロイド)内にfontフォルダを作り、その中に源暎ちくご明朝 GenEiChikugoMin2-R.ttf を入れておく。

読書尚友

  • 設定 > フォント名 を「(カスタムフォント)」 
  • 設定 > カスタムフォントの選択 を前述のGenEiChikugoMin2-R.ttfに指定

ただし、読書尚友だと、ページの高さ丁度に文が終わってしまうと、改行分が次の行に送り出されてしまうのか、次の行に空行が入ってしまうのが惜しい。

Perfect Viewerでもフォントを指定できる。

ただし、Perfect Viewerだと同じように変換したはずのEpubデータなのに、データによって行間の広さが違って見えることがあるのが惜しい。※追記:どうやらルビが一つでもついているファイルと、一つもルビがついていないファイルとで行間が違って見えるようだ。

EpubかPDFか

以上のように、表示のされ方がビューアに左右されるので、前回投稿した スマホの画面に適した「小説家になろう」縦書きPDF作成 - adbird(広告鳥) 備忘録 で作ったPDFで読むのが一番安定してる。

ただし、フォント埋め込みしたPDFはデータ容量が大きいって欠点はある。

どれも一長一短である…。

スマホの画面に適した「小説家になろう」縦書きPDF作成

スマホ小説家になろうを読むのには、すでに

の方法があるのだけれど、これらはページを移動するたびにブックマークレットを起動したりしないといけない。

数話程度を読む分にはブックマークレット起動は大して苦ではないけど、多くの話を一気読みしたいときには面倒くさい。

公式でも縦書きPDFにする機能はあるけど、そのPDFはパソコンでの表示を前提にしているので、スマホでの表示には適していない。

そこでスマホの画面に適した縦書きPDFにする方法。

※2020年11月7日更新。

目次

環境

  • Ubuntu18.04
  • TeXLive

Windowsではちょっと無理かも。頑張って環境そろえれば、できるかもしれないけど。

ディレクトリ構成

小説家になろう
   ├── Narou_tex.sh
   └── 小説タイトル (このディレクトリ名がpdfファイル名になる)
        ├── 001.html
        └── 002.html
             ︙

スクリプト作成

k-igrsさんという方が作ったスクリプトを拝借、少々カスタム。

Narou_tex.sh という名前で「小説家になろうディレクトリに保存。なお、「小説タイトル」ディレクトリに入れておくと、後述する連番にするコマンドでhtmlに変換されてしまうので注意。

スマホの画面の大きさに応じて、「原稿ページ設定(スマホ用)」の箇所などの調整が必要。

LaTeXの版面については、版面のパラメータにはどのようなものがありますか? - TeX・LaTeXについての覚え書きをご参考に。

フォントは僕のオススメの源暎ちくご明朝(GenEiChikugoMin2-R)とIPAexゴシックを使用する設定になっているので、源暎ちくご明朝とIPAexゴシックをPCにインストールするか(LaTeXで使えるようにするにはフォントを/home/〜/.fontsフォルダ内に入れる)、変えたい場合は「欧文・数字フォント」「ここで日本語フォント指定」の箇所を変更する。

#!/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 *.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";
    }
}' $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;
    print $_ }
}' $fh > ./tmpfile/tmpf1
# ↓改行をオリジナルの見た目のままにするには、1番目を s/^<p id="L[0-9]+"> *<br \/><\/p>/\\vskip\\baselineskip/; にする。ルビpxrubricaパッケージ対応
perl -e '
while(<>){
    s/^<p id="L[0-9]+"> *<br \/><\/p>/【k改行k】/;
    s/<ruby><rb>(.*?)<\/rb><rp>(<\/rp><rt>(.*?)<\/rt><rp>)<\/rp><\/ruby>/\\ruby[g]{$1}{$2}/g;
    s/<ruby><rb>(.*?)<\/rb><rp>《<\/rp><rt>(.*?)<\/rt><rp>》<\/rp><\/ruby>/\\ruby[g]{$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
#改行調整。改行が2つ連続の時は、改行1つ分に。改行1つ分は改行削除。
sed -i -z -e 's/【k改行k】\n【k改行k】/\\vskip\\baselineskip/g' outputb.tex
sed -i -e 's/【k改行k】//g' outputb.tex

#半角数字を全角数字に置換
sed -i -e 'y/1234567890/1234567890/' outputb.tex
#アポストロフィー変換、半角数字を全角数字など諸々置換
sed -i -e "s/\&#39;/\'/g" -e 'y/1234567890/1234567890/' -e 's/“/〝/g' -e 's/”/〟/g' -e 's/\&quot\;/"/g' -e "s/&lt;/</g" -e "s/&gt;/>/g" -e "s/\#/#/g" -e 's/\$/$/g' -e 's/%/%/g' -e "s/&/&/g" -e 's/\~/〜/g'  -e 's/?/?/g' -e 's/!/!/g' outputb.tex
#タイトルも諸々置換
sed -i -e "s/\&#39;/\'/g" -e 'y/1234567890/1234567890/' -e 's/“/〝/g' -e 's/”/〟/g' -e 's/\&quot\;/"/g' -e "s/&lt;/</g" -e "s/&gt;/>/g" -e "s/\#/#/g" -e 's/\$/$/g' -e 's/%/%/g' -e "s/&/&/g" -e 's/\~/〜/g'  -e 's/?/?/g' -e 's/!/!/g' ./tmpfile/tmp_title
#作者名も諸々置換
sed -i -e "s/\&#39;/\'/g" -e 'y/1234567890/1234567890/' -e 's/“/〝/g' -e 's/”/〟/g' -e 's/\&quot\;/"/g' -e "s/&lt;/</g" -e "s/&gt;/>/g" -e "s/\#/#/g" -e 's/\$/$/g' -e 's/%/%/g' -e "s/&/&/g" -e 's/\~/〜/g'  -e 's/?/?/g' -e 's/!/!/g' ./tmpfile/tmp_auth
# 括弧(「)の行の字下げ(半文字だけ字下げ)
sed -i -e 's/^「/\\noindent\\hspace{0.5em}「/g' outputb.tex
#リンクを非表示に
sed -i -e 's/^<a href=/%<a href=/g' outputb.tex

#背景色画像を上位フォルダからコピー
#cp ../background.png ./

#LaTex
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 "\\setcounter{secnumdepth}{0}\n";
    print "\n";
    print "%目次をハイパーリンク付きにする\n";
    print "\\usepackage[luatex,pdfencoding=auto,hidelinks]{hyperref}\n";
    print "\n";
    print "%フォント指定のためのパッケージ\n";
    print "\\usepackage{luatexja-fontspec}\n";
    print "%欧文・数字フォント(フォントによっては文字が欠落する場合があるので注意)\n";
    print "\\setmainfont{GenEiChikugoMin2-R}\n";
    print "\\setsansfont{IPAexGothic}\n";
    print "%ここで日本語フォント指定 (フォントによっては文字が欠落する場合があるので注意)\n";
    print "\\setmainjfont{GenEiChikugoMin2-R}\n";
    print "\\setsansjfont{IPAexGothic}\n";
    print "\n";
    print "%見出しのフォントサイズ(smallやfootnotesizeに)等\n";
    print "\\makeatletter\\renewcommand{\\section}{\\\@startsection{section}{2}{\\z\@}{1.5\\Cvs \\\@plus.5\\Cvs \\\@minus.2\\Cvs}{.5\\Cvs \\\@plus.3\\Cvs}{\\gtfamily\\small\\mdseries}}\\makeatother\n";
    print "\\makeatletter\\renewcommand{\\subsection}{\\\@startsection{subsection}{3}{\\z\@}{1.5\\Cvs \\\@plus.5\\Cvs \\\@minus.2\\Cvs}{.5\\Cvs \\\@plus.3\\Cvs}{\\gtfamily\\footnotesize\\mdseries}}\\makeatother\n";
    print "\\makeatletter\\renewcommand{\\subsubsection}{\\\@startsection{subsubsection}{3}{\\z\@}{1.5\\Cvs \\\@plus.5\\Cvs \\\@minus.2\\Cvs}{.5\\Cvs \\\@plus.3\\Cvs}{\\gtfamily\\footnotesize\\mdseries}}\\makeatother\n";
    print "\n";
    print "% -----図の設定-----\n";
    print "\\usepackage{graphicx}\n";
    print "\\usepackage{float}\n";
    print "\n";
    print "% -----ルビ使用の設定-----\n";
    print "%\\usepackage{luatexja-ruby}\n";
    print "\\usepackage{pxrubrica}\n";
    print "\n";
    print "% -----囲みの設定-----\n";
    print "\\usepackage{boites}\n";
    print "\n";
    print "% -----ヘッダ・フッタの設定 フォントサイズをtinyに-----\n";
    print "\\makeatletter\\def\\ps\@myheadings{\\let\\ps\@jpl\@in\\ps\@plain\\let\\\@oddfoot\\\@empty\\let\\\@evenfoot\\\@empty\\def\\\@evenhead{{\\leftmark}\\hfil\\tiny{\\thepage}}\\def\\\@oddhead{\\tiny{\\thepage}\\hfil\\rightmark}\\let\\\@mkboth\\\@gobbletwo\\let\\sectionmark\\\@gobble\\let\\subsectionmark\\\@gobble}\\makeatother\n";
    print "\\pagestyle{myheadings}\n";
    print "%------ヘッダの右に章=subsectionmark を表示----\n";
    print "\\renewcommand{\\subsectionmark}[1]{\\markright{#1}}\n";
    print "\n";
    print "\% -----原稿ページ設定(スマホ用)-----\n";
    print "\\paperwidth 62mm %ページの幅。スマホの画面を定規で測る。\n";
    print "\\paperheight 121mm %ページの高さ。スマホの画面を定規で測る。\n";
    print "\\setlength{\\topmargin}{-1in} %%topmarignを一度余白なしにする。いじらない。\n";
    print "\\addtolength{\\topmargin}{5mm} %%あらためて上余白を設定する。 \n";
    print "\\headheight 0mm\n";
    print "\\headsep 8mm %ヘッダーと本文の間\n";
    print "\\setlength{\\oddsidemargin}{-1in} %%奇数ページの左余白を一度余白なしにする。いじならい。\n";
    print "\\addtolength{\\oddsidemargin}{3.5mm} %%あらためて奇数ページの左余白を設定する。\n";
    print "\\setlength{\\evensidemargin}{-1in} %%偶数ページの左余白を一度余白なしにする。いじらない。\n";
    print "\\addtolength{\\evensidemargin}{3.5mm} %%あらためて偶数ページの左余白を設定する。\n";
    print "\\textwidth 100mm %縦書なので、これがテキストの「高さ」\n";
    print "\\textheight 55mm %縦書なので、これがテキストの「幅」(値:ページの幅ー左右の余白。フォントサイズとの兼ね合いもあるので、余白と本文テキストの幅を試行錯誤で調節する。)\n";
    print "\\footskip 0mm\n";
    print "\n";
    print "% hyperref.styの関係で、目次ページ番号が寝てしまうので、正しく縦向きに。 参考:http://id.fnshr.info/2017/05/20/my-latex-templates-201705/\n";
    print "\\makeatletter\n";
    print "\\def\\contentsline#1#2#3#4{\\csname l\@#1\\endcsname{\\hyper\@linkstart{link}{#4}{#2}\\hyper\@linkend}{\\rensuji{#3}}}\n";
    print "\\makeatother\n";
    print "\n";
    print "%目次のリーダー(点線)を消す。節(section)以降のページ下余白調整\n";
    print "\\makeatletter\n";
    print "\\def\\\@dottedtocline#1#2#3#4#5{%\n";
    print "  \\vskip\\toclineskip \\\@plus.2\\p\@%\n";
    print "  {\\setlength{\\parfillskip}{0em} %節(section)以降の下余白\n";
    print "    \\parindent #2\\relax\\\@afterindenttrue\n";
    print "   \\interlinepenalty\\\@M\n";
    print "   \\leavevmode\n";
    print "   \\\@lnumwidth #3\\relax\n";
    print "   \\advance\\leftskip \\\@lnumwidth \\hbox{}\\hskip -\\leftskip\n";
    print "    {#4}\\nobreak\n";
    print " \\leaders\\hbox to 3pt{\\hfil\\raise3pt\\hbox{}\\hfil}% ここのhbox{}でリーダーを設定\n";
    print "     \\hfill \\nobreak\\hbox to\\\@pnumwidth{%\n";
    print "         \\hss\\reset\@font\\rmfamily\\small \\normalcolor #5}\\par}}\n";
    print "\\makeatother\n";
    print "\n";
    print "% -----タイトル、筆者の設定-----\n";
    print "\\title{\\vspace{9.5mm} \\hspace{0cm} \\large $tmp_title}  %vspaceは右余白、hspaceは上余白調整\n";
    print "\\author{\\normalsize \\hspace{5cm} $tmp_auth}\n";
    print "\\date{\\hspace{\\fill}}\n";
    print "\n";
    print "%ページ背景 別途画像用意。ページサイズと合わせる。\n";
    print "%\\usepackage{wallpaper}\n";
    print "%\\TileWallPaper{62mm}{121mm}{background.png}\n";
    print "% -----本文-----\n";
    print "\n";
    print "\\begin{document}\n";
    print "\n";
    print "% -----タイトル表示-----\n";
    print "\\maketitle\n";
    print "\\thispagestyle{empty}\n";
    print "% -----目次-----\n";
    print "\\tableofcontents\n";
    print "\\newpage\n";
    print "\n";
    open(RDFILE, "< ./outputb.tex");
    while(<RDFILE>){ print $_; }
    close(RDFILE);
    print "\n\n";
    print "\\end{document}";
' > output.tex

#一時ファイル削除
\rm -rf outputb.tex tmpfile

小説をダウンロード

小説タイトルのディレクトリで端末を開いて、以下のようなコマンドで小説ページのhtmlをダウンロード。

$ wget -w 30 https://ncode.syosetu.com/n9636x/{1..20}/

薬屋のひとりごと(作者:日向夏)という小説を1話〜20話までダウンロード。

小説家になろうのサーバーに負担をかけて、アクセス制限を喰らわないように、30秒の間隔を入れている。のんびりダウンロードしよう。

htmlを連番にする

小説タイトルのディレクトリ内にダウンロードされたhtmlファイルは、index.html、index.html.1、index.html.2、…となっているので、これを001.html、002.html、003.html、…というように連番にする。

$ ls -v | awk '{ printf "mv %s %03d.html\n", $0, NR }' | sh

小説タイトルのディレクトリ内の全てのファイルが連番のhtmlに変換されてしまうので注意する。

スクリプト実行

$ bash ../Narou_tex.sh && lualatex output && lualatex output && mv output.pdf `pwd`.pdf

↑目次作成のために2回lualatexしている。

実行すると、小説タイトルのディレクトリの上位の、「小説家になろうディレクトリ内に「小説タイトル.pdf」ができているはず。

PDFをスマホに移動させて、閲覧。

縦書きPDFの閲覧には、今のところSideBooks -PDF・電子書籍・コミックViewer - Google Play のアプリがいい感じ。

f:id:adbird:20201031222554p:plain f:id:adbird:20201029221955p:plain

便利なリンク生成ブックマークレット

今、開いているホームページのタイトルとURL、範囲選択したテキストなどをクリップボードに保存して、リンクを生成してくれるブックマークレット

1. ページのタイトル+URL

ページのタイトルとURLをクリップボードに保存。Twitterの投稿などに便利。

javascript:!function(){var e=document.createElement("textarea"),t=document.title,c=document.URL;e.textContent=t+"\n"+c,document.querySelector("body").append(e),e.select(),document.execCommand("copy"),e.remove()}();

これを使うと、

テント紹介 ワイルドカントリーのヘルム2 - adbird(広告鳥) 備忘録
https://adbird.hatenablog.com/entry/2020/09/16/231730

こんな感じでリンクをクリップボードに保存してくれる。

2. 範囲選択したテキスト+ページのタイトル+URL

範囲選択したテキストを「」の中に入れて、そのページのタイトルとURLとともにクリップボードに保存。ニュース記事などを引用してTwitterに投稿するのに超便利。

javascript:!function(){var e=document.createElement("textarea"),t=document.title,c=document.URL;STR="";var SEL=window.getSelection();if(SEL!=""){STR=SEL.toString();}else{var form_focused_elm= document.activeElement;if( !!form_focused_elm.value ){STR = form_focused_elm.value.substring( form_focused_elm.selectionStart, form_focused_elm.selectionEnd );}}e.textContent="「"+STR+"」"+"\n"+t+"\n"+c,document.querySelector("body").append(e),e.select(),document.execCommand("copy"),e.remove()}();

ページ上でテキストを範囲選択した状態で、このブックマークレットをクリックすれば、

「先日のキャンプで新しいテント・ワイルドカントリーのヘルム2 (2019年購入時価格:税込24,840円)を初投入したので、その感想。」
テント紹介 ワイルドカントリーのヘルム2 - adbird(広告鳥) 備忘録
https://adbird.hatenablog.com/entry/2020/09/16/231730

こんな感じでクリップボードに保存される。

3. ページのタイトル+URL をマークダウン形式で

ページのタイトル+URL をマークダウン形式でクリップボードに保存。

javascript:!function(){var e=document.createElement("textarea"),t=document.title.replace(/\[/g,"\\[").replace(/]/g,"\\]").replace(/\|/g,"\\|"),c=document.URL.replace(/\(/g,"%2528").replace(/\)/g,"%2529");e.textContent="["+t+"]("+c+")",document.querySelector("body").append(e),e.select(),document.execCommand("copy"),e.remove()}();

このブックマークレットを使うと、

[テント紹介 ワイルドカントリーのヘルム2 - adbird(広告鳥) 備忘録](https://adbird.hatenablog.com/entry/2020/09/16/231730)

こんな感じでクリップボードに保存される。

4. 選択したテキストでhtml用リンク

javascript:!function(){var e=document.createElement("textarea"),t=document.title,c=document.URL;STR="";var SEL=window.getSelection();if(SEL!=""){STR=SEL.toString();}else{var form_focused_elm= document.activeElement;if( !!form_focused_elm.value ){STR = form_focused_elm.value.substring( form_focused_elm.selectionStart, form_focused_elm.selectionEnd );}}e.textContent="<a href=\""+c+"\">"+STR+"</a>",document.querySelector("body").append(e),e.select(),document.execCommand("copy"),e.remove()}();

このブックマークレットを使うと、

<a href="https://adbird.hatenablog.com/entry/2020/09/16/231730">先日のキャンプで新しいテント・ワイルドカントリーのヘルム2 (2019年購入時価格:税込24,840円)を初投入したので、その感想。</a>

こんな感じでクリップボードに保存される。

5.選択したテキストでコトバンク検索

https://kotobank.jp/gs/?q=のところを適宜変えるとコトバンク以外でもいけるはず。

javascript:(function(){x=document;y=window;if(x.selection){query=x.selection.createRange().text;}else if(y.getSelection){query=y.getSelection();}else if(x.getSelection){query=x.getSelection();};location.href='https://kotobank.jp/gs/?q='+encodeURIComponent(query)+'';})();

上記のは現在のタブで開いてしまうので、下記の新しいタブで開くのがいい。

javascript:(function(){x=document;y=window;if(x.selection){query=x.selection.createRange().text;}else if(y.getSelection){query=y.getSelection();}else if(x.getSelection){query=x.getSelection();};window.open('https://kotobank.jp/gs/?q='+encodeURIComponent(query)+'');})();

ブックマークレットの登録

適当なページ(このページでもいい)をブラウザにブックマークして、そのブックマークを編集。

  • ブックマーク名 : 自分で分かりやすいように任意で。「テキストリンク生成」「引用テキストリンク生成」「マークダウンリンク生成」とか。
  • ブックマークの保存先 : 保存先も任意で。すぐに使えるようにブラウザ上部のブックマークバーがオススメ。
  • ブックマークのアドレス(URL) : 上記のブックマークレットのいずれか1つをコピペして入れる。セキュリティの関係か、Vivaldiブラウザだとコピペではブックマークレットの冒頭の「javascript:」が消えてしまう仕様に変わったらしいので、コピペ後、手動で冒頭に「javascript:」を入力すること。

これでブックマークレットの登録完了。

同じ要領で残り2つのブックマークレットも登録する。

ブックマークレットを使う

リンクを作りたいページを開いて、上記で登録したブックマークレットをクリックするだけ。ポップアップなどは特に出てこないが、クリップボードにリンク等が保存されているので、好きな場所(Vivaldiブラウザのウェブパネルに登録したtwicliの投稿欄とか)に貼り付ける。

参照

↓この参照のリンクも3番目のブックマークレットを使って生成。

特定の文字列を含むファイルを複数ファイルの中から検索

フォルダ内に複数のファイルがあり、その中から特定の文字列を含むファイルだけを検索して表示するコマンド。

$ grep -rl キーワード

参照:[Linux][Mac]複数ファイルまとめて特定の文字列を検索するコマンド(2種類)|SATOPEDIA

GIMPで矢印、吹き出し

環境はUbuntu18.04、GIMP 2.8.22

矢印

以下、いずれか好きな方法で。

方法1:「テキスト」と「鉛筆で描写」などを組み合わせる

まず「テキスト」で「さんかく」と入力・変換して、好きな三角形の記号(▲・▼・◀・▶ など)を表示して、それを矢印の矢の部分のパーツとして使う。

三角形の記号の大きさや色は、フォントの大きさや色を変えることで可能。

矢印の棒の部分は「鉛筆で描写」や「ブラシで描写」、「パス」などで、矢印の矢のパーツである三角形の記号に付け加えて描いてやる。

矢印の回転などは普通のレイヤーと同様に、回転などをすればよい。

方法2:ブラシに追加

GIMPブラシダウンロード(矢印) | GIMP始めの一歩からダウンロード、解凍した中に入っているフォルダを /home/(ユーザー名)/.gimp-2.8/brushes に放り込む。

GIMPを再起動、ブラシで描写の中に入っているはず。

参照:【Arrow Brushes】GIMPで綺麗な「矢印」を描く方法を、画像つきで優しく解説【プラグイン】 | あずきのぶろぐ。

方法3:スクリプトを追加

このページ Arrow Script からarrow.zip をダウンロード。

zipを解凍して、arrow.scmを取り出し、/home/(ユーザー名)/.gimp-2.8/scriptsに放り込む。

GIMPを再起動、ツールの中にarrowが入っているはず。

使い方はGIMPできれいな矢印を描いてみようを参照のこと。

吹き出し

吹き出しGIMPブラシダウンロード(吹き出しブラシ) | GIMP始めの一歩からダウンロード、解凍してできたフォルダを /home/(ユーザー名)/.gimp-2.8/brushesに放り込む。

GIMPを再起動、ブラシで描写の中に入っているはず。

参照:【Arrow Brushes】GIMPで綺麗な「矢印」を描く方法を、画像つきで優しく解説【プラグイン】 | あずきのぶろぐ。

先日のキャンプで気がついたこと、覚書メモ

  • プチかまどC1の下に、耐熱のシートなりタイルなりを持っていかないと芝生が焦げる。
    • 今は100均で買ったステンレスのお盆を敷いているけど、それでも焦げる。
    • 芝が焦げるのは炭に火をつけるために、ステンレスのお盆の上で着火剤代わりの牛乳パックを燃やしているからかも?ちゃんと牛乳パックも網の上で燃やしたほうがいいかも。
  • バイク積載について
    • リュックはキツい。サイドバッグか別のバッグを考える。
    • バイクに乗った時に背中が当たるメインのバッグには、グランドシート代わりのレジャーシートを背中が当たる部分に入れておくと背中があまり痛くならない。
    • ファイヤーケトルfk1はメインのバックに入れるのではなく、ネットの間に挟んだほうがいいかも。
  • 必要ないペグやロープは持っていかない。もちろん、予備は必要だけど…。
  • テント(ワイルドカントリーのヘルム2)の収納袋が入れにくいので、ファスナー式のバッグを別途用意したほうがいいかも。
  • タープポールを買い足すか…。もしくは長目のタープポール1本で立てるかな。
  • フライパンでも食パンがトーストできるらしいので、次回やってみよう。キャンプで食パンといえば、ホットサンドメーカーというイメージしかなかったけど、ホットサンドメーカーは重いし荷物になるしで躊躇してたけど、今持っているフライパンでトーストできるならそれで十分。マーガリンを小瓶にでも入れて持っていこう。