kmuto’s blog

はてな社でMackerel CREをやっています。料理と旅行といろんなIT技術

技術書典15に向けて『Hatena Tech Book Vol.2』を作っていた(その4)

その3からの続き。

kmuto.hatenablog.com

休日なので、さくっとビルド環境のほうを紹介するに留めよう。

原稿についてはMarkdownRe:VIEWがベストだけれども、早期であればScrapboxでもはてな記法でもWordでもGoogle Docsでも、任意の方法で受け付けるとしていた。とはいえ、声かけ相手の中心がエンジニアではあったので、自然にGitHubにまとめていくことになった(本当は総務や法務、営業などの方々からも幅広く集めたかったんだけど、outputのメリットがあまりないかもしれない)。

エンジニアははてなGitHubにプライベートリポジトリを作成できるので、技術書典15のリポジトリを建立。作業フォルダ一式、サンプルRe:VIEWファイルとMarkdownファイル、手元ビルド用のdocker-compose.yml、ビルド手順のREADMEをpushしておいたところ、id:koudenpa さんがGitHub ActionsでCI化してくれた。サイコウ!

ところで、はてなのプライベートリポジトリになったということは、認証上、私物のDebianデスクトップ環境からはアクセスできなくなったということでもある。TeXトライアンドエラーにはDebianデスクトップのほうが都合がよかったのだが、こればかりは仕方がないので業務環境のmacOSでも制作が全部完結できるようにツールを積み上げていく。

といっても紙面デザイン調整のほうはDebian上でだいたい済ませ、ビルド環境一式もDockerイメージとして実装し終えていたわけなので、あまり困ることはなかった。

hub.docker.com

ビルドPDFの確認については、Acrobatで半透明化部分などの再現正確性のための表示検証自体は必須。しかしビューアとしてはファイルを裏で更新しても反映されないのがたいへんにストレス。Linuxでは普通にEvinceを使って自動更新させているので、macOSでもHomebrewからEvinceを入れている。AutoRaiseとの相性がイマイチなのが玉に瑕だが、まぁ許容範囲。

あとはPDF差分表示がほしいんだよな。Debianのdiffpdfが最高ラヴなんだけどHomebrewにはない。Acrobatのはダルすぎる。p-typoさんがConfrontaPDFの日本語対応をされていたけど、その後どうなったんだっけか。

TeXいじりコーナー

Re:VIEWでは記事単位で章扱いとしているが、『Software Design』などの雑誌風に章見出しエリアの下地に背景を入れるようにしてみた。前職で『技術季報』の制作をしたときに実装していて、今回もほぼ同じ形で作っている。

まず、紙面+上下左右3mmずつの塗り足しがある背景PDFを用意する。私はIllustratorで作った。オフセット印刷の場合は塗り足し部にまで配置をすることで、フチなしの綺麗な表現ができる。それ以外の印刷の場合は塗り足しができるかどうかは印刷設備によるが、トンボ付きで入稿せよという条件が付いていればだいたい大丈夫だと思う。

今回の場合は章が左右どちらのページからも始まることを許容し、小口・ノドは同じ値にしているので、1つの背景PDFのみで済ませた。異なる値の場合は左右それぞれ用のを用意することになるだろう。

章ページの背景

imagesフォルダにPDFを格納しておく。

次に、ページに配置するマクロを作る。ここは自分のTeX力が足りなすぎて、トンボありサイズの紙版と仕上がりサイズの電子版とでうまく共通化することができず、悲惨めなものになってしまった。A5だと違うかも。\includefullpagegraphicsの「中央に合わせる」挙動を本当はやりたかった(ので、次回あればこれはちゃんとやるか……)。

\def\hatena@headspace{\dimexpr\topmargin+1in+\headheight+\headsep}
\newlength{\hatena@offsetxodd}
\newlength{\hatena@offsetxeven}
\newlength{\hatena@offsety}

\setlength{\hatena@offsetxodd}{\if@pdftombo-24.5mm\else0.5mm\fi}
\setlength{\hatena@offsetxeven}{\if@pdftombo-25mm\else1.2mm\fi}
\setlength{\hatena@offsety}{\if@pdftombo-10mm\else-10mm\fi}

% 全ページ貼り込み(塗り足し込み)で配置する見出し画像。#1には画像ファイル名
\def\hatena@headimage#1{
  \vbox to \textheight{
    \vskip-\dimexpr\hatena@headspace + \hatena@offsety\relax%
    \vbox to \paperheight{\vss
      \hbox to \textwidth{%
        \ifodd\c@page
          \hskip-\dimexpr\oddsidemargin + 1in + \hatena@offsetxodd\relax%
        \else
          \hskip-\dimexpr\evensidemargin + 1in + \hatena@offsetxeven\relax%
        \fi
        \hbox to \paperwidth{\hss
          \includegraphics{images/#1}%
        \hss}%
      \hss}%
    \vss}%
  \vss}%
}

このマクロを使う新しいページスタイルを用意する。左右で違うものを使いたいときには、ここでそれぞれ指定すればよい。

%% 章見出しのページスタイル
\NewPageStyle{hatenachapter}{
  odd_head_format={\hatena@headimage{chapter-background.pdf}},% 章見出し背景画像貼り付け(右)
  even_head_format={\hatena@headimage{chapter-background.pdf}},% 章見出し背景画像貼り付け(左)
  ...(ノンブルや柱などの設定)...
}

あとはページスタイルをどこで呼び出すかだが、今回は雑に以下のように呼び出した(fontを目的外使用するのがいかにも雑)。

\RenewBlockHeading{chapter}{0}{
  font={\thispagestyle{hatenachapter}\sffamily\gtfamily\bfseries\fontsize{21Q}{24H}\selectfont},
  ...(ほかいろいろな設定)...
}

今回は見出しについてのみの背景としたが、このテクニック自体は普通のページのほうでもできるので、版面周囲に凝ったデザインをInDesign並みに配置するというのも可能ではある。ただし、状況によって細かく制御したいときには、別途用意しておいてpdftkでPDFスタンプ合成するなどしたほうが簡単に済むこともある。

2023/11/6追加

おぉぉ。次回あればRenewBlockHeadingにpagestyleオプション使う!