Help us understand the problem. What is going on with this article?

「小説家になろう」バックアップファイルをTeX変換する

「小説家になろう」について

小説家になろうは、近年、ファンタジー系のWeb小説個人投稿サイトでは(たぶん)最大手のWebサイトです。
書いた小説は、作者自身ならバックアップ用ファイルをtext形式でダウンロードできます。
このファイルはプレーンテキストであり、htmlやjson等の構造化テキストではありません。

TeXにしてみよう

元々WebサイトをHTML化してもつまらないのでTeXファイルに変換することにしました。
出力はレイアウト最低限の措置のみとし、一般に印刷不要の内容は削っています。また、正規表現の置換なので、偶然にキーワードと一致する記述が作品中にあれば誤変換します。
なお、Perlは普段、ほとんど使わないのでshellに混ぜて使用という邪道です。(Perlやsedの熟練した人には効率の悪いスクリプトですが。)

とりあえずMacOS Catalina + ptex2pdfで変換できました。BSD sedはGNU sedを使えばもっと楽なコードになるかと思います。(「小説家になろう」ユーザーとしては、GNU sed版は呪文感があるなどと余計なことを思いますが。閑話休題。)
「小説家になろう」のTeX化にどれほど需要があるかわかりませんが、一つのテストケースとして。

bash+Perl版

#!/bin/bash
LANG=C
FILE=Desktop/result.tex
cat << 'EOF' > $FILE
\documentclass[uplatex,a4paper,12pt]{jsbook}
\usepackage[utf8]{inputenc}
\usepackage[driver=dvipdfm,truedimen]{geometry}
\geometry{left=25truemm,right=25truemm,top=25truemm,bottom=25truemm}
{\catcode`\^^M=\active
 \gdef\xobeylines{\catcode`\^^M\active \def^^M{\par\leavevmode}
 \setlength\parindent{0pt}
}
\global\def^^M{\par\leavevmode}}
EOF
perl -0pe 's/\n【免責事項】.*/\\end{document}/s' $1 |
perl -0pe 's/【本文】\n|----.*\n//mg' |
perl -0pe 's/【サブタイトル】\n(.*)\n/\\section{$1}/mg' |
perl -0pe 's/【第.章】\n(.*)\n/\\chapter{$1}/mg' |
perl -0pe 's/【タイトル】\n(.*)\n/\\title{$1}/m' |
perl -0pe 's/【作者名】\n(.*)\n/\\author{$1}/m' |
perl -0pe 's/【最終掲載日時】\n(.*)\n/\\date{$1}/m' |
perl -0pe 's/【.*?\\/\\/sg' |
perl -0pe 's/(\\chapter)+?/\\begin{document}\n\\maketitle\n\\xobeylines\n\\chapter/' >> $FILE

sed版(BSD sed)

sed版はヒアドキュメントの中でエスケープ(「`」「\\」など)が幾つかあるので留意。

#!/bin/bash
LANG=C
FILE=Desktop/result.tex
cat << EOF > $FILE
\documentclass[uplatex,a4paper,12pt]{jsbook}
\usepackage[utf8]{inputenc}
\usepackage[driver=dvipdfm,truedimen]{geometry}
\geometry{left=25truemm,right=25truemm,top=25truemm,bottom=25truemm}
{\catcode\`\^^M=\active
\gdef\xobeylines{\catcode\`\^^M\active \def^^M{\par\leavevmode}
\setlength\parindent{0pt}
}
\global\def^^M{\par\leavevmode}}
\title{`w='【タイトル】';grep -A 1 $w $1|grep -v $w`}
\author{`w='【作者名】';grep -A 1 $w $1|grep -v $w`}
\date{`w='【最終掲載日時】';grep -A 1 $w $1|grep -v $w`}
\begin{document}
\maketitle
\xobeylines
`sed -n '/----/,$p' $1|sed -n '/【免責事項】/q;p'|sed '$d'|sed -e ':a' -e 'N' -e '$!ba' -e 's/【サブタイトル】\n/\\\section{/g'|sed -e ':a' -e 'N' -e '$!ba' -e 's/【第.章】\n/\\\chapter{/g'|sed -e '/【本文】/d' -e '/----/d' -e 's/section{.*/&}/g' -e 's/chapter{.*/&}/g'|sed -e ':a' -e 'N' -e '$!ba' -e 's/}\n/}/g'`
\end{document}
EOF

なお、ptex2pdfをインストール済みの場合、いずれもシェルスクリプトの最後に下記を付け足せばPDF生成まで自動で進められます。

ptex2pdf -u -l -i -output-directory 'Desktop/' $FILE

参考ページ

TeXでつくる可能な限りWYSIWYGな文書
sedで改行を置換・削除する | 俺的備忘録 〜なんかいろいろ〜

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした