いものやま。

雑多な知識の寄せ集め

技術書典7にサークル参加してきた。(準備編)

f:id:yamaimo0625:20190621155528j:plain

9/22(日)に開かれた技術書典7にサークル「いもあらい。」で参加してきたので、その振り返りを。
まずは当日までの準備に関して。

同人誌制作自体の振り返りは他記事を参照。

あと、各タスクはGithubプロジェクトボードを使って管理した:

やったこと一覧

入稿が一段落した後にやったことをリストアップすると、以下の通り:

  • 出店準備
    • 物品購入
    • 値札、見本表示、名札の作成
    • お釣りの準備
    • ディスプレイ確認
  • 宣伝
    • 16:9の告知画像の作成
    • 告知ページの作成
    • 宣伝ツイート
  • 委託の検討
  • DLカードの作成

物品購入

いろいろな記事などを参考に、以下のようなものを買った:
(買わなかったもの/買わなくてよかったものもあとで紹介)

敷き布 & 滑り止め

f:id:yamaimo0625:20190925121506p:plain

布はユザワヤ、滑り止めは100均で購入。
綿素材で触り心地はフワフワ、よく伸びる。
(なお麻素材は触り心地がサワサワしててしっかりしてるイメージ)

幅が90cmとなってたので120cm買って90cm x 120cmとしたけど、実際に家で測ったら幅が90cmよりちょっと短かった・・・

なお、机の幅は90cmのことが多い。
そして机の前に60cmくらい垂らし、机の奥行きが45cm、机の手前に15cm垂らすと、60 + 45 +15 = 120cmとなる。

ポスタースタンド

f:id:yamaimo0625:20190925121536p:plain

入稿時にB4ポスターを一緒に頼んでいたので、それを飾るためにアマゾンで購入。

似たような商品がいろいろあってどれを買ったらいいのかよく分からなかった・・・
とりあえず買ったやつで問題はなかった。

100均で買った袋に入れて持ち運ぶようにした。

スマート本棚

f:id:yamaimo0625:20190925121558p:plain

本を並べるためにアマゾンで購入。

ハゴロモ スマート本棚S No.82067

ハゴロモ スマート本棚S No.82067

本は表紙が見えるように立てて並べた方がいい。
そうすれば通路を通りかかっただけの人にも見える。
寝た状態で置かれてると上から覗き込まないと見えない。

ダンボールだけどけっこうしっかりした作りでよかった。

T型カードスタンド

f:id:yamaimo0625:20190925121618p:plain

かんたん後払いのポストカードを入れるために100均で購入。
サイズぴったりだった!

値札スタンド

f:id:yamaimo0625:20190925121920p:plain

硬質カードケース(A7)とマグネット付きのクリップで作成。
(どちらも100均で購入)

折りたためるL型カードスタンドが100均で売っているらしかったのだけど見つからなかったので作った。
折りたためないタイプだとかさばるし折れたときに困るので・・・

値札のデザインでクリップのことを忘れてた(^^;
けど、紙の後ろ側にクリップを回すことで回避w

クリアブックカバー

f:id:yamaimo0625:20190925121952p:plain

見本誌に巻くために100均で購入。
A5サイズは2つ入って100円だった。
(※写真は外の袋だけ)

ピッチリ巻くと端が少し余るので、マスキングテープで止めるといい感じになる。

タッパー

f:id:yamaimo0625:20190925122033p:plain

当日の金庫として使うために100均で購入。

金庫としてはコインを何枚も入れられるやつとかが売られてるけど、あのタイプの問題点はフタが邪魔
その点、タッパーは使ってるときはフタを下に敷けるので邪魔にならず、しまうときはしっかりとフタが固定できるのでめちゃくちゃよかった。
500円のオペレーションが入る場合、このタッパーに500円専用のコインケースを入れておけばいいと思う。

領収書

f:id:yamaimo0625:20190925122058p:plain

欲しいと言われたら渡す必要があったので100均で用意した。
結局使わなかったけど。

領収書には連絡が取れるように住所と名前を書くみたい。
あらかじめ数枚書いておくといい。
(あるいはスタンプなどを使う)

コイントレイ

f:id:yamaimo0625:20190925122115p:plain

お金を払った/払ってないが分からなくならないように、コイントレイを用意した方がいいとのことだった。

オペレーションとして以下のようにする:

  1. お金を受け取ったら金額を確認してコイントレイに置く
  2. 必要ならお釣りを渡す
  3. 品物を渡す
  4. コイントレイのお金をタッパーにしまう

最初、100均でプラスチックのトレイを買ったんだけど、デザインがアレだったので自作してみた。
100均でいい感じのフォトフレームとタオルを買って、写真の代わりにタオルを挟み、写真をカバーするためのプラスチック板で裏側を押さえたらいい感じになったw

名札

f:id:yamaimo0625:20190925122149p:plain

100均で購入。
「売り子」という名札をしておけば突っ込んだ質問はされないっぽいので。
(実際には店番をお願いしてたときに一回質問されたらしく、効果は微妙かも・・・)

文房具類

以下のような文房具類を100均で買い集めた:

f:id:yamaimo0625:20190925122204p:plain f:id:yamaimo0625:20190925122227p:plain

  • ダンボールカッター
  • ハサミ
  • マスキングテープ
  • 付箋紙
  • マジック
  • ボールペン
  • ガムテープ

ダンボールカッターはダンボールを切るためのもの。
先が丸まってて安全だしカバーがついてるのも安心できる。

マスキングテープは展示でセロハンテープなどが使えない場合があるらしいため。
(と思ってたんけど、情報ソースが見つけられない・・・)

ゴミ袋

f:id:yamaimo0625:20190925122352p:plain

スペースで出たゴミを持ち帰るためと、雨が降ったときに本が濡れないようにかぶせるために100均で購入。
なお、ダンボール箱にかぶせようとしたらサイズが足りなかった・・・雨が降らなくて助かった。

A4サイズのプラスチック製アタッシュケース

f:id:yamaimo0625:20190925122414p:plain

いろいろ荷物があって、特にスマート本棚とかは折れ曲がると困るので、A4サイズのプラスチック製アタッシュケースを買ってみた。
100均で300円商品。

T型カードスタンドも問題なく入って折れ曲がる心配をしなくて済んだので、1つあると安心できると思う。
荷物がひとまとめになってれば忘れ物をするリスクも減るし。

買っておけばよかったもの

名刺立てを買っておけばよかった。

こういうのとか。

DLカードを用意したんだけど、普通の名刺入れに入っていて、そのままだと非常に取り出しづらかった。
名刺立てに移しておけば簡単に取れたはず。

買わなかったもの/買わなくてよかったもの

買った方がいいと紹介されていたけど買わなかったものや、買ったけど使い物にならなかったものもあった。

まず、硬質カードケースは買わなかった。
お品書きを作るのにいいと紹介されてたけど、お品書きを作らなかったので。

あとボップホルダーも買わなかった。
これもポップを作るつもりがなかったから。
基本的には付箋があれば十分だと思う。

買ったけど不要だったものは、まずこれ。

f:id:yamaimo0625:20190925122443p:plain

敷き布を入れるための円筒形のケース。
100均で300円商品として売ってて「おっ、これ売ってるのか」と思わず買ってしまったんだけど、いざ使ってみたらめちゃくちゃ邪魔だった。
敷き布は普通に畳んで運べば十分。

それと、折りたたみ式のキャリーカートをアマゾンで買ったのだけど、これも使い物にならなかった:

f:id:yamaimo0625:20190925122507p:plain

書籍の入ったダンボール箱は想像以上に重い
なのでこういった安物のキャリーカートだと耐久性が全然足りなかった。
中身の減った1箱をかろうじて運べたけど、数箱運ぶとかは絶対無理。

もっとしっかりしたものを買った方がよかった。

値札、見本表示、名札の作成

値札や見本表示、名札をGraphicでサクッと作成。

f:id:yamaimo0625:20190924170905p:plain:w300

f:id:yamaimo0625:20190924171257p:plain:w500

f:id:yamaimo0625:20190924170956p:plain:w300

見本表示はこれを紙に印刷して切り分け、クリアブックカバーに挟み込んだ感じ。
見本だとハッキリと分かって、思った以上にうまくいったと思う。

一つ失敗したのは、これらのタスクを見落としていたこと。
Githubプロジェクトボードのカードにしてなかった。
そのせいで、前日にディスプレイ確認をしてる中でそういえば必要じゃんと慌てて作ることになった(^^;

お釣りの準備

お釣りのために1,000円札を30枚ほど用意した。
これなら約4回、1万円札で支払われても大丈夫なはずだったので。

なお、実際にはほとんど1,000円札で支払われた。
あと、かんたん後払いの利用がすごく多かった。(半分強がかんたん後払い)

ちなみに、今回は硬貨の取り扱いはなかったけど、硬貨のお釣りが必要なら平日に済ませておく必要があったみたい。
注意が必要。

ディスプレイ確認

実際に並べてみてディスプレイの確認を行なった。

そしてそのまま片付けて荷造り。
こうすれば(しまい忘れがなければ)当日足りないものはないはず。

16:9の告知画像の作成

@yagitchさんのツイートを参考に16:9の告知画像を作った。

参考にしたのはこのツイート:

作った画像とツイートはこんな感じ:

そして、これを毎回引用リツイートする感じで宣伝をした:

ただ、これに関しては作ってから気づいた点がいくつかあった:

  • ツイッターだと画像が角丸になることがあるので、角丸で削られてもおかしくないデザインにする必要があった
  • 背景が白だと他の白背景と混ざったときに分かりづらいので、白以外の方がよかった
  • もう少し早めに作った方がよかった(9/11で作れたのに9/16に作ってる)

次からは改善したい。

告知ページの作成

お品書きなどを書いた告知ページを作った。

ただ、これももっと早く作ればよかった。
どのタイミングで作るべきなのか迷って直前の9/19とかになってしまった。

入稿した時点でお品書きは決まるので、そのタイミングでさっきの16:9の告知画像を作って、さらにそれを使って告知ページも作るというのがいいように思う。

宣伝ツイート

さっきの16:9の告知画像などを使って定期的にツイートして宣伝を行なった。

このとき問題となるのが、どの時間帯にツイートするのが効果的なのかということ。
あまり頻繁にツイートしてても邪魔なので、出来るだけ少ない回数で効率よく見られるようにしたい。

そこで9/12(木)にほぼ同じ内容のツイートを8回行い、それぞれの時間経過ごとのインプレッション数を観測してみた。

6時/8時/10時/12時/15時/18時/20時/22時にツイートして、それぞれのインプレッション数がどう変化していったのかを記録した表が以下:

時間 6時 8時 10時 12時 15時 18時 20時 22時
7時 76 - - - - - - -
8時 106 - - - - - - -
9時 135 75 - - - - - -
10時 151 100 - - - - - -
11時 160 109 89 - - - - -
12時 168 117 113 - - - - -
13時 173 123 134 96 - - - -
14時 175 129 146 112 - - - -
15時 176 132 152 119 - - - -
16時 182 137 161 129 84 - - -
17時 184 139 163 133 106 - - -
18時 186 141 165 138 119 - - -
19時 186 142 168 144 127 96 - -
20時 189 145 171 147 142 128 - -
21時 192 147 173 149 147 139 99 -
22時 195 152 176 153 151 147 121 -
23時 197 154 188 164 160 159 141 118
翌6時 204 160 194 170 171 173 157 175

ここから分かるオススメの時間帯は、

  • 6時〜7時
    朝早いのであまり見られないのかと思いきや、意外と見られていた。
    朝起きてとりあえずツイッターを開く人が多いのだろうか。
  • 10時〜11時
    みんな忙しく働いてる時間と思いきや、意外と見られていた。
    出社してとりあえず一息ついた人が見ているのだと思う。
  • 18時〜19時
    帰宅途中にツイッターを開いた人が多く見る感じか。
  • 22時〜23時
    エンジニア夜更かししすぎ説。
    みんなもっと早く寝よう・・・

逆にオススメできない時間帯は、

  • 8時〜9時
    出社中に暇つぶしにツイッター見る人が多いかなと思ったら、意外とそうではないらしい。
    ドタバタしてる人が多いんだろうか。
  • 12時〜18時
    お昼休みもあるしけっこう見られるかと思ったら、そうではなかった。
    午前中は緩く働き、午後から本気出すという人が多いのかも。
  • 20時〜21時
    けっして悪いわけではないけど、19時くらいまでに早めにツイートするか22時くらいまで遅らせてツイートした方が効果が高い。

あと、毎回同じようなツイートだと、当然だけど全然クリックされない。
(この調査の時はツイート内容自体が影響しないようにあえて同じような内容にしてた) この日以降は『Math Poker Girl』から引用したりして宣伝ツイートしたんだけど、その方が圧倒的にクリックされていた。

委託の検討

委託先の候補としてあったのはBOOTHとらのあな

最初はBOOTHの倉庫サービスがよさそうと思ってたんだけど、以下の理由からやめた:

  • 入荷に時間がかかる
    7〜16営業日かかるらしく、ちょっとそれはという感じ。
  • 管理コストが理不尽に高い
    (前月の在庫数+当月の入荷数)に対して20%以上売れなかった場合、1,000円の保管料が発生する。
    売れた場合に手数料が発生するとかなら手取りが減るだけだからいいけど、売れなかった場合に手数料が発生するのだから、下手すれば売れもしないのにお金を払い続けるという状態になってしまう。

ただ、倉庫サービスを使わないで自宅で在庫を管理し自分で梱包・発送をするのなら優秀な感じだったので、これは利用している:

あと、とらのあなの委託も手続きが簡単だったのでやっておいた。
結果的にはこれが大正解で、当日郵送するダンボール箱を1つ減らせた・・・
(3ヶ月後に売れなかった在庫は返ってくるけど)

BOOTHに比べて値段は高くなってしまってるけど、ほぼリスクなしで人の目に触れる機会を増やせるから、利用する価値は高いと思う。

DLカードの作成

書籍を購入してくれたお客さんがPDF版をダウンロード出来るようにダウンロードカードを用意した。

  1. BOOTHにダウンロードカード用の商品を用意
  2. パスワード付きのzipに圧縮したPDFを商品として置いておく
  3. 以下を印刷した名刺を購入してくれたお客さんに渡す:
    • 上記のダウンロードURL
    • そのURLのQRコード
    • zipを解凍するためのパスワード

このとき注意すべきこととして、紛らわしい文字(1とIとlとか)をパスワードに使わないということ。

そういうのを考えてランダムなパスワードを作り、さらにzip化するとか面倒だったので、Rubyでgemを作ってみた:

これをインストールして例えば

$ passzip MathPokerGirl.pdf

とかすれば、紛らわしい文字を使っていない10桁(桁数はコマンドラインオプションで変えられる)のパスワードを生成して、そのパスワードを使ってpdfをzipにしてくれる。
この場合、zipファイルはMathPokerGirl.pdf.zipとなって、MathPokerGirl.pdf.passに生成されたパスワードは書き込まれてる。
これでMakeにパスワード付きzipの生成も組み込める。

まだRubyGemsへの登録はしてないので、あとでやってみたい。


長くなったけど、これが当日までに行なった準備。
当日の振り返りはまた次回。

今日はここまで!

TeXで同人誌を作ってみた。(奥付)

f:id:yamaimo0625:20190918075457j:plain

同人誌を作るときに必要となるのが奥付。
これはその同人誌を発行したのが誰か分かるようにし、何かあったときに問い合わせが出来るようにするため。
印刷所を使う場合、印刷所の名前も入れることになる。

仕様

今回、奥付は次のようにすることにした:

  • 連絡先は著書紹介にまとめ、奥付の近くに配置
  • 奥付は偶数ページに配置
  • 著者紹介は奇数ページでも偶数ページでもOK(偶数ページの場合は奥付と一緒のページ)

ページ配置

上記の仕様を満たすために、次のようなコードを書いた:

% 著者紹介 + 奥付

\clearpage

% ページスタイルなし
\thispagestyle{empty}

% 著者紹介とか連絡先とか

% 奥付は偶数ページに載せる
\makeatletter%
    \ifodd\c@page%
        \hbox{}\newpage\thispagestyle{empty}%
    \fi%
\makeatother

% 下寄せ
\vspace*{\fill} % *をつけるとページ先頭でも入る。

% 奥付

まず\clearpageで改ページしておいて\thispagestyleでページスタイルをemptyにしておく。
これはページ番号とか柱とか出したくないから。

そして、著者紹介とか連絡先を書く。

そのあとが肝心で、\ifodd\c@pageとすることで、現在のページ番号が奇数の場合だけさらに改ページしてページスタイルをemptyにするとしている。
これによって、著者紹介が奇数ページなら奥付は偶数ページに来て、著者紹介が偶数ページならそのまま同じページが使われる。
\newpageの前に\hbox{}が入ってるのは、たしか著者紹介が空の場合にうまく動くようにするためのはず)

あとは下寄せで奥付を出すために垂直方向の空きを入れている。

奥付の出力

奥付はたしか最初description環境を使って書こうとしたんだけど、何か問題があって(記録が残ってない・・・)tabular環境を使うことにし、それも問題があった(幅いっぱいに表を伸ばせない)ので最終的にtabular*環境を使うのに落ち着いた。

こんな感じ:

% 奥付
\begin{flushleft}
    % 幅いっぱいにするためにtabular*環境を使用
    % @{}とするとパディングがなくなる
    % また、@{...}とすると、セルの区切りに...が入る
    \begin{tabular*}{\textwidth}{@{}l@{\extracolsep{\fill}}}
        \textbf{\huge Math Poker Girl} \\
        \hline
        \begin{tabular}{@{}r@{\kern.5zw}r@{\kern.5zw}r@{\kern1.5zw}ll}
            2019 &  9 & 22 & 初版1刷発行 & (技術書典7) \\
        \end{tabular} \\
        \\
        \begin{tabular}{@{}l@{\kern.5zw\textbf{:}\kern1zw}l}
            \textbf{著者} & やまいも \\
            \textbf{発行} & いもあらい。 \\
            \textbf{印刷} & 有限会社ねこのしっぽ \\
        \end{tabular} \\
        \hline
    \end{tabular*}
\end{flushleft}

ページ幅いっぱいの表

普通のtabular環境で表を作ると「適切な」幅の表にされてしまうので、ページ幅いっぱいの表を作るためにtabular*環境を使った。
引数で表の幅として\textwidthを指定している。

あとは表の列レイアウトの指定で@{\extracolsep{\fill}}を入れると、その列に十分な幅が与えられるっぽい。

・・・と書いててコード見返すと、なんでこれ表使ってるんだろう?
1列しかないから、表にしなくてもいいような。
線を引くのに\hrulefillだと問題があって\hlineを使いたかったとかなのかな・・・

表の縦区切り

表の列レイアウトの指定で|とすると縦線(と空き)が入るのは知っていたけど、@{<tokens>}とすると<tokens>が入るのは知らなかった。
これを利用して@{}とすると空きがまったく入らなくなり、あるいは@{年}とすると区切りにが入るようになると。

発行日の表ではこれを使って年月日をキレイに整えて出力している。
(単に@{年}だと空きがまったく入らなくなってしまうので、@{年\kern.5zw}と半角分の空きを入れてる)

仕上がり

出来上がった著者紹介&奥付は、こんな感じ:

f:id:yamaimo0625:20190921100151p:plain f:id:yamaimo0625:20190921100209p:plain

Re:VIEWの残念な感じの奥付と比較して、なかなかいい感じに出来上がったので嬉しいw

今日はここまで!

TeXで同人誌を作ってみた。(ページスタイル作成)

f:id:yamaimo0625:20190918075457j:plain

今日はページスタイルの作成について。
なお、 \TeX \LaTeXは区別せずに扱っている。

参考にしたのは以下:

LaTeX2ε辞典 増補改訂版

LaTeX2ε辞典 増補改訂版

余談だけど、 \TeXの入門書というと奥村先生の美文書作成入門が定番として挙げられるけど、個人的にはあまり好みでない・・・
持ってはいるし参考にもするけど。
とりあえず必要なことを網羅的にぶち込みましたというリファレンス的な感じが強くて(そのくせ載ってない内容もけっこう多い)、ユーザガイドとしてはちょっと。。。
かといって他にいいユーザガイドがあるかというと難しいところで、まぁつまりは \TeX \LaTeXの設計がもはや古すぎてアレだからキレイに説明するのが難しいんだろうなぁ・・・

そんな中でこの辞典は逆引きのリファレンスのように見えて割とユーザに親切で痒いところに手が届く感じに書いてくれてるのでいい。
もちろん最初にこの本を読んでもサッパリなので、なんとなく手なりで使えるようになった人がちゃんと \TeXを使っていくときに読むといいと思う。

Before / After

閑話休題

ページスタイルを作ることでどうなるのかをまずは示しておく。

作成前はこちら:

f:id:yamaimo0625:20190921115209p:plain f:id:yamaimo0625:20190921115222p:plain f:id:yamaimo0625:20190921115234p:plain

作成後はこちら:

f:id:yamaimo0625:20190921115248p:plain f:id:yamaimo0625:20190921115300p:plain f:id:yamaimo0625:20190921115312p:plain

以下が変わってることが分かると思う:

  • ヘッダの下線がなくなっている
  • ページ番号が縦線(|)で囲われている
  • 章タイトル、節タイトルがページの内側(ノド側)ではなく外側(小口側)に寄せられている

基本的には『数学ガール』をマネたものなんだけど、ページ番号を縦線で囲っているのがオリジナルと違くて、これは柱(章タイトルとか)との区別がつきにくいと思ったから。

ちなみに、他の本を見ると以下のようなデザインもあるみたい:

  • 柱を本文に揃えて、ページ番号はその外へ出す(この場合、ページ番号を枠で囲ったりすることが多いっぽい)
  • 柱を本文に揃えて、ページ番号はフッタで出す
  • ヘッダにはページ番号だけ出し、小口に縦書きで章タイトル/節タイトルを出す

どれも一長一短で、なかなか難しいところ。

ページスタイルの概要

まず、本文領域の上と下にそれぞれヘッダとフッタがある。
そして、ヘッダとフッタの出力をどうするのかを指定するのがページスタイル。

デフォルトで以下のようなページスタイルが用意されている:

ページスタイル 説明
empty ヘッダとフッタに何も出力しない
plain フッタにページ番号を出力する
heading 柱とページ番号をヘッダに出力する
myheading ページ番号とユーザの指定した柱を出力する

独自のヘッダとフッタを出力したい場合、ページスタイルを自分で作ってそのページスタイルを使うことを指定することになる。

ページスタイルを作る場合、以下のようにする:

  1. \ps@<ページスタイル名>を定義(もしくは再定義)して、その定義の中で
    1. 奇数ページのヘッダを出力する\@oddheadを再定義
    2. 偶数ページのヘッダを出力する\@evenheadを再定義
    3. 奇数ページのフッタを出力する\@oddfootを再定義
    4. 偶数ページのフッタを出力する\@evenheadを再定義

それぞれの再定義ではページ番号を出力する\thepageや奇数ページの柱を出力する\rightmark、偶数ページの柱を出力する\leftmarkを使うといい。

なお、柱の内容は\markboth{<left mark>}{<right mark>}などで登録する。
\chapter\sectionでは内部でこれを呼び出して柱の登録を行なっている。

ページスタイルの作成

以下のようにmycustomというページスタイルを作ってみた。
(もうちょい命名なんとかならなかったものか・・・)

\makeatletter

%%% 隠しノンブルのための仕込み

% 隠しノンブルを出力(印刷用で定義を上書きする)
\newcommand{\oddNombre}{\relax}  % 奇数ページ用
\newcommand{\evenNombre}{\relax} % 偶数ページ用

%%% ヘッダ・フッタの体裁カスタマイズ

% mycustomページスタイルを作成
\newcommand{\printpage}[1]{$|$\hbox to 3em{\hss\textbf{#1}\hss}$|$}
\newcommand{\ps@mycustom}{%
    \renewcommand{\@oddfoot}{\oddNombre}%
    \renewcommand{\@evenfoot}{\evenNombre}%
    \renewcommand{\@oddhead}{\hfil\rightmark\hspace{2em}\printpage{\thepage}}%
    \renewcommand{\@evenhead}{\printpage{\thepage}\hspace{2em}\leftmark\hfil}%
    \let\@mkboth\markboth
    \def\chaptermark##1{\markboth{%
        \ifnum \c@secnumdepth >\m@ne
            \if@mainmatter
                \if@omit@number\else
                    \@chapapp\thechapter\@chappos\hskip1\jsZw
                \fi
            \fi
        \fi
        ##1}{}}%
    \def\sectionmark##1{\markright{%
        \ifnum \c@secnumdepth >\z@ \bxjs@label@sect{section}\hskip1\jsZw\fi
        ##1}}%
    }
\pagestyle{mycustom}

\makeatother

最初に隠しノンブルを出すための仕込みを用意している。
\relaxなので何もしないんだけど、印刷用の場合はあとでこれを再定義することで隠しノンブルを出力できるようになる。

そしてページ番号を|で囲って出力するためのマクロを用意している。
ページの桁数によって幅が変わるとイヤだったので、3em分の箱を作ってその中で中央寄せになるようにしてる。

あとはそれぞれの命令を再定義していて、フッタでは隠しノンブルの出力を行い、ヘッダでは柱とページ番号を出力するようにしている。

そのあと\chaptermark\sectionmarkを定義しているのは、オリジナル(bxjsbook.cls)からコピペしてきたもの。
コードを確認すると、\chapter\sectionはそこから\chaptermark\sectionmarkを呼び出し、その中で\markbothを呼び出すことで柱の登録を行なっている。
そしてこの\chaptermark\sectionmarkの命令を用意してるのは\ps@headingsなどのページスタイルの定義となっていた。
なので、自分でページスタイルを作る場合もこれらの命令を用意しておかないと柱がちゃんと出力されないっぽい。

それと最後に\pagestyle{mycustom}としてページスタイルを自分が作ったmycustomに変えておくのを忘れずに。

章初めのページスタイルの修正

これで大丈夫かなと思いきや、章初めのページは特別なページスタイルが使われるみたいだった。

\newcommand{\chapter}{%
  ...
  \plainifnotempty
  ...
  }

\def\plainifnotempty{%
  \ifx \@oddhead \@empty
    \ifx \@oddfoot \@empty
    \else
      \thispagestyle{plainfoot}%
    \fi
  \else
    \thispagestyle{plainhead}%
  \fi}

なので、そのページスタイル(plainhead)も再定義しておかないとダメだった。

plainheadのオリジナル(bxjsbook.cls)の定義は以下:

\def\ps@plainhead{%
  \let\@mkboth\@gobbletwo
  \let\@oddfoot\@empty
  \let\@evenfoot\@empty
  \def\@evenhead{%
    \if@mparswitch \hss \fi
    \hbox to \fullwidth{\textbf{\thepage}\hfil}%
    \if@mparswitch\else \hss \fi}%
  \def\@oddhead{%
    \hbox to \fullwidth{\hfil\textbf{\thepage}}\hss}}

これをmycustomページスタイルに合わせて再定義:

\makeatletter

% 章の最初のページ用のスタイルを上書き
\renewcommand{\ps@plainhead}{%
    \renewcommand{\@oddfoot}{\oddNombre}%
    \renewcommand{\@evenfoot}{\evenNombre}%
    \renewcommand{\@oddhead}{\hfil\printpage{\thepage}}%
    \renewcommand{\@evenhead}{\printpage{\thepage}\hfil}%
    \let\@mkboth\markboth
    \def\chaptermark##1{\markboth{%
        \ifnum \c@secnumdepth >\m@ne
            \if@mainmatter
                \if@omit@number\else
                    \@chapapp\thechapter\@chappos\hskip1\jsZw
                \fi
            \fi
        \fi
        ##1}{}}%
    \def\sectionmark##1{\markright{%
        \ifnum \c@secnumdepth >\z@ \bxjs@label@sect{section}\hskip1\jsZw\fi
        ##1}}%
    }

\makeatother

ただし柱は出力しないようにしている。
(これはplainheadに合わせたもの;節が始まってないから出力すべき内容もない)

emptyページスタイルの修正

普通はemptyページスタイルを修正する必要はないんだけど、隠しノンブルをフッタを使って入れるようにするので、その仕込みが必要。
(白紙ページにも隠しノンブルは出力した方がいい)

オリジナル(latex.ltx)は以下のようになっていた:

\def\ps@empty{%
  \let\@mkboth\@gobbletwo\let\@oddhead\@empty\let\@oddfoot\@empty
  \let\@evenhead\@empty\let\@evenfoot\@empty}

これを以下のように修正した:

\makeatletter

% 空白ページのスタイルを上書き
\renewcommand{\ps@empty}{%
    \let\@mkboth\@gobbletwo\let\@oddhead\@empty\let\@evenhead\@empty
    \renewcommand{\@oddfoot}{\oddNombre}%
    \renewcommand{\@evenfoot}{\evenNombre}}

\makeatother

これでページスタイルの作成は完了。

それにしても、このコピペして修正っていうの、ホントなんとかならないものか・・・
CSSのように変更がある部分だけ上書きで修正するみたいな仕組みが欲しい。
あと、そもそもオリジナルのソースを調べてみないと変更できないっていうのをやめて欲しい・・・

今日はここまで!

TeXで同人誌を作ってみた。(目次デザイン)

f:id:yamaimo0625:20190918075457j:plain

今日も \TeXの話で、目次のデザインについて。
なお、 \TeX \LaTeXは区別せずに扱ってる。

参考にしたのは以下:

LaTeX2ε辞典 増補改訂版 (DESKTOP REFERENCE)

LaTeX2ε辞典 増補改訂版 (DESKTOP REFERENCE)

Before / After

まずは変更前と変更後でどう変わったのかを示しておきたい。

変更前はこちら:

f:id:yamaimo0625:20190920121846p:plain

なお、昨日の見出しデザインの変更が入ってるので、目次の見出しは章見出しと同じデザインになってる。
あと、目次にリンクをはる変更が入ってる。

変更後はこちら:

f:id:yamaimo0625:20190920122127p:plain

以下が変わってることが分かると思う:

  • 目次の見出しデザインが変わってる
  • 小節まで見出しが出るようになっている
  • 章番号がない章のタイトルの先頭が章番号がある章のタイトルの先頭に揃っている
  • メインコンテンツでは章の上に線が引かれている
  • 節は章のタイトルの先頭にインデントされ、小節は節のタイトルの先頭にインデントされている
  • 「はじめに」の上に大きくスペースが入っている

「メインコンテンツでは・・・」というのは、「はじめに」や「プロローグ」も章なんだけど、これらの非メインコンテンツでは章の上に線が引かれず、「第1章」「第2章」のようなメインコンテンツでは章の上に線が引かれているということ。

ちなみに、これも『数学ガール』のデザインをマネたものとなっている。

目次の見出しデザインの変更

まずは目次の見出しデザインの変更から。

目次は\tableofcontents命令で出力するのだけど、これで見出しなどもまるまる出力され、目次の場合は「目次」という章見出しが出力される定義になっている。

章見出しが出ること自体はいいんだけど、そのデザインは他の章見出しとは違う特別なものにしたい。
そういう場合、グルーピングを使うといい。

 \TeXでは{}で囲うことでグルーピングでき、その内側はローカルになって外側の定義に影響を与えずに変更することが出来る。

そこで、以下のようにグルーピングしてその中で章見出しのデザインを変えてから目次を出力するようにした:

% 目次
{
% 目次の見出しだけデザインを変える
\makeatletter
\renewcommand{\@makeschapterhead}[1]{% #1: 見出し
    \vspace*{-2\baselineskip}%
    \noindent\hspace*{0.15\textwidth}\hrulefill\par%
    \vtop to 3\baselineskip{% 3行分の高さを確保
        \noindent\hspace*{0.15\textwidth}%
        \textsf{\large \kintou{0.85\textwidth}{C O N T E N T S}}\par%
    }\par}
\makeatother
\tableofcontents
}

章のタイトルの先頭と揃うように、テキスト幅(\textwidth)の右側85%が目次の見出しになるようにして、そこに「CONTENTS」の文字を均等割りで配置している。

目次レベルの変更

目次でどの見出しレベルまで出すかは、tocdepthというカウンターの値で指定する。

% 目次レベル
\setcounter{tocdepth}{2}  % 小節まで目次に出す

目次の章のデザイン変更

目次での章のデザインを変えるには、\l@chapterという命令を再定義する。

オリジナル(bxjsbook.cls)では次のようになっている:

\newcommand*{\l@chapter}[2]{%
  \ifnum \c@tocdepth >\m@ne
    \addpenalty{-\@highpenalty}%
    \addvspace{1.0em \@plus\p@?}
    \begingroup
      \parindent\z@
      \rightskip\@tocrmarg
      \parfillskip-\rightskip
      \leavevmode\headfont
      \setlength\@lnumwidth{\jsc@tocl@width}\advance\@lnumwidth 2.683\jsZw
      \advance\leftskip\@lnumwidth \hskip-\leftskip
      #1\nobreak\hfil\nobreak\hbox to\@pnumwidth{\hss#2}\par
      \penalty\@highpenalty
    \endgroup
  \fi}

うん、さっぱり分からないw
一応、カウンターのtocdepthの値を比較して出力するかどうか決めてるのかなぁくらいは分かるけど、あとは \TeXのモードとか(水平モードとか垂直モードとか)ペナルティの話が分かってないと厳しそう。
(そして自分はまだそこらへんを理解しきれてない)

いろいろ試したりしつつ、以下のようにしてみた:

\makeatletter

% 目次の章の体裁カスタマイズ
\newif\ifmaincontents   % メイン内の章かを区別するため
\maincontentsfalse
\renewcommand{\l@chapter}[2]{%
    \ifnum \c@tocdepth >\m@ne
        \setlength\@lnumwidth{0.15\textwidth}
        \ifmaincontents
            \noindent\hrulefill\par%
            \nobreak%
            \noindent {\large #1\hfill #2}\par
            \vspace*{0.5\baselineskip}
        \else
            \noindent {#1\hfill #2}\par
            \vspace*{0.5\baselineskip}
        \fi
    \fi}

\makeatother

まず、メインコンテンツかどうかでデザインを変えたいので、\ifmaincontentsという条件判断を用意している。
これについては後述。

そして、\@lnumwidthをテキスト幅の15%にしてるので、たしかこれがタイトルまでのインデント幅。

あとは、メインコンテンツなら横線を引いてから出力し、そうでなければ単に出力をしている。

目次の節、小節のデザイン変更

目次の節や小節のデザインを変えるには、\l@section\l@subsectionの定義を変更する。

これらのオリジナル(bxjsbook.cls)では定義がどうなっているかというと以下:

\newcommand*{\l@section}{%
          \@tempdima\jsc@tocl@width \advance\@tempdima -1\jsZw
          \@dottedtocline{1}{\@tempdima}{3.683\jsZw}}
\newcommand*{\l@subsection}{%
          \@tempdima\jsc@tocl@width \advance\@tempdima 2.683\jsZw
          \@dottedtocline{2}{\@tempdima}{3.5\jsZw}}

長さを計算して実際の処理は\@dottedtoclineという命令に委譲してるのが分かる。
この命令は\@dottedtocline{<tocdepth>}{<margin>}{<numlength>}という感じで、目次レベルとマージンサイズ、それと番号が出力される部分の長さを指定するようになっている。

これは次のように変更してみた:

\makeatletter

% 目次の節の体裁カスタマイズ
\renewcommand{\l@section}{\@dottedtocline{1}{0.15\textwidth}{2.5em}}
% 目次の小節の体裁カスタマイズ
\renewcommand{\l@subsection}{\@dottedtocline{2}{0.235\textwidth}{3.5em}}

\makeatother

なお、0.235\textwidthというのは目で見てそれっぽくなってる値にしただけ(^^;
ちゃんとやるなら足し算しないとダメ。

章番号なしの章の目次への追加

\chapter*{}を使った章は章番号が出ないだけじゃなくて目次にも出てこない。
これを目次に出すようにするには\addcontentlineという命令を使う。

例えば、「はじめに」だとこんな感じ:

\chapter*{はじめに}
\addcontentsline{toc}{chapter}{はじめに}

これで目次に章として「はじめに」が追加される。

ただ、これだと変更前の画像で見たとおり、章番号と同じインデントの深さにタイトルが出てしまう。
章番号のある章のタイトルと同じインデントの位置にタイトルは出て欲しい。

そこで以下のように変更してみた:

\chapter*{はじめに}
\addcontentsline{toc}{chapter}{\protect\numberline{\null}はじめに}

どうしてこれでうまくいくのかを以下で説明していく。

まず、 \TeXは目次をtocファイルから作るのだけど、上記のように変更せずにtocファイルを見てみると次のようになっている:

\contentsline {chapter}{はじめに}{i}{chapter*.1}% 
...
\contentsline {chapter}{\numberline {第1章}ポーカーのルール}{1}{chapter.1}% 
\contentsline {section}{\numberline {1.1}テキサス・ホールデム}{2}{section.1.1}% 
...

つまり、章番号や節番号の部分は\numberlineという命令によって出力されていることが分かる。
なら、空の章番号を\numberlineで出力するようにすれば、インデント位置が揃うはずと。

ただし、単に\addcontentsline{toc}{chapter}{\numberline{\null}はじめに}とするとうまくいかない。
これは\numberline{\null}という命令がtocファイルに書き込まれる前に評価されて別の文字列に変わってしまうから。
それを抑制するために\protectが付け加えられている。

上記の変更をしたあとのtocファイルの出力はこうなる:

\contentsline {chapter}{\numberline {\hbox {}}はじめに}{i}{chapter*.1}% 
...
\contentsline {chapter}{\numberline {第1章}ポーカーのルール}{1}{chapter.1}% 
\contentsline {section}{\numberline {1.1}テキサス・ホールデム}{2}{section.1.1}% 

これで章番号がない章のタイトルの先頭も章番号がある章のタイトルの先頭に揃うようになる。

メインコンテンツ/非メインコンテンツの切り替え

上記までの変更を行なっての出力が以下:

f:id:yamaimo0625:20190920135535p:plain

メインコンテンツと非メインコンテンツの切り替えが出来ていないので、「第1章」の上に線が引かれてない。
あと、「はじめに」の前の空きも足りてない。

そこで、tocファイルに「非メインコンテンツの開始」「メインコンテンツの開始」の命令を書き込むようにした:
(どうやって書き込むのかは後述)

before

\contentsline {chapter}{\numberline {\hbox {}}はじめに}{i}{chapter*.1}% 
...
\contentsline {chapter}{\numberline {第1章}ポーカーのルール}{1}{chapter.1}% 
\contentsline {section}{\numberline {1.1}テキサス・ホールデム}{2}{section.1.1}% 

after

\startnomaintoc 
\contentsline {chapter}{\numberline {\hbox {}}はじめに}{i}{chapter*.1}% 
...
\startmaintoc 
\contentsline {chapter}{\numberline {第1章}ポーカーのルール}{1}{chapter.1}% 
\contentsline {section}{\numberline {1.1}テキサス・ホールデム}{2}{section.1.1}% 

そして、このtocファイルに書き込んだ命令を以下のように定義することで、メインコンテンツ/非メインコンテンツの切り替えを行い、また非メインコンテンツの前には空きを入れるようにした:

% \startmaintocで\ifmaincontentsがtrueになるようにする
\newcommand{\startmaintoc}{\maincontentstrue}
% \startnomaintocで\ifmaincontentsがfalseになるようにし2行分の空きを入れる
\newcommand{\startnomaintoc}{\maincontentsfalse\vspace*{2\baselineskip}}

あとはこの\startmaintocおよび\startnomaintocをどうやってtocファイルに書き込むか。

調べてみると\addaddcontentslineは以下のように「tocファイルに目次を書け」という命令をauxファイルに書き込んでいるようだった。

% latex.ltxから引用(コメントは自分が追記)

\def\addcontentsline#1#2#3{%
  \addtocontents{#1}{\protect\contentsline{#2}{#3}{\thepage}%
                     \protected@file@percent}}
\long\def\addtocontents#1#2{%
  \protected@write\@auxout% ここがauxへ書けという命令
      {\let\label\@gobble \let\index\@gobble \let\glossary\@gobble}%
      {\string\@writefile{#1}{#2}}}% auxに書く内容は「#1(toc)に#2を書け」という命令

そして、auxファイルが評価されることでtocファイルに目次が書き込まれる(そして\tableofcontents命令はtocファイルの内容を実行することで目次を出力する)。

なので、同じように「tocファイルに\startmaintocを書け」という命令をauxファイルに書き込む命令を作って、それを呼び出せばいい。

そこでいろいろ調べながら次のような命令を用意した:

\newcommand{\startmaincontents}{%
    \immediate\write\@auxout{\string\@writefile{toc}{\string\startmaintoc}}}
\newcommand{\startnomaincontents}{%
    \immediate\write\@auxout{\string\@writefile{toc}{\string\startnomaintoc}}}

あとは以下のように呼び出すだけ:

\startnomaincontents

\chapter*{はじめに}
\addcontentsline{toc}{chapter}{\protect\numberline{\null}はじめに}
\startmaincontents

\chapter{ポーカーのルール}

これで冒頭のような目次が得られた。


宣伝です。
気になった人はチェックをお願いします!

今日はここまで!

TeXで同人誌を作ってみた。(見出しデザイン)

f:id:yamaimo0625:20190918075457j:plain

今日も \TeXでの同人誌制作について。

今日は見出しのデザインについて。
なお、昨日と同様で \TeX \LaTeXは区別せずに扱ってる。

参考にしたのは以下:

LaTeX2ε辞典 増補改訂版 (DESKTOP REFERENCE)

LaTeX2ε辞典 増補改訂版 (DESKTOP REFERENCE)

Before / After

まずは変更前と変更後でどう変わったのかを示しておきたい。

変更前はこちら:

f:id:yamaimo0625:20190920095604p:plain f:id:yamaimo0625:20190920095618p:plain

変更後はこちら:

f:id:yamaimo0625:20190920095644p:plain f:id:yamaimo0625:20190920095656p:plain

以下が変わってることが分かると思う:

  • フォントがゴシック体ではなく太字の明朝体になっている
  • 章見出しが右寄せになって上下に線が引かれている

下の変更については、『数学ガール』のデザインをマネたもの。
手元にあれば確認してもらうとだいぶ再現されていることが分かると思う。
(ただし、オリジナルは太ゴシックになってる;伝統的に和文の見出しは太字の代わりにゴシック体にすることが多い。ただ、太字フォントが使えるなら明朝体の方が美しいと個人的には思っている)

章見出しの修正

 \TeXでどうやってデザインを変更するか。
基本はクラスファイルの中身を見て必要な命令を見つけ出し再定義する。

なんてプリミティブな・・・

一応、最初に挙げた本とか見ると取っ掛かりとなる部分を知ることが出来る。

章見出しのデザインを変更する場合、\@makechapterhead\@makeschapterheadを再定義するといい。
(前者は見出し番号を出す\chapter用のデザイン、後者は見出し番号を出さない\chapter*用のデザイン)

オリジナル(bxjsbook.cls)の定義はこうなっている:

\def\@makechapterhead#1{%
  \vspace*{2\Cvs}% 欧文は50pt
  {\parindent \z@ \raggedright \normalfont
    \ifnum \c@secnumdepth >\m@ne
      \if@mainmatter
        \huge\headfont \@chapapp\thechapter\@chappos
        \par\nobreak
        \vskip \Cvs % 欧文は20pt
      \fi
    \fi
    \interlinepenalty\@M
    \Huge \headfont #1\par\nobreak
    \vskip 3\Cvs}} % 欧文は40pt
\def\@makeschapterhead#1{%
  \vspace*{2\Cvs}% 欧文は50pt
  {\parindent \z@ \raggedright
    \normalfont
    \interlinepenalty\@M
    \Huge \headfont #1\par\nobreak
    \vskip 3\Cvs}} % 欧文は40pt

お、おう・・・
ただ、文字サイズ変えたりフォント変えたりして章番号を出力したり(\thechapter)引数(#1)として渡ってきた章のタイトルを出力してるんだなぁということはなんとなく分かるような、分からないような・・・

とにかくこれをこう修正した:

\makeatletter

%%% 見出しの体裁カスタマイズ

% 章見出しの体裁カスタマイズ
% *なし
\renewcommand{\@makechapterhead}[1]{% #1: 見出し
    \vspace*{-2\baselineskip}%
    \noindent\hrulefill\par%
    \vtop to 5\baselineskip{% 5行分の高さを確保
        \hspace*{\fill}\textbf{\large\thechapter}\par%
        \hspace*{\fill}\textbf{\raisebox{-5pt}{\LARGE #1}}\par%
    }%
    \noindent\hrulefill\par}
% *あり
\renewcommand{\@makeschapterhead}[1]{% #1: 見出し
    \vspace*{-2\baselineskip}%
    \noindent\hrulefill\par%
    \vtop to 5\baselineskip{% 5行分の高さを確保
        \hspace*{\fill}\textbf{\raisebox{-5pt}{\LARGE #1}}\par%
    }%
    \noindent\hrulefill\par}

\makeatother

やってることは、

  1. 2行分上に移動し(※理屈としては1行分でいいはずなんだけど、なぜか2行分移動しないと一番上の位置にならなかった)
  2. ベースラインに横一杯の直線を引き、
  3. 5行分の高さのある箱を用意して、
  4. 右寄せで章番号を出力し、
  5. 右寄せで章のタイトルを出力し、
  6. 最後に横一杯の直線を引く。

という感じ。
*ありの方は章番号はないので手順の4.をスキップしてる)

\textbf{}を使って太字で出力されるようにしているけど、昨日書いたOTFパッケージのおかげで太字はゴシック体ではなく太字の明朝体で出力されるようになっているので、これで太字の明朝体になる。

あと、\makeatletter\makeatotherはざっくり言うと@特殊文字ではなく普通の文字として扱えるようにするもの。
これをしておかないと\@makechapterheadなどが制御綴という扱いになってくれない。

それにしても、自分がやったとはいえ、この変更は力技すぎて汚いなぁ・・・
 \TeXの命令と \LaTeXの命令が混ざりまくってるし、詰まりすぎた行間を広げるために\raiseboxで無理やり位置を下げたりね。。。
もっと勉強しないと。

節見出しの修正

節以下の見出しを修正する場合、\@startsectionに渡すパラメータの値を変えるように\section制御綴などを再定義するのが基本になる。
ただもちろんベタにいろいろ変更してもいい。

オリジナル(bxjsbook.cls)での定義は以下:

\if@twocolumn
  \newcommand{\section}{%
    \@startsection{section}{1}{\z@}%
    {0.6\Cvs}{0.4\Cvs}%
    {\normalfont\large\headfont\raggedright}}
\else
  \newcommand{\section}{%
    \if@slide\clearpage\fi
    \@startsection{section}{1}{\z@}%
    {\Cvs \@plus.5\Cdp \@minus.2\Cdp}% 前アキ
    {.5\Cvs \@plus.3\Cdp}% 後アキ
    {\normalfont\Large\headfont\raggedright}}
\fi

数学ガール』では節見出しに上線を引くようになっている。
もしこれを再現したかったら、以下のようにすればいいことは確認した:

\makeatletter

\renewcommand{\section}{%
    \if@slide\clearpage\fi%
    \vspace{\baselineskip}%
    \noindent\hrulefill\par%
    \@startsection{section}{1}{\z@}%
    {.1\Cvs \@plus.5\Cdp \@minus.2\Cdp}% 前アキ
    {.7\Cvs \@plus.3\Cdp}% 後アキ
    {\normalfont\Large\headfont\raggedright}}

\makeatother

横一杯の直線を引く変更が入ってるのが分かると思う。

ただ、『Math Poker Girl』は各節の終わりに「まとめ」を入れることにしていて、その「まとめ」が枠で囲まれているので上線まで引くとちょっと冗長な感じだった。
なので、上記の変更はしていない。

見出しフォントの修正

上記の定義を見ると、見出しは\headfontで指定されたフォントで出力されていることが分かる。
なので、これをゴシック体ではなく太字の明朝体になるようにした:

% 節以下の見出しがゴシック体になってしまっていたので、
% 太字明朝体になるように修正。
\renewcommand{\headfont}{\bfseries}

もちろんこれはOTFパッケージを使ってdeluxeオプションを指定している前提。

これで冒頭で示したような見出しデザインになってくれた。


宣伝です。
気になった人はチェックをお願いします!

今日はここまで!

TeXで同人誌を作ってみた。(フォント周り)

f:id:yamaimo0625:20190918075457j:plain

昨日に引き続き、同人誌制作に \TeXを使って学んだことについて。

今日はフォント周りについて。

なお、現時点での理解を書いていて正確性には欠けるので注意。
あと \TeX \LaTeXを区別せずに扱ってる。

参考にしたのは以下とか:

[改訂第7版]LaTeX2ε美文書作成入門

[改訂第7版]LaTeX2ε美文書作成入門

LaTeX2ε辞典 増補改訂版 (DESKTOP REFERENCE)

LaTeX2ε辞典 増補改訂版 (DESKTOP REFERENCE)

 \TeXでのフォントの仕組み

まず \TeXはフォントのメトリック情報だけを使って組版を行う

メトリック情報というのは文字を箱として扱ったときの高さとか幅とかのことで、つまり \TeXは文字の細かい形(グリフという)なんかまったく見てなくて、大きさのバラバラな箱を「いい感じ」になるように並べているだけだったりする。

f:id:yamaimo0625:20190919131528p:plain

このメトリック情報が書かれたファイルがtfmファイル(TeX Font Metricファイル)。

欧文の場合、フォントによってメトリックは変わってくるので、指定されたフォントから対応するtfmファイルを \TeXが見つけられる必要がある。
そこで使われるのがfdファイル(Font Definitionファイル)。

 \TeXではフォントを5つの要素で識別している:

  • エンコーディング(数値と文字との対応づけ、OT1とかT1とかがある)
  • ファミリー(書体(≒フォント名))
  • シリーズ(太さ、ボールドとか)
  • シェイプ(形、イタリックとか斜体とか)
  • サイズ(大きさ、10ptとか)

この5つの要素とfdファイルを参照して使われるtfmファイルが決まる。

 \TeXはDVIファイル(Device Independentファイル)を出力するけど、そこには使われたtfmファイル名しか書かれていない。
なので、DVIを表示(あるいは変換)するソフトはtfmファイル名と実際に使うべきフォントとの対応関係を知る必要がある。
そこで使われるのがmapファイル。

これでtfmファイル名から実際のフォントが分かり、実フォントを使って表示(や変換)が行われることになる。

図にまとめるとこんな感じ:

f:id:yamaimo0625:20190919135611p:plain

フォントの指定は\usefont{<encoding>}{<family>}{<series>}{<shape>}という制御綴などを使うっぽい。

論理フォント

この論理フォントという言い方は自分の言い方で、一般にそう言われているわけではないので注意。

上記のフォント指定とは別に、論理的なフォントの指定があるように思う。
\textrm{...}とか\textit{...}とか。
前者はローマン体のフォントを使うことを指定していて、後者はイタリック体のフォントを使うことを指定している。

この論理的な指定で実際にどのフォントが使われるかは、\rmdefaultなどを再定義すると変わるみたい。

欧文に関して

 \TeXの欧文で定番のフォントといえばComputer Modernだったけど、使われているエンコーディングが古いなどで、あまり好ましくないみたい。
同じデザインのフォントを使いたいなら、Latin Modernを使うといいとのこと。

Latin Modernを使うには次のようにする:

\usepackage{lmodern}
\usepackage[T1]{fontenc}

和文に関して

 \TeXでのフォントの仕組みを上で書いたけど、これが和文になるとちょっと話が変わってくる。

和文だとどのフォントでもメトリックが変わらない
どれも正方形の箱の中に文字を入れている。

そこで、明朝体なら「Ryumin-Light(リュウミンL)」、ゴシック体なら「GothicBBB-Medium(中ゴシックBBB)」というフォントが常に使われる。
(もう少し正確に書くと、fdファイルによって明朝体はjis.tfm、ゴシック体はjisg.tfmというtfmファイルを使うことが決まり、これらは仮想フォントというものになっていて、そこにrml.tfm(リュウミンL)やgbm.tfm(中ゴシックBBB)を使うことが指定されているらしい)

じゃあ、リュウミンLや中ゴシックBBBってどんなフォントなのかというと基本的にはシステムには入ってない
なのでPDFにしたときに実フォントは埋め込まれず、表示した時に使える明朝体/ゴシック体の適当なフォントが使われる。

それじゃ困るのでmapファイルで埋め込むフォントを指定することになるんだけど、つまり、DVIファイルで出力された時点でフォントは2種類(明朝体/ゴシック体)しかないので、埋め込めるフォントも2種類しかない。

マジでゴミ仕様

・・・とはいえ仕方ないので、それで頑張るしかない。。。

rmlやgbmというtfmファイル名に対して実フォントを対応させるためにmapファイルを更新するのだけど、それにはupdmapというツールを利用する。
これはDVIウェアごとにmapファイルが必要だけどそれを一つずつ変更していたら大変なので一気に変更するためのもの。
和文の場合はkanji-config-updmapを使うことになる。

updmapにはシステム全体の設定を変えるupdmap-sysと個人の設定を変えるupdmap-userがある。
和文についても同様で、kanji-config-updmap-sysとkanji-config-updmap-userがある。

具体的な指定方法はヒラギノフォントを使う設定のところで。

OTFパッケージ

和文のフォントメトリックは正方形であるべきなんだけど、歴史的な経緯で実際にはちょっと違っていたらしい。
これを直すにはOTFパッケージを使うとのこと。
(このパッケージ自体は名前の通りOpenTypeフォントを使うためのもの)

また、オプションでjis2004を指定すると、JIS2004字形になる。
いくつかのフォントの字形が新しく定められたものになる。

あと、オプションでdeluxeを指定すると、使えるシリーズ(太さ)が増えたり丸ゴシック(mg)が使えたりするとのこと。
このオプションを指定しなかった場合、太字は全部ゴシック体にされてしまうのだけど、これをしていすることで太字の明朝体が使えるようになる。

なので、和文では基本的には以下のようにしておいた方がよさそう:

\usepackage[deluxe,jis2004]{otf}

ヒラギノフォントを使う設定

macOSの場合ヒラギノフォントがバンドルされているので、せっかくだからこれを使いたいところ。
なお、PDFに埋め込んで再配布してもライセンス的には問題ないっぽい。
(単体で再配布するのはダメ。あと埋め込まれたものを取り出して単体で使うのもおそらくダメ)

以下を参考にして使えるようにしてみた:

まずはTLContribから必要なパッケージをインストール:
(TLContribというのはTeX Liveとは別管理されているリポジトリらしい)

$ sudo tlmgr repository add http://contrib.texlive.info/current tlcontrib
$ sudo tlmgr pinning add tlcontrib '*'
$ sudo tlmgr install japanese-otf-nonfree japanese-otf-uptex-nonfree ptex-fontmaps-macos cjk-gs-integrate-macos

そしてリンクを作成する:

$ sudo cjk-gs-integrate --link-texmf --cleanup
$ sudo cjk-gs-integrate-macos --link-texmf
$ sudo mktexlsr

なお、リンクというのはフォントのシンボリックリンクのことだと思う。
おそらくTeX関連のファイルが入っているtexmf以下にフォントのシンボリックリンクを作ってるのだと思われる。
あとmktexlsrはファイル一覧のキャッシュの更新。

最後にヒラギノフォントを使うようにmapファイルを更新する。

$ sudo kanji-config-updmap-sys --jis2004 hiragino-highsierra-pron

ちなみに、更新前の状態は以下:

$ sudo kanji-config-updmap-sys status
CURRENT family for ja: ipaex
Standby family : hiragino-highsierra
Standby family : hiragino-highsierra-pron
Standby family : ipa
Standby family : toppanbunkyu-highsierra

IPAexフォントが埋め込まれる設定になっていたっぽい。

更新後の状態は以下:

$ sudo kanji-config-updmap-sys status
CURRENT family for ja: hiragino-highsierra-pron
Standby family : hiragino-highsierra
Standby family : ipa
Standby family : ipaex
Standby family : toppanbunkyu-highsierra

ヒラギノフォントが指定されていることが分かる。

設定したこと

自分がした設定をまとめると以下:

  • Latin Modernを使うようにした
  • OTFパッケージを使うようにした
  • ヒラギノフォントをPDFに埋め込むようにした

上2つについては、以下のようにソースに書いた:

% フォント関連
% Computer ModernのかわりにLatin Modernを使う
\usepackage[T1]{fontenc}
\usepackage{lmodern}
% OTFパッケージを使う
\usepackage[deluxe,jis2004]{otf}

また、一番下については前述の通りの設定を行なった。


宣伝です。
気になった人はチェックをお願いします!

今日はここまで!

TeXで同人誌を作ってみた。(ビルド環境構築)

f:id:yamaimo0625:20190918075457j:plain

今日からは \TeXを使って学んだことをまとめていく。

なぜ \TeXを使ったか

文章が主体の同人誌を作る場合、組版に使えるソフトはいくつか候補がある。

特に有力なのがRe:VIEW
実績が多く、また同一ソースから複数のファイル形式に出力できる魅力がある。

ただ、以下のようなことからRe:VIEWではなく \TeX\LaTeX)を使うことにした:

1.  \TeXの勉強がしたい

そう、何だかんだでこれが大きい。
勉強で作っている部分もあったので、いろいろ試したかった。

『哲学散歩道』も \TeXで作ったんだけど、デザイン周りは全然触れてなくて、ほぼ素の出力になっている。
なので、 \TeXで本のデザインってどうやったらいいんだろうという疑問がずっと残ってた。
例えば、以下のようなもの:

  • どうやって目次をデザインするのか
  • どうやって見出しをデザインするのか
  • どうやってページレイアウトをデザインするのか
  • トンボや隠しノンブルはどうやって入れればいいのか
  • 断ち切りまで伸ばすのはどうすればいいのか

これらの疑問を解消したくて、 \TeXでの組版にチャレンジしてみた。
実際、いろいろ学べて、今日からの記事はそこで学んだことを忘れないようにするためのもの。

2.  \TeXにメリットがあった

理系だったので、卒論、修論、あるいはレポートで、何だかんだで \TeXは使ってきた。
こうやってブログを書くときにも数式は \TeX記法を使って書いてるし。
なので、これまでにも \TeXにはけっこう触れていて、慣れている部分が多い。
そういう意味で、まったく知らないRe:VIEWを使うよりも心理的障壁は低かったりする。

また、数学の同人誌なので、数式がそれなりに出てくる。
もちろんRe:VIEWでも数式は書けるけど、数式を書くことが分かっているなら、最初から \TeXを使った方が素直と言える。

3. Re:VIEWに不安があった

これもけっこう大きかった。

Re:VIEWはPDFへの出力のバックエンドとして \TeXを使っているので、何か問題があったときには中間出力された \TeXのソースや、あるいはそのソースを出力したRubyのソースと戦うことになる。
何も問題がなければ杞憂ですむのだけど、何かあったときにはその対処コストがちょっと無視できないレベルで大きいのがかなり気になった。

そして、もし問題が起きて結局 \TeXの勉強をしないといけないのなら、最初から素直に \TeXの勉強をした方がいいよね、と。
 \TeXの勉強をしないといけないかもしれないという不安を抱えながら進めるより、 \TeXの勉強をすることを最初からスケジュールに入れておいた方が心理的に安心できる。

実際、Re:VIEWまわりで謎の挙動をして困ったという話はチラホラ見かけた・・・

まぁ、リスクに対してメリットが遥かに大きいから、普通はRe:VIEWを使った方がいいとは思うけど。

 \TeXのインストール

これはRe:VIEWを使う場合も必要。
TeX Wikiを参考にMac TeX 2019(TeX Live 2019にmacOS用のソフトがバンドルされてる)をインストール。

ビルド環境の構築

以下のような感じでビルド環境を作った:

  • \TeXにはupLaTeXを使用
  • 索引作成にはupmendexを使用
  • PDF出力にはdvipdfmxを使用
  • ビルドツールにMakeとlatexmkを使用
  • ドキュメントクラスにBXjsclsパッケージのbxjsbookを使用

upLaTeXは \TeXに日本語用の拡張が入ったpTeX(Publishing TeX)がUnicode対応したupTeXにさらにe-TeX拡張(レジスタ増加など)の入ったe-upTeXでLaTeXフォーマットを読み込むようにしたもの。
何を言ってるのか分からないと思うけど、自分もそう思う。
 \TeXの違法建築っぷりはヤバい。

upmendexは同様にmendexという索引作成ツールがマルチバイト文字に対応したもの。

参考文献の管理にはBibTeXというツールがあり、それをマルチバイト文字に対応させたupBibTeXというものがあるのだけど、今回は使ってない。
BibTeXを使っても使わなくてもあまり手間が変わらなかったのと、ちょっと凝ったことをしたかったのが理由。

latexmk

 \TeX \LaTeX)では相互参照や目次作成のために複数回コマンドを実行しないといけないのだけど、何度もコマンドを打つのは面倒なので簡易的なビルドツールが使われることが多い。
今まではptex2pdfというツールを使ってたのだけど、調べるとlatexmkというツールを使った方がいいようだった。

上記の記事などを参考に以下の.latexmkrcを用意した:

#!/usr/bin/env perl

# Settings for latexmk.
# See https://konn-san.com/prog/why-not-latexmk.html

$latex          = 'uplatex -halt-on-error';
$bibtex         = 'upbibtex';
$dvipdf         = 'dvipdfmx %O -o %D %S';
$makeindex      = 'upmendex %O -g -s index.ist -o %D %S';
$max_repeat     = 5;
$pdf_mode        = 3; # generates pdf via dvipdfmx

最終的にはupBibTeXは使わなかったのだけど、そのまま残してある。
あと、upmendexのオプションで指定している-s index.istはスタイルファイル(これは \TeXのスタイルファイルとは別物)の指定で、索引の出し方を設定するスタイルファイルとしてindex.istを使うということ指示している。
index.istの内容については後日)

latexmkの使い方は、以下:

$ latexmk <対象のTeXソース>

生成物の削除なども行える:

# 生成物をすべて削除
$ latexmk -C

# 中間生成物をすべて削除
$ latexmk -c

Make

latexmkを直接叩いてもよかったんだけど、コマンドを覚えるのもなんだったのでMakeを使った。
Makeを使えばコマンドを覚えてなくてもいいし、あとでコマンド変更の差分を見たりすることが出来る。

Ω<つまりMakeはいにしえのDevOps, Infrastructure as Codeだったんだよ!
ΩΩΩ<な、なんだってー!?

というわけで、以下のようなMakefileを用意した:

.PHONY: all build book ebook clean clean-mid open eopen

BOOK = book.pdf
EBOOK = ebook.pdf
PDF = $(BOOK) $(EBOOK)

COMMON_SOURCE = <includeされるTeXソース> ...

all: build

build: $(PDF)

book: $(BOOK)

ebook: $(EBOOK)

%.pdf: %.tex
  latexmk $<

$(PDF): $(COMMON_SOURCE)

clean:
  latexmk -C

clean-mid:
  latexmk -c

open: book
  open $(BOOK)

eopen: ebook
  open $(EBOOK)

book.texは印刷用の \TeXソース、ebook.texは電書用の \TeXソース。
入り口を2つ用意することで、同一ソースから印刷用と電書用のPDFを両方とも生成できるようにしている。
(各ファイルから共通ソースをincludeしてる)

そして、latexmk自体は指定されたソースが依存しているソースのタイムスタンプまで調べてくれるようなのだけど、フロントエンドとしてMakeを使うとそこまで感知できないので、COMMON_SOURCEとして列挙して依存関係を追加するようにしている。
$(PDF): $(COMMON_SOURCE)の行がそれで、Makeはターゲットとソースの対のあとにコマンドが続かない場合、依存関係だけを追加する)

あとはcleanで生成物の削除、clean-midで中間生成物の削除、openで印刷用PDFのオープン、eopenで電書用PDFのオープンが出来るようにしてある。
(latexmkでPDFのオープンとか開いたままの更新とかあるようなのだけど、実際に試してみると使い勝手がめちゃくちゃ悪かった(たしか端末が対話状態のような感じになってCtrl-Cを押さないと制御が戻ってこなくなったりしたはず)ので、ビルドだけで終わるのか、PDFを開くところまでやるのかなどをコントロールできるようにした)

.gitignore

生成物はバージョン管理の対象から外したいので、.gitignoreに無視するファイルを追加:

*.fls
*.fdb_latexmk
*.aux
*.out
*.toc
*.idx
*.ilg
*.ind
*.log
*.dvi
*.pdf

*.fls*.fdb_latexmkはたしかlatexmkで出力されるファイル。
*.aux*.log*.dvi*.pdfあたりは \TeX(とdvipdfmx)で出力される典型的なファイル。
*.tocは目次のための出力。
*.idx*.ilg*.indは索引のための出力。
*.outは電書のためにページ内リンクをつけると出力される。

bxjsbookドキュメントクラス

ドキュメントクラスとしては、BXjsclsパッケージのbxjsbookを使った。
昔はjsclassesを使うのが普通だったけど、最近はupLaTeX以外でも使えるようにしたBXjsclsを使った方がいいみたい。

上記の記事などを参考にして、book.texおよびebook.texは次のようにした:

\documentclass[autodetect-engine,dvipdfmx-if-dvi,ja=standard,a5paper]{bxjsbook}

% 設定など

\begin{document}

% 本文など

\end{document}

これで最低限のビルド環境は整った感じ。


宣伝です。
気になった人はチェックをお願いします!

今日はここまで!