いものやま。

雑多な知識の寄せ集め

TeXで同人誌を作ってみた。(隠しノンブル)

f:id:yamaimo0625:20190918075457j:plain

今日は隠しノンブルの出力について。

なお、印刷用と電書用の分離については以下を参照:

隠しノンブルとは

まずノンブルというのはページ番号のこと。

ただ、ページ番号は途中までi, ii, ... として、途中でリセットして1, 2, ... としたりすることがある。
これだと全体を通してのページ番号が分からないので、印刷所は製本で困ってしまう。

そこで入れるのが隠しノンブル。
読者には見えない位置(例えば紙を糊付けする位置)に通しのページ番号を入れておく。
そうすれば印刷所も安心して作業を行える。

ちなみに、ネット上の情報だと断ち切りの外でもOKみたいに書かれていることがあるけど、実際には裁断後に残ってないとダメ。
あと、トンボと違って(隠し)ノンブルは必須と思っていいと思う。
ねこのしっぽさんも日光企画さんも「通しでノンブルを入れるように」とされている。
(隠しである必要はない)

自分の場合はページスタイルのフッタを使って隠しノンブルを出すようにした。

ページスタイルの変更

フッタを使って隠しノンブルを出すことにしたので、まずページスタイルの変更が必要。

以下のようにして仕込みを入れておいた:

これで\oddNombre\evenNombreを適切に再定義すれば隠しノンブルが出力される。

通しのページ番号の取得

\oddNombre\evenNombreの再定義で必要となるのが、通しでのページ番号。
普通にページ番号を出力する\thepageだと通しでのページ番号は得られない。

そこで使ったのがpagesltsパッケージ。
このパッケージを使うと\theCurrentPageで通しでのページ番号を取得できる。

このパッケージは使い方にちょっとクセがあって、以下のようにする:

\documentclass[...]{...}

% パッケージの指定
\usepackage{pageslts}

\begin{document}

% ページカウントのスキーム設定
\pagenumbering{arabic}

% ここに本文

\end{document}

このスキーム設定がないとエラーになる。
ここでarabicとしているので、通しのページ番号は普通の数字(アラビア数字)で出力される。

出力コマンドの定義

あとは\oddNombre\evenNombreの定義。
以下のようにした:

% 隠しノンブル
\newcommand{\nombre}{{\tiny \textcolor[gray]{0.3}{\theCurrentPage}}}
\renewcommand{\oddNombre}{\rlap{\kern-18.4mm\nombre}}
\renewcommand{\evenNombre}{\rlap{\hskip\textwidth\hbox to 18.4mm{\hfil\nombre}}}

まず\nombreは小さく薄い文字で現在のページ番号を出力するよう定義したコマンド。
薄くするためにcolorパッケージの\textcolorを使っている。

そして、\rlapを使うことでうまいこと出力している。
このコマンドは「カーソルを今の位置に止めたまま引数の内容を出力する」というもの。
(ちょっとややこしい・・・)
奇数ページならカーソルをフッタの開始位置に止めたまま-18.4mmほど戻った場所に現在のページ番号を出力している。
偶数ページも同様にカーソルをフッタの開始位置に止めたままテキスト幅進めて18.4mmの箱を用意してその箱の中で右寄せになるように現在のページ番号を出力している。
このあたりは \TeXのボックスについての知識がちょっと必要・・・
(でもよくよく考えると、フッタに隠しノンブルしか出力してないから\rlap使った意味あまりないような・・・)

まぁ、何はともあれ、これで隠しノンブルの出力が出来た。


宣伝!
『Math Poker Girl』はBOOTHで販売中!

今日はここまで!

TeXで同人誌を作ってみた。(トンボ)

f:id:yamaimo0625:20190918075457j:plain

今日は昨日の記事で省略したトンボの出力について。

トンボとは

そもそもトンボって何?という話。

トンボというのは裁断の目印となるマークのこと。

紙の大きさとピッタリ同じデザインだと、紙の裁断が少しズレると微妙な空白が入ってしまったりする。
それを防ぐために、普通は紙のサイズよりも3mmほどはみ出すようにデザインし(「断ち切り」という)、裁断が多少ずれてもおかしくならないようにする。
そして、そうやってはみ出したデザインになっているので、ここで切るという目印が必要で、それを示すのがトンボ。

ちなみに、「ねこのしっぽ」さんでは基本的にはトンボは不要みたい。

まず断ち切りが不要なデザインの場合はピッタリのサイズで入稿すればいいみたい。
そして断ち切りが必要な場合も断ち切り分(上下左右に3mmずつ)原稿サイズを大きくするだけでよく、トンボは不要(これがデフォルトの入稿形式)。
もちろん、トンボを入れての入稿もOK。
(トンボは不要と書かれていたので気になって問い合わせて、トンボがあってもOKという回答をもらった)

ただ、印刷所さんによってはトンボが必須ということもあるので、入れる方法は押さえておいた方がいい。

gentombowパッケージ

トンボを出力するにはgentombowパッケージを使えばいい。

ただし!
実はいろいろ罠がある・・・

最初に解答だけ書いておくと、以下のようにする:

% トンボ
% geometryパッケージよりあとにした方がおそらく安全
% voffset、hoffsetは絶対にいじらない
\usepackage[pdfbox]{gentombow}
\usepackage{bounddvi}

以下はいろいろな罠についての説明。

tombowオプション

ドキュメントクラスのオプションでtombowオプションがあって、これでトンボが出せるんじゃね?と思うんだけど、これがまず大きな罠。

bxjsclsのドキュメントには次のように書かれている:

■トンボオプション
トンボ(crop marks)を出力します。(省略)
取りあえず、pTeX系の場合に限り、JSクラスのトンボ関連のコードをそのまま活かしておく。
正常に動作する保証はない。

Oh...

実際のところ、後述するpaper-sizeの設定もちゃんとやれば動くとは思うんだけど、使わない方がいいと思う。

paper-sizeの設定

最初、

\usepackage[pdfbox]{gentombow}

とだけしてて全然うまく動く気配がなくて、なんでだろうとなってたんだけど、原因はpaper-sizeの設定だった。

トンボを出力する場合、印刷したい紙のサイズと実際に出力される紙のサイズが異なる
例えば、A5で印刷したい場合、A5で印刷されるエリアのさらに外側にトンボが出力されるので、紙のサイズは一回り大きいB5である必要がある。

じゃあ、それをどうやって \TeXに教えればいいのか?

実は、教える手段がない。
というか、そもそも \TeXに「用紙サイズ」という概念は存在しない・・・
\paperwidth\paperheightという長さは存在するけど、これはあくまで他の長さを計算するためのもので、それで紙のサイズが決まるわけではなかったりする。

けど、それじゃ困るので、特別な命令を使うことでDVIファイルに情報を出せるようになっている。
\AtBeginDvi{\special{paper-size=<width>,<height>}}とすることで用紙サイズの情報(paper-size)がDVIに埋め込まれる。

これをやってくれるのがbounddviパケージ。
gentombowパッケージによっていい感じに変えられた用紙サイズをDVIファイルに出力してくれる。

なお、レイアウト調整によく使われるgeometryパッケージもこのpaper-sizeの設定をやってくれるみたい。

じゃあ、paper-sizeの設定が複数あった場合はどうなるのか?

これは一番最後にされた指定が使われるっぽい。
なので、bounddviパッケージを読み込んだあとにgeometryパッケージを読み込むと、うまくいかない可能性がある
(たぶん大丈夫だとは思うけど・・・)

voffset、hoffset

 \TeXでレイアウトの原点となる位置は\voffset\hoffsetという長さによって決められていて、デフォルト値はどちらも0になっている。
けど、なぜか原点は紙の左上から\voffset + 1inch\hoffset + 1inchの位置となっている
マジでなんで1インチ足してるんだ・・・

この謎仕様に対処するため、\voffset\hoffset-1inに設定するというのを見かけたりする。
そうすれば紙の左上がちょうど原点になると。

それダメ!

とにかく\voffset\hoffsetは0のままにしてレイアウトを考えて、変更するなら\topmargin\oddsidemarginを変える。
あるいはgeometryパッケージを使う方がいい。

gentombowパッケージは紙のサイズを一回り大きくしてこの\voffset\hoffsetをその分増やすことで紙面のレイアウトは保ったまま外側にトンボを出力できるようにしている。
なので\voffset\hoffsetをいじるとちゃんと動いてくれない。


ーーと、そんな感じで罠をくぐり抜ければ、最初に書いた解答で問題なく出力できる。

宣伝!
『Math Poker Girl』はBOOTHで販売中!

今日はここまで!

TeXで同人誌を作ってみた。(印刷用/電書用の分離)

f:id:yamaimo0625:20190918075457j:plain

今日は印刷用と電書用でソースを分離した話について。

印刷用と電書用での要件の違い

印刷用のPDFと電子書籍用のPDFでは、必要な要件が異なってくる:

  • 印刷用
    • トンボが必要
    • 隠しノンブルが必要
  • 電子書籍
    • 表紙/裏表紙の画像が必要
    • ページ間のリンクが必要

なお、一方で必要となっているものは、他方では不要なことに注意。
例えば電子書籍用のPDFにトンボが出ていたりするととても煩わしい。

そこで、どちら用のPDFなのかにあわせて設定などを変える必要がある。

一つの方法はCプロプロセッサを使うこと。
-Eオプションを使えばプリプロセスだけ実行することが出来る。
それで#ifdefなどを使ってコンパイルスイッチすれば切り替えられそう。
ただ \TeXのソースでプリプロセスが問題なく動くかはちょっと怪しい・・・

自分がとった方法は印刷用の \TeXソースと電子書籍用の \TeXソースを分けて、共通するソースはインクルードして利用し、違う部分だけそれぞれのソースで定義する(あるいは定義の上書きをする)という方法。
これについては後述。

なお、Re:VIEWの場合は設定ファイルを複数用意し、それぞれの設定ファイルに対してビルドを実行することで、印刷用と電子書籍用の出力を分けているみたい。

ファイル構成

共通する部分は印刷用と電書用とで二度書きたくないから独立したファイルに書き出してインクルードして利用するようにした。
なので以下のようなファイル構成になった:

共通/独立 ファイル名 説明
独立 book.tex 印刷用のソース
独立 ebook.tex 電書用のソース
共通 metadeta.tex タイトル、著者名
共通 settings.tex 共通の設定
共通 contents.tex 本文の内容
共通 chapter1.tex 第1章
共通 ... ...

Makefileについては以下も参照:

印刷用のソース

そして印刷用のソース(book.tex)は以下のようにした:

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

% メタデータ
\input{metadata}

% 各種設定
\input{settings}

% トンボの設定
...

% 隠しノンブルの設定
...

\begin{document}

% 本文
\input{contents}

\end{document}

共通設定を読み込んで、それに追加するようにトンボと隠しノンブルの設定を行なっている。
(chapter1.texなどはcontents.texからincludeされている)

電書用のソース

これに対して電書用のソース(ebook.tex)は以下:

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

% メタデータ
\input{metadata}

% 各種設定
\input{settings}

% ページいっぱいの画像を入れるための設定
...

% 目次や索引、参照にリンクをつけるための設定
...

\begin{document}

% 表紙 1, 2を出力
...

% 本文
\input{contents}

% 表紙 3, 4を出力
...

\end{document}

こちらは共通設定を読み込んだあとに表紙を出力するための設定やリンクの設定をして、それと本文の前後で表紙の出力を行なっている。


印刷用と電書用の分離については以上で、...で省略した部分については明日以降で。

宣伝!
『Math Poker Girl』はBOOTHで販売しているのでよろしくお願いします!

今日はここまで!

TeXで同人誌を作ってみた。(索引)

f:id:yamaimo0625:20190918075457j:plain

昨日に引き続き、同人誌制作の振り返り。
今日は索引の作り方について。

なお、 \TeX \LaTeXは区別せずに扱っている。
参考にしたのは以下:

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

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

あと、索引から参照されるべき単語については以下を参照:

索引の作り方

索引を作るにはmendexなどを使う。
自分はupmendexを使用した。

そして以下のようにする:

  1. 索引のスタイルファイルを用意する
  2. makeidxパッケージを追加して\makeindexを呼び出す
  3. \indexで参照されるべき単語にインデックスを追加する
  4. \printindexで索引を出力する

索引のスタイルファイル

索引をどう出力するか指定するためのスタイルファイル(拡張子は.ist)を用意してupmendexなどに引数で渡す。
(latexmkを使っている場合、.latexmkrcにオプションを書いておく)

スタイルファイルに何を書けるのかは以下のようにオンラインマニュアルを見れば分かる:

$ man upmendex

自分は以下のようなスタイルファイルをindex.istという名前で用意した:

% 頭文字の出力
lethead_flag 1      % 頭文字の出力フラグ (0: 出力しない, -1: 小文字出力, 1: 大文字出力)
letter_head  1      % 日本語の頭文字の出力フラグ (0: 出力しない, 1: カタカナ, 2: ひらがな)
lethead_prefix "\\idxgrphead{"   % 頭文字の前につける文字列
lethead_suffix "}"   % 頭文字の後につける文字列

% エントリと最初のページ番号との間の区切り文字列 (0: 主, 1: サブ, 2: サブサブ)
delim_0 "\\quad "
delim_1 "\\quad "
delim_2 "\\quad "

頭文字というのは「A」とか「あ」とかの見出し。
lethead_prefixlethead_suffixを指定しているけど、これで\idxgrphead{あ}のように呼び出されることになるので、\idxgrpheadを定義することで頭文字のスタイルを変えることが出来るようにしている。

「主」「サブ」「サブサブ」というのは、索引を入れ子にすると関係してくる。
(例えば「オイラーの公式」「オイラー数」を入れ子にすると、主:「オイラー」、サブ:「ーーの公式」「ーー数」みたいになる)

他にもページ番号間の区切り文字を指定したりなども出来る。

インデックスを追加するマクロ

インデックスの追加は以下のように\index命令を使う:

...ショーダウン\index{ショーダウン}というのは...

漢字の読みも指定する場合は以下のようにする:

...期待値\index{きたいち@期待値}とは...

ただ、見ての通り基本的には同じ単語をその場で使ってるので、\indexで索引を追加するのは二度手間・・・
そこで\addindex\addindexyomiというマクロを用意した:

% インデックスの追加
\newcommand{\addindex}[1]{#1\index{#1}}
\newcommand{\addindexyomi}[2]{#1\index{#2@#1}}

これを使えば次のように書ける:

...\addindex{ショーダウン}というのは...
...\addindexyomi{期待値}{きたいち}とは...

索引のデザインのカスタマイズ

あとは索引のデザインのカスタマイズ。

まずはスタイルファイルに書いていた\idxgrpheadを定義しておく:

% 索引のグループの見出し
\newcommand{\idxgrphead}[1]{% #1: 頭文字
    \par%
    \vspace{\baselineskip}%
    \hfil{\bfseries #1}\hfil%
    \vspace{\baselineskip}\par}

上下に一行分の空きを入れて中央寄せした感じ。

あと参考文献と同じように目次に追加されるときに\protect\numberline{\null}が入るようにした:

\makeatletter

%%% 索引のスタイルをカスタマイズ

% 目次でのインデントを合わせる
\renewenvironment{theindex}{% 索引を3段組で出力する環境
    \if@twocolumn
      \onecolumn\@restonecolfalse
    \else
      \clearpage\@restonecoltrue
    \fi
    \columnseprule.4pt \columnsep 2\jsZw
    \ifx\multicols\@undefined
      \twocolumn[\@makeschapterhead{\indexname}%
      \addcontentsline{toc}{chapter}{\protect\numberline{\null}\indexname}]%ここを修正
    \else
      \ifdim\textwidth<\fullwidth
        \setlength{\evensidemargin}{\oddsidemargin}
        \setlength{\textwidth}{\fullwidth}
        \setlength{\linewidth}{\fullwidth}
        \begin{multicols}{3}[\chapter*{\indexname}%
        \addcontentsline{toc}{chapter}{\protect\numberline{\null}\indexname}]%ここを修正
      \else
        \begin{multicols}{2}[\chapter*{\indexname}%
        \addcontentsline{toc}{chapter}{\protect\numberline{\null}\indexname}]%ここを修正
      \fi
    \fi
    \@mkboth{\indexname}{}%
    \plainifnotempty% \thispagestyle{plain}
    \parindent\z@
    \parskip\z@ \@plus .3\p@\relax
    \let\item\@idxitem
    \raggedright
    \footnotesize\narrowbaselines
  }{
    \ifx\multicols\@undefined
      \if@restonecol\onecolumn\fi
    \else
      \end{multicols}
    \fi
    \clearpage
  }

\makeatother

章まで出すとかいう余計なことをしなければこんな修正は不要なんだけどねぇ(^^;


索引の作り方については以上。

ちなみに『Math Poker Girl』はBOOTHで販売しているのでよろしくお願いします!

今日はここまで!

TeXで同人誌を作ってみた。(参考文献)

f:id:yamaimo0625:20190918075457j:plain

技術書典7にサークル参加したことの振り返りも終わったので、同人誌制作の振り返りへ。
今日は参考文献の一覧の作り方について。

なお、 \TeX \LaTeXは区別せずに扱っている。
参考にしたのは以下:

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

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

参考文献の一覧を作る2つの方法

 \TeXで参考文献の一覧を作る場合、2つの方法がある:

  • thebibliography環境を使って参考文献を手動でリストアップする
  • BibTeXを使い\bibliographyによって参考文献を半自動で出力する

参考文献のデータベースがある場合、後者を使えばいろいろ便利なのだけど、そうでない場合はあまり後者を使うメリットはないと思う。
特に今回は後者だと細かい調整が大変そうだったので、前者の方法を使った。

thebibliography環境の使い方

thebibliography環境は以下のように使う:

\begin{thebibliography}{<n>}
    \bibitem{<refname>} <refitem>
    ...
\end{thebibliography}

<n>は文献番号の数字の最大幅と同じ幅の文字列。
何言ってるんだという感じだけど、基本的には以下のようにしておけばいい:

<n> 説明
9 文献番号の数字は最大1桁(1〜9)
99 文献番号の数字は最大2桁(1〜99)
999 文献番号の数字は最大3桁(1〜999)

<refname>は参照するときに使う名前。
例えば\cite{<refname>}とすると[<文献番号>]と文献への参照が入る。

<refitem>は参考文献の情報。
著者とか、本のタイトルとか、出版社、出版年などの情報を書く。
ここは文献の種類によってスタイルがあるようなので、それを守って書くといい。
自分の場合、試しにBibTeXで出力してみて、その出力を真似してみた。

書籍の場合だと、以下のような感じ:

<著者名>. \newblock 『<本のタイトル>』. \newblock <出版社>, <出版年>.

Webページは以下のようにした:

<Webページ名>. \newblock <URL>.

参考文献での小見出し

参考文献もいろいろとジャンルに分けたいことがある。
今回の場合、ポーカー関連の参考文献と、数学関連の参考文献、それにWebページに分けたかった。

そこで本を参考に\bibsectionという命令を用意した:

\makeatletter

% 参考文献で小見出しを出せるようにする
\newcommand{\bibsection}[1]{% #1: 小見出し
    \par \if@newlist\else \medskip \fi
    \item[]% 1項目分、間を開ける
    \item[]\noindent\vspace{\baselineskip}\hskip-\@totalleftmargin {\Large\bfseries #1}\par}

\makeatother

thebibliography環境は実質リストなので、小見出し用のアイテムを追加する命令を定義している感じ。

参考文献の目次での見出しの修正

TeXで同人誌を作ってみた。(目次デザイン) - いものやま。で書いたとおり、章番号なしの章を目次に追加するときに\protect\numberline{\null}をタイトルの前に足すことでインデントの位置を揃えていた。

thebibliography環境を使うと「参考文献」という章番号なしの章が勝手に開始されるので、そのままだとインデントの位置が揃わなくなる。

そこで、以下のように修正してインデントの位置を揃えるようにした:

\makeatletter

%%% 参考文献のスタイルをカスタマイズ

% 目次でのインデントを合わせる
\renewenvironment{thebibliography}[1]{%
  \@jsc@warnoldfontcmdexceptiontrue
  \global\let\presectionname\relax
  \global\let\postsectionname\relax
  \chapter*{\bibname}\@mkboth{\bibname}{}%
  \addcontentsline{toc}{chapter}{\protect\numberline{\null}\bibname}% ここを変えた
   \list{\@biblabel{\@arabic\c@enumiv}}%
        {\settowidth\labelwidth{\@biblabel{#1}}%
         \leftmargin\labelwidth
         \advance\leftmargin\labelsep
         \@openbib@code
         \usecounter{enumiv}%
         \let\p@enumiv\@empty
         \renewcommand\theenumiv{\@arabic\c@enumiv}}%
   \sloppy
   \clubpenalty4000
   \@clubpenalty\clubpenalty
   \widowpenalty4000%
   \sfcode`\.\@m}
  {\def\@noitemerr
    {\@latex@warning{Empty `thebibliography' environment}}%
   \endlist}

\makeatother

もうちょっとスマートに修正できるといいんだけどねぇ(^^;


参考文献の一覧の作り方については以上。

ちなみに『Math Poker Girl』はBOOTHで販売しているのでよろしくお願いします!

今日はここまで!

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

f:id:yamaimo0625:20190621155528j:plain

昨日は当日の様子を振り返った。

今日はいろいろ気づいたことをまとめてみたい。

チェック数の推移

まずはチェック数の推移に関して。

最初は毎日チェックしていたわけではないので、大雑把な数字。
途中からは大体寝る前(23時くらい)の数字のはず。

日付 曜日 チェック数 増分
9/1 23 -
8 26 +3
9 29 +3
12 33 +4
13 34 +1
14 36 +2
15 39 +3
16 42 +3
17 43 +1
18 56 +13
19 57 +1
20 62 +5
21 72 +10
22 90 +18

見ての通り、ビックリするほど増加が少なかった。

@yagitchさんの9/1の、

というツイートを見て「おっ、これなら最終的にチェック数200くらいいくのかな?」と思ってたら、そのあと全然伸びなくて、9/8だと

と「これは150も怪しいんじゃないかなぁ」くらいになり、9/15で

と「これはギリギリ100いくかいかないか」という感じ。

というツイートが9/15にあったけど、自分の場合は最終的にそこから2倍強といったところだった。

前日、当日の伸びもそこまで凄いものではなく、結局90止まり・・・

運営は否定してるけど、やはりこれだけサークル数が多くなってくると、一覧で見たときに上の方にあるかどうかがかなり影響してるんじゃないかなという気がしてる。
自分は「え23C」でだいぶ上の方にあったので最初の方にチェック数がそれなりに増え、そのあとは最初の増え方と比較して増加が鈍かったんじゃないかなぁ、と。
なので、最初の頃の予測を大きく外れることになったのではないかなと思う。

そして、ページ数が多かったので締め切りは9/11(水)で、念のために9/10(火)には入稿してたので、「うーん、分からんけど、これからチェック数が伸びることを信じて200刷るか。そうすれば完売するとかもないだろうし・・・いや、300刷っても原価回収するのに必要な冊数は10冊強しか違わないなら、300でもいいかな」とか考えた自分はホントになんだったのか・・・

そのあとチェック数が全然伸びず、最終的には90にしかならなくて真っ青になったのは言うまでもなく。。。
あたしって、ほんとバカ

ちなみに、18日にグッとチェック数が増えてる理由は謎。
Cホールの推し祭りがあったのは17日・・・(推し祭りでは全然増えなかった)

売り上げ

そして、実際にどれだけ売り上げたのかというと、69冊(書籍+ダウンロードカードのセット)・・・
チェック数にも届かなかった・・・

一応、印刷費が約14万円で、1セット2,000円で売っていたので、ギリギリ印刷費は回収できた感じ。
ただ、参加費や交通費、備品を買う経費、それに宅急便で搬出した費用などを考えると完全に赤で回収しきれてない。
工数も考えればタダ働きもいいところ・・・(まぁこれは仕方ないところはある)

幸い、内容が数学なので陳腐化することはなく、それこそ5年後や10年後、あるいは(実質的に中身は論文でおそらく世界初の仕事なので)30年後にも意味のあるものだから、息長く売っていくことは出来るけど。
とはいえ、あの重たい本を運ぶのはツラい・・・

テーマとページ数と値段

テーマ選びに関しては、一度振り返りをしてる:

これに加えて気づいたことがあったので、それについて。

今回の本では、ポーカーと数学という2つのテーマを追っていた。

自分は「ポーカーに興味のある人が数学にも興味を持ってくれたら嬉しいし、数学に興味のある人がポーカーにも興味を持ってくれたら嬉しいな」と「OR」の効果を狙ってた。
そのために、1章使ってポーカーのルールから説明したし、数学も必要最低限な内容を道具として使うに留まっている。

f:id:yamaimo0625:20190926180103p:plain

けど、実際には「AND」の対象ーーすなわちポーカーにも数学にも興味のある人しか手に取ってくれなかった。

f:id:yamaimo0625:20190926180138p:plain

ポーカーに興味はあるけど数学に興味がない人は「数学」となった時点で「じゃあいいや」となってしまったし、逆もまた然りだった。

読む対象を増やすつもりでテーマを複数にしたのに(そして実際、片方が初心者でも読むことが出来るように書いている)、それによって逆に読む対象を狭めてしまった。
これが大きな失敗だった。

複数のテーマを採用すると、ターゲットは「OR」ではなく「AND」になる。

これが自分にとっては大きな気づきだった。
当たり前と言えば当たり前だけど・・・

なので、基本的にはテーマは1つに絞った方がいい
もし複数テーマを扱うなら、その場合は「AND」を想定した作りにする

今回の『Math Poker Girl』なら、以下のどちらかにすればよかったと思う:

  1. テーマをポーカーに絞ってルール説明とどこで遊べるのかの具体的な説明や実際に遊んできたレポートなどにする
  2. 「AND」を想定してポーカーのルール説明などは省いてポーカー界の常識がどれだけ根拠がないものかだけを示す

こうすると何がうれしいのかというと、

  1. ページ数が少なくなる
    「OR」のための説明が不要になるので、ページ数を抑えてピンポイントのターゲットに説明できる。
  2. 値段が安くなる
    ページ数が少なくなれば、当然値段も安くなる。
    値段が安くなれば、手に取ってもらいやすくなる。
  3. 読者が本を取捨選択することが可能になる
    複数テーマが1冊にまとまっていると、それを選ぶという選択しかない。
    けど、それが例えば2冊に分かれていれば、片方だけ読むことも可能だし、両方読むことも可能になる。

なので、「OR」のターゲットに本を届けたい場合も、本を2冊に分けて、それぞれでテーマを絞った方がいい。

ページ数が少なくなれば工数も減らせるし、重たさも減るし、著者にとっても嬉しいことが多い・・・
「あれもこれも説明が必要だろう」とついつい説明を盛り込んでしまう「OR」の誘惑を振り切る勇気が必要。
もし説明が必要だと思うなら、それは別の本に分ける。

エレベーターピッチ

エレベーターピッチは「エレベーターで偶然偉い人にあったときに、短いスピーチでプレゼンしてアピールする」ということ。
そこから転じてアジャイル開発手法では「短い言葉での製品のウリを説明する」ということが行われる。
そうすることでプロダクトの価値が明確になるから。

で、なんでここでその話が出てくるかというと、短い時間にその本のウリを説明するのってめちゃくちゃ重要だよなと自分自身が買い物してて思ったから。

店番をお願いしてるので出来るだけ短い時間で回らないといけないわけで、そうするとやはり「キーワード」が目に入ってくる。
圏論」とか「グレブナー基底」とか「CSS組版」とか。
そういったキーワードで手に取るかどうかの判断が変わってくる。
だから、その本の扱ってる内容/ウリを説明するキーワードを列挙しておくというのが、エレベーターピッチに繋がるプレゼンと言えるかなと。

『Math Poker Girl』の場合は「どうやったらポーカーに勝てる?」みたいな煽りは入れてたけど、具体的なキーワードの列挙はしてなかった。
なので、お客さんから見たら「ポーカー」や「数学」は見て取れるけど、じゃあ数学のどの分野なのかとかはさっぱりで、惹きつける力が弱かったかなぁと。
まぁ、応用数学なので数学を道具として使っていてそういったキーワードを出すのが難しいというのもあったけど・・・

でも例えば、

とかのキーワードが並んでいたら、ただ「数学」ってなってるよりもずっと多くの情報を伝えられたかなと思う。
(ただ、強化学習自体の説明をしたり、強化学習を使って学習したわけではなく、強化学習で使われる状態遷移モデルを使って考察を進めているだけなので「強化学習」と書いてしまうとちょっとウソになるし、数理最適化もやはりバックグラウンドで使っただけでそれ自体の説明はしてないのでやはりウソになる・・・このあたりが応用数学の難しいところ)

ラーメンを食べたい客にはラーメンを出す

で、やっぱり売ることを考えたら、流行のジャンルの本を出すのが一番いい。
キーワードだって目につくし。

ラーメンを食べたい客がいるなら、ラーメンを出すべき。
いや、ソバも美味しいんだよと会心のソバを用意しても、「いや、今はラーメンの気分なんだよ」と言われたら売れない・・・

まぁ、「書きたいこと vs 読みたいこと」にも書いたとおり、難しい問題なんだけど。

ただ、一つ重要なことに売れるかどうかは内容よりも市場の大きさで決まるというのがある。
これは転職とかも同じで、給料は仕事の内容よりも市場の大きさで決まるらしい。

このまま今の会社にいていいのか?と一度でも思ったら読む 転職の思考法

このまま今の会社にいていいのか?と一度でも思ったら読む 転職の思考法

なので、本の内容をよくするのはもちろん、ターゲットとなる市場のサイズが出来るだけ大きくなるようにテーマを調整するのも重要なのかもしれない。


技術書典7にサークル参加してみての振り返りはこんなところで終了。
この経験を次回以降に活かしていきたい。

宣伝!
『Math Poker Girl』はBOOTHでも頒布してるのでよろしくお願いします!
上にも書いた通り、ポーカー知らなくても読めますし、数学詳しくなくても読めます!

今日はここまで!

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

f:id:yamaimo0625:20190621155528j:plain

昨日は当日までの準備を振り返った。

今日は当日を振り返ってみたい。

タイムテーブル

まずは当日のざっくりした動きから。
ちなみにスペースは「え23C」で3階。

時間 出来事
9:20 池袋のいけふくろうに到着。
待ち合わせ時刻は9:45。
張り切りすぎた。
9:50 売り子をお願いした友人と合流。
文化会館へ向かう。
10:15 会場に到着。(途中でちょっと買い物した)
3階へのサークル入場でなぜか待機列が出来てた。
しばらく待たされたあと、階段で3階へ。
設営を開始する。
10:55 設営完了。ギリギリ。
トイレに行く時間がなかった・・・
11:05 開会
15:00 ここから30分ほど3階を見て回って自分の買い物。
16:00 ここから30分ほど2階を見て回って自分の買い物。
17:00 閉会
撤収を開始する。
搬出のために重いダンボールを持って階段を2往復した。
死ぬほど疲れた。
18:10 だいたいこの頃に片付けも終わって会場をあとにした。

入場

一応、事前にディスプレイの確認もしてたし30分もあれば余裕かなと、10時少し過ぎくらいに会場に着くように行った。
結論から言えば、もっと早く行くべきだった。
余裕を持った行動は大事。

到着してサークル通行証(かっこよかった!)をもらって、さてスペースに向かって設営だと思ったら、 なぜか3階に向かうのに待機列に並ばされ、思いっきり出端をくじかれることに。
ここでそれなりに時間をロスした気がする。

なんで待機列を作る必要があったのか・・・おそらく階段への人の流量制限と、安全確保のためにスタッフの目が届くようにしたかったんだと思う。
それは分かるんだけど、だったらパケット方式じゃなくてストリーム方式にして欲しかったなと。

ここでいうパケット方式/ストリーム方式というの自分の造語だけど、

パケット方式
集団(パケット)に先導者(ヘッダ)をつけて1集団(1パケット)ずつ移動する。

ストリーム方式
人(データ)を流す通路の入り口と要所にスタッフを配置し、流量をコントロールしながら人を流す(ストリームにする)。

という感じ。

f:id:yamaimo0625:20190926124717p:plain

パケット方式は人が少なくていいという利点があるけど、ストリーム方式の方が死角になる領域は狭いしスループットも高くなる。
エンジニアなので、こういうところに普段の知識を活かして欲しいところ・・・

ついでに言えば、待機列も毎回コピーをしているような感じだった(列が1つ3階に向かうたびに全体で右に1列ズレてた)ので、リングバッファ方式を使うなど工夫して欲しかった・・・

擬似コードで表現すると、こんな:

// 先頭の列を送り出したら、残りの列を全部コピーしていた:
while (!done)
{
    line_t line = lines[0];
    for (int i = 1; i < line_size; i++)
    {
        lines[i - 1] = lines[i];
    }
    ...
}

// リングバッファにして次に送り出す列をマークしてれば毎回のコピーは不要:
int next_idx = 0;
while (!done)
{
    line_t line = lines[next_idx];
    next_idx = (next_idx + 1) % MAX_LINE_SIZE;
    ...
}

まぁ、おそらく事前に準備があったわけではなく、当日急にそうしないといけなくなったとかなんだとは思うけど。

設営

そんなこんなでスペースに到着し、いざ設営というところで何が起こったか。

「あれ? 何から手をつければいいんだ?」

思考がフリーズした(^^;

いや、今までもコミケとかにサークル参加してたけど、今回は製本を印刷所さんにお願いしてたり、いつもより展示用のアイテムをたくさん持ち込んでたりで、やるべきことがいろいろ増えていて何から手をつけたらいいのか急に分からなくなってしまった。

段取りをあらかじめ考えてチェックリストとして印刷し、何も考えなくても順番にやっていけば設営が終わるという感じにしておいた方がよかった。

スペースに到着したのも遅れたり、次は何をやらないといけないかをいちいち考えながら行動する必要があったせいで、設営が終わるのがギリギリになってしまった。
しかも、そんな感じでてんやわんやしてたので10:40〜は移動も出来なくなるというのを見落としてい てトイレに行きはぐるという・・・
大変だった。

以下のような段取りでやればよかったと思う:

  1. スペースにある運営からのお知らせを確認する
  2. イスを下ろす
  3. 入荷したダンボールを確認する
    1. ダンボールが自分宛てか確認する(間違ってる可能性があるため)
    2. ダンボールの数/各ダンボールに入ってる数を確認する(不足している可能性があるため)
    3. ダンボールを適切な場所に移動する(机の下/バックヤードに数を分ける)
  4. 荷物の置き場所を決める(とくに文具セットを取り出しておいて置く場所を決めるといい)
  5. 敷き布を敷く
  6. スマート本棚を組み立てる
  7. ポスタースタンドを組み立てる
  8. 見本誌を作る
  9. 本を陳列する
  10. DLカードを用意する
  11. 値札を立てる
  12. かんたん後払いのQRコードが印刷された紙をスタンドに入れて立てる
  13. お札入れを用意する
  14. 写真を撮ってアピール
  15. (スタッフさんが回ってきたら)見本誌提出袋を提出する
  16. 立ち読み広場用の見本誌を用意し、置きに行く

立ち読み広場用の見本誌の準備を最後にしてるのは、急ぐ必要がまったくなかったから。
最初から立ち読み広場があるのかと思いきや、たしか13時くらいになってからだったらしい。

ちなみに設営後の様子はこんな:

会場の様子

11:05にアナウンスがあり開会。
チケットによる流量制限と床面積の増加が効いているようで、混みすぎていない感じでよかった。

本の売れ行きは・・・これは次の「気づき編」で。

やってるときにちょっと不思議だったのが、人がある程度の周期で固まって押し寄せてくること。
混雑に波があるというか。
人が固まってくると立ち止まるのが難しくなるので、スルーされてしまう可能性が高くなる。

あとでツイッターなどを見ると、なんか2階から3階への移動にサークル入場のときと同じように列形成がされていたっぽい?
他にもいろいろ問題があったようで・・・
まぁ、複数フロア開催は今回が初めてなので、今度どんどん改善されていくと思う。

16時ごろに2階に降りて買い物をしたのだけど、2階はその時間でもけっこう人がいて驚いた!
これまで一般参加してたときの混雑に比べればずっと空いているものの、3階に比べればずっと混んでる。
こんなに人が来てたのか、みたいな(^^;

そして、技書博の感想でも書いたんだけど、移動用の通路が確保されていないレイアウトなので、3階に戻るのがけっこう大変だった。
人混みをかきわけないと進めないんだから。

今の技術書典のレイアウトは、こんな感じで移動のための列とサークルに並ぶための列が混在している:

f:id:yamaimo0625:20190728193612p:plain

それを技書博のように分離して、移動のための通路をちゃんと確保して欲しかった:

f:id:yamaimo0625:20190728193752p:plain

こうなっていれば移動がもっと楽で混雑の分散もされるのに・・・

ダイレクト入荷

準備編にも書いたとおり、BOOTHの倉庫サービスは使わず、とらのあなには委託することにしていたので、そのためにダンボール箱を1つ2階へ運んだ。
これも階段で運んだので大変だった・・・

ただこのおかげで宅急便で送るダンボールの数を減らせたので、かなり助かった。

撤収

17:00にアナウンスがあって無事閉会。

あとは片付けをして撤収するだけだとなって、またフリーズした
うん、段取りは大切・・・

他にも見本誌を立ち読み広場に回収しに行ったらなかなか見つけられなかったり(友人が見つけてくれた)、キャリーカートで在庫を運ぼうと考えてたけど安物のキャリーカートでは無理と判明して急遽宅急便に切り替えたり、そして宅急便の伝票が全然見つからずに泣きそうになったり、1箱ずつならキャリーカートでも運べるだろうとキャリーカートで運んだらエレベータが大渋滞でこれは無理だと結局ダンボール箱を抱えて階段を2往復したりと、死ぬほど大変だった。。。

3階にも宅急便の搬出口が欲しかった・・・階段の往復、死ぬほど疲れた・・・
(結局ダイレクト入荷の分もあわせて3箱分、階段を往復した)

ちなみに、撤収の段取りは以下のようにすればよかったと思う:

  • 撤収までにやっておきたいこと
    1. 宅急便の伝票を確保しておく
    2. ダイレクト入荷を済ませておく
  • 撤収でやること:
    1. お札入れをしまう
    2. かんたん後払いのQRコードが印刷された紙のスタンドをしまう
    3. 値札をしまう
    4. DLカードをしまう
    5. 陳列していた本をしまう
    6. 見本誌をしまう
    7. ポスタースタンドをしまう
    8. スマート本棚をしまう
    9. 文具セットなどをしまう
    10. 敷き布をしまう
    11. 立ち読み広場の見本誌を回収
    12. ゴミをまとめる
    13. 不要なダンボールを片付ける
    14. 荷物をまとめる
    15. 宅急便を送る
    16. イスを上げる

見本誌の回収が遅めなのは、遅く行った方が本の数が減ってるから見つけやすくなってるはずなので。
時間がなかった場合には最悪放置すればいいし。

段取りの大切さ

今回の大きな反省は、段取りをあらかじめしっかり考えておくのは重要だなということ。
手順に従えばすべて整うようにしておくのは、脳のリソースをすごく節約してくれる。

『現れる存在』によれば、人間の進化というのは、人間が賢くなってきたというよりかは、人間がまわりの環境を賢く作り変えてきたんじゃないか、という話だった。
テクノロジーによって出来ることを増やしていくというのはまさにそう。
知識を外部化してうまく活用するのが重要。

ちなみに『現れる存在』はエンジニアが読んでも非常に面白いと思うのでオススメ。

後日談

めちゃくちゃ疲れて、体力をだいぶ使ったのか頭痛が酷いことになった。。。
肩こりが頭痛の原因っぽいと最近分かってきたので、肩こりを解消するための対策は実施中。

あと、嬉しいことにBOOTHでも売れたので、発送作業をした。
あんしんBOOTHパック」を使ったので、自分も購入者も匿名で済むのがステキ。
自分はともかく、購入者は住所を公開したいとは思わないだろうから、このパックで送るようにした方がいいと思う。


当日(と後日)の様子はこんなところ。
次は実際にどれくらい売れたのかや、その他に気づいたことなどをまとめてみたい。

今日はここまで!