kmuto’s blog

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

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

その5からの続き。

kmuto.hatenablog.com

ゲンコウ ガ ソロワナイ……。」第1・第2の締切を過ぎ、いよいよ真の締切まであと数日という段階になっても完成しているのは5記事しかないという状況。あと2〜3記事は、なんとかなるかもだけどならないかもしれない……という。この段階だと30pくらいなので、このままではホチキス中綴じ程度になり、表紙の賑やか豪華さに比べると寂しすぎる。

編集・DTP自体はいくらでも高速化はできるんだけど、ほかの方の原稿を無から錬成することは不可能である(すでに自分のは書いていたし)。

皆さん忙しいことは重々承知の上で、はて困ったな……と途方に暮れていたら、id:onishi さんがチーフエンジニア陣に呼びかけて、いきなり記事が追加されることになった。すごい、かっこいい! id:onishi さん、 id:motemen さん、 id:cockscomb さんの記事はこうして生まれたのであった(短時間執筆なのにしっかり味わい深い記事なのがまたすごいよね……)。

飛び入りで id:rokoucha さんも楽しい記事を寄稿してくださり、当初から執筆を表明していた id:papix さんもすべり込みで間に合って、最終的に10人ちょうど。祭り感が十分あり、製本80p(本文76p)、オフセット無線綴じにする価値のある「ちゃんとした本」のサイズになった。本当に皆さんありがとう、そしてありがとう!

目次

(さてそろそろ連載がネタ切れになりつつあるぞ……。)

TeXいじり

目次についてはデフォルトの表現だとちょっと寂しいので、サイズを変えたり著者名を入れたりしてみた。

がんばれば情報をいったん保管しておいてうんぬんもできるんだろうけど、順序などすべてfixした後なので、わりと雑めな方法で対応(そんなんばかりだね?)。

jlreq.clsの\@dottedtoclineを上書きし、目次見出しボックスを定義する。

% 目次
\def\@dottedtocline#1#2#3#4#5{%
  \jlreq@set@top@contents{#1}%
  \ifnum #1>\c@tocdepth \else
    \vskip\toclineskip
    {\leftskip #2\relax \rightskip \@tocrmarg \parfillskip -\rightskip
    \parindent #2\relax\@afterindenttrue
    \interlinepenalty\@M
    \leavevmode
    \@lnumwidth #3 \relax
    \@tempcnta=#1\relax
    \advance\@tempcnta by -\jlreq@top@contents
    \@tempdima=1\jlreq@mol
    \multiply \@tempdima by \@tempcnta
    \advance\leftskip \@lnumwidth \hbox{}\hskip -\leftskip
    \sffamily\gtfamily% ゴチ
    \advance\leftskip\@tempdima
    {#4}\nobreak
    \leaders\hbox{$\m@th\mkern \@dotsep mu$\null\inhibitglue .\inhibitglue\null$\m@th\mkern \@dotsep mu$}%
    \hfill\nobreak
    %\hb@xt@\@pnumwidth{\hss #5}%
    #5% アキが不気味なのでシンプルに…
    \par\vspace{0.75\Cvs}}%
\fi}

\newcommand{\hatenatocbox}[2][]{%
  {\large #2}
  \ifthenelse{\equal{#1}{}}{
  }{
    \rmfamily\itshape\hspace{2\jlreq@zw}{—\,#1}
  }
  \\ \mbox{}
}

ビルドの最後のフェーズでtocファイルを書き換えて著者名を挿入するスクリプト

#!/usr/bin/env ruby
maps = {
  '序文' => 'onishi',
  'Perlの未定義動作110連発' => 'papix',
   ...
  'ドキュメントを伝えやすくするための技術(校正編)' => 'kmuto',
  '寄稿者のつぶやき' => ''
}

require 'fileutils'

File.open(File.join(ARGV[0], "__REVIEW_BOOK__.toc")) do |fi|
  File.open(File.join(ARGV[0], "__REVIEW_BOOK__.toc_mod"), 'w') do |fo|
    fi.each_line do |l|
      fo.print (
        l.sub(/\\contentsline \{chapter\}\{(.+?)\}\{/) do
          title = $1
          author = maps[$1]
          if author
            %Q(\\contentsline {chapter}{\\hatenatocbox[#{author}]{#{title}}}{)
          else
            $&
          end
        end
      )
    end
  end
end

FileUtils.mv File.join(ARGV[0], "__REVIEW_BOOK__.toc_mod"), File.join(ARGV[0], "__REVIEW_BOOK__.toc")
system('uplatex -interaction=nonstopmode -file-line-error -halt-on-error __REVIEW_BOOK__.tex')

これをconfig.ymlで呼び出すようにする。

pdfmaker:
  ...
  hook_aftertexcompile: ./tex_after.rb