DLsite用の横書きノベルをMarkdownでつくる
基本方針
原稿はMarkdownで書く
この際、LaTeXなど煩雑なエンジンは使わない
一部、中間処理用スクリプトをPythonでつくっている
こまかいつくりこみはまだだけど、大体できたので整理するsta.icon
ビルドはこんな感じ
ビルドするときに叩くラッパー
code:実行時はこう
$ build.bat
code:build.bat
@echo off
setlocal
set opt_css=--css stylesheet.css
set opt_toc=--toc --toc-depth=2
set opt_srcdst=-f markdown+emoji -t html5
set opt_template=--template=template.epub3
set genkou_raw=GENKOU.md
set genkou=normalized_GENKOU.md
set outname=MYBOOK.pdf
python normalizer.py %genkou_raw%
pandoc %opt_srcdst% %genkou% -o %outname% %opt_css% %opt_toc% %opt_template%
その他必要なファイルたち
PDF時のデザインを定義するCSS
見出しや引用など記法ごとのデザインは各自頑張る
生成AIに聞いてもいい
最低限必要なのは以下二つだと思う
text-alignは段落の概念をちゃんと反映するのに要ると思う
フォントはここで指定する、フォント名あたらないと適用されないのでよく調べること
code:stylesheet.css
/* 改行位置がほんの少しずれるのを回避する */
p {
text-align: justify;
}
/* フォントファミリとサイズを設定 */
body {
font-family: "源ノ角ゴシック VF", "Yu Gothic", sans-serif !important;
font-size: 14pt !important;
line-height: 1.6;
}
template.epub3
昔使ってた電子書籍用のを引用した
細かいことは覚えてない。。。sta.icon
原稿を整形するスクリプト
生成AIにつくってもらったやつsta.icon
code:生成AIに与えた指示の抜粋.md
### 変換ルール1: HTML でいう br を再現する
- Markdown はデフォルトでは <br> タグを扱わず、本文中で改行された行もレンダリングは改行無しで表示される。途中で改行を入れることはできず、空行を入れて区切らねばならない
- しかし小説を書く上では、これでは不便である。そこで明示的に <br> タグを入れることで対応したい
- 変換ロジック:
- <br> の挿入は段落に対してのみ適用する。また段落のうち、次行も段落が続く場合にのみ適用する
- したがって、次行に空行が続く場合や、そもそも段落ではない行の場合は適用しない
- 追加仕様1: テーブル記法の行にも適用しない。テーブル記法は | が使われていることが目印となる
### 変換ルール2: ページ送りの挿入
- ページ送りを挿入するには、以下の行を入れれば良い。
`
<div style="page-break-before:always"></div>
`
- しかし原稿ファイルには含まれず、整形済み原稿ファイルにて含める必要がある
- 挿入ロジック:
- 大見出しの上に挿入する
- またページ送りの行は、前後行を必ず空行ではさむ
code:normalizer.py
import sys
import os
def normalize(lines):
# ページ送り挿入(変換ルール2)
result = []
for line in lines:
# レベル1見出しの前にページ送りを挿入
if line.startswith("# "):
if result and result-1.strip() != "": result.append("\n")
result.append('<div style="page-break-before:always"></div>\n')
result.append("\n")
result.append(line)
# <br> 挿入(変換ルール1)
final = []
for i, line in enumerate(result):
stripped = line.rstrip("\n")
# 本文の段落行かつ次行も段落が続く場合にのみ <br> を追加
if stripped and '|' not in stripped and not stripped.startswith("#") and not stripped.startswith("<div"):
if i + 1 < len(result):
next_stripped = next_line.strip()
if next_stripped and '|' not in next_stripped and not next_stripped.startswith("#") and not next_stripped.startswith("<div"):
final.append(stripped + " <br>\n")
continue
final.append(line)
return final
def main():
if len(sys.argv) < 2:
print("Usage: python normalizer.py <input_md>")
sys.exit(1)
if not os.path.isfile(input_path):
print(f"Error: input file '{input_path}' not found.")
sys.exit(1)
with open(input_path, 'r', encoding='utf-8') as f:
lines = f.readlines()
normalized_lines = normalize(lines)
# 出力ファイル名は normalized_<入力ファイル名>
dirpath, filename = os.path.split(input_path)
output_filename = f"normalized_{filename}"
output_path = os.path.join(dirpath, output_filename)
with open(output_path, 'w', encoding='utf-8') as f:
f.writelines(normalized_lines)
print(f"Normalized file written to: {output_path}")
if __name__ == "__main__":
main()
デザイン方針
縦書き?横書き?
縦書き経験ないし、別に横書きでも読めると思うので横書きマンsta.icon
フォント
その他DLサイトのお作法
各種画像を用意する
紹介画像、560x420でJPEG
サムネイル画像、300x300でJPEG
紹介画像と同じか微調整した分でいいsta.icon
サンプル
人次第だが、PDFのスクショn枚くらいをつくればいいのではなかろうか
紹介やサムネ画像は実写はダメ
AI製でもダメ
特にR-18は厳しい、まず通らん
予告登録時に使う目次をつくる
Markdownから目次を自動生成するツールは以前つくったことがある → intoc code:例
$ "D:\download\intoc\intoc.exe" -input GENKOU.md -indent-depth 1 -parse-depth 1
まあ手作業でもたかが知れてるので手作業でいいけどsta.icon