本作りを手伝う_2(Python学習)

Pythonを使ってPython講座に使うファイルの自動作成に挑戦しています。今回は8回目(番外編その3)です。 前回の記事はコチラになります。

hirocom777.hatenadiary.org

前回はPythonを使って技術書典に出典する本を作るお手伝いをしたお話でした。複数のMarkDownテキストファイルをまとめて、ファイルの区切りで改ページのコードを入れるところまでをご紹介しました。

今日は前回の続きです。本を作るには、複数の原稿ファイルをまとめる以外にもやることがあります。

目次を入れる

ある程度まとまった内容の本になると、目次が欲しくなってきます。目次を作成するには前回も使ったMarkdown PDFというVScodeのアドインを使います。

marketplace.visualstudio.com

コチラの「Create Table of Contents」という機能を使うと「# 目次」と記述下部分に自動で目次を作成してくれます。目次を作るには、目次を作る位置を決めなければなりません。プログラムの前に原稿のテキストファイルのリストがあるので、このリストを使って目次を入れる位置を決めましょう。今回は最初の「0はじめに.md」と本文先頭の「1第1章_本を作ろう.md」の間に入れることにします。先頭のリスト、定数宣言部分はこうなりました。

# 目次を入れる
filenames = [
"0_はじめに.md",
"I",
"1_第1章_本を作ろう.md",
"2_第2章_原稿を書こう.md",
"3_第3章_装丁しよう.md",
"4_おわりに.md"]
new_page ='\n\n'\
    '<div style="page-break-before:always"></div>'\
    '\n\n'

目次を設定する部分には「I」をリストに挿入しました。次にプログラム本体部分です。

# 書込み用ファイルを開く
with open("new-file.md", "w", encoding='utf-8') as new_file:
    # 各ファイルを読み込んで書き込み先に書き込む
    for name in filenames:
        if name == "I":# 目次を入れる
            new_file.write('# 目次\n' + new_page)
            continue
        with open(name, encoding='utf-8') as f:
            for line in f:
                new_file.write(line)
            # 各ファイルの後に改ページ入れる
            new_file.write(new_page)

リストから取得した値が「I」だった場合はその部分に「# 目次」と改ページのコードを入れるようにしました。これで指定した部分に目次ができ上ります。

目次対象外を設定

さて目次なのですが、このままだと全部の章が目次に掲載されます。「0はじめに.md」と「4おわりに.md」は目次の対象から外したいです。目次自体も対象外です。目次対象外とな部分を指定できるようにしましょう。目次の対象外にするには、直前に以下のコードを記述します。

<!-- omit in toc -->

先頭のリスト、定数宣言部分はこうなりました。

filenames = [
"X",
"0_はじめに.md",
"X",
"I",
"1_第1章_本を作ろう.md",
"2_第2章_原稿を書こう.md",
"3_第3章_装丁しよう.md",
"X",
"4_おわりに.md"]
new_page ='\n\n'\
    '<div style="page-break-before:always"></div>'\
    '\n\n'
omit_index ='<!-- omit in toc -->\n'

リストから取得した値が「X」だった場合はその直後の部分を目次対象外に指定します。目次対象外指定のコードとしてomit_indexも定義しました。次にプログラム本体部分です。

# 書込み用ファイルを開く
with open("new-file.md", "w", encoding='utf-8') as new_file:
    for name in filenames:
        if name == "X":# 目次の対象外にする
            new_file.write(omit_index)
            continue
        if name == "I":# 目次を入れる
            new_file.write('# 目次\n' + new_page)
            continue
        # 各ファイルを読み込んで書込み用ファイルに書き込む
        with open(name, encoding='utf-8') as f:
            for line in f:
                new_file.write(line)
            # 各ファイルの後に改ページ入れる
            new_file.write(new_page)

リストから取得した値が「X」だった場合はその部分に目次対象外指定のコードを入れるようにしました。これで指定した部分が目次対象外となります。

簡単なプログラムでお仕事が楽に

いかがでしたでしょうか。PDF化の作業は単純な作業ですが何度も繰り返すことがあり、面倒でミスの原因にもなります。あと、こうやってプログラムを少しずつ改善、機能追加していくといい学びになりますね。最後まで読んでいただきありがとうございいました!!