🖨️

LaTeXで技術同人誌を書いた

2024/05/05に公開

PHPerKaigi 2024 のパンフレット記事で4ページ分の技術同人誌を書きました。

https://fortee.jp/phperkaigi-2024/proposal/8c26b31e-3689-40dd-85b4-cf2b591c3f59

印刷物は初めて作ったのですが、出来るだけ綺麗な仕上がりになるようにしたかったので、LaTeXで書きました。
この記事では、技術書を書くときに使ったLaTeXの設定などを共有します。

この記事は meihei GW アドベントカレンダー4日目の記事です

meihei GW アドベントカレンダーとは、meiheiがゴールデンウィークの5月1日〜5日までの間に毎日記事を投稿する企画です。勝手にやっています。

完成物

一応後ろにあと2ページあります。
(読んでもらう用の画像ではないので、ざっくりLaTeXっぽさを感じてください)

LaTeXを使うモチベーション

初めての執筆ということで、いくつかのツールを検討し「Re:VIEW」と「LaTeX」に行き着きました。

https://karaage.hatenadiary.jp/entry/2021/08/04/073000

Re:VIEWは初めて使うことになるので、大学生の頃の論文作成で使ったことのあるLaTeXを採用しました(締め切りも迫っていたので)。
また、LaTeXのほうが成果物のイメージや、出来ること出来ないことのイメージが出来たので、あまり手こずる事なく作れました。

LaTeXの書き方の詳細

タイトル

シンプルに「タイトル」と「名前」が伝えられて、かつ、これがタイトルであることを認識出来るようにしています。
また、4ページと限られた中で文章を書く必要があり、無駄に余白を作らないためにjtitleなどは使いませんでした。

\twocolumn[
    \begin{leftbar}
    \begin{flushleft}
        {\large PHPで学ぶデータ構造:ハッシュテーブルとチェイン法}
    \end{flushleft}
    \begin{flushright}
        株式会社XXXX\\
        meihei | XXXXX\\
        X: @app1e\_s, GitHub: meihei3, Bluesky: @meihei.bsky.social
    \end{flushright}
    \end{leftbar}
]

ソースコード

ソースコードを貼り付けるところでは、listingsを使いました。
技術同人誌ではソースコードを書きますが、読みやすいソースコードは、等幅フォントで、行数がちゃんと書いてある状態です。LaTeXではその設定ができるので、以下の記事を参考にしつつ作りました。

https://qiita.com/ta_b0_/items/2619d5927492edbb5b03

実際の設定はこんな感じです。

\lstdefinestyle{mystyle}{
    backgroundcolor=\color{backcolour},
    commentstyle=\color{codegreen},
    keywordstyle=\color{magenta},
    numberstyle=\tiny\color{codegray},
    stringstyle=\color{codepurple},
    basicstyle=\ttfamily\footnotesize,
    breakatwhitespace=false,         
    breaklines=true,                 
    keepspaces=true,                 
    numbers=left,                    
    numbersep=-5pt,                  
    showspaces=false,                
    showstringspaces=false,
    showtabs=false,                  
    tabsize=2,
    frame=tb
}
\lstset{style=mystyle}

なぜかlanguageはPHPにせずjavaにしたほうが綺麗にシンタックスハイライトが効きました。原因はわかっていませんが、自分の設定が何か間違っている可能性があります。

画像

画像は draw.io を使って作図し、SVG形式でエクスポートして、inkscapeでSVGからEPSに変換し、LaTeXで読み込むようにしました。

  1. draw.ioから図をSVG形式でエクスポート

  2. inkscapeでSVGからEPSに変換

inkscape --export-filename=/path/to/graph.eps /path/to/graph.svg
  1. LaTeXから読み込み
\begin{figure}[htb]
    \centering
    \includegraphics[width=1\columnwidth]{/path/to/graph.eps}
    \vspace{-5mm}
    \caption{辞書のイメージ。左はお互いに相異なるキーの集合、右はキーとペアになった値のの一覧を表している。}
    \label{fig:dict}
\end{figure}

完成のイメージ

全体レイアウト

クラスファイルはjsarticleを使い、a4paperでA4用紙の設定、twocolumnで文章が1ページで2カラム使うように、twosideで見開き1ページを作ったときに真ん中の空白をいい感じにしてくれます。

\documentclass[twoside,twocolumn,a4paper]{jsarticle}

そして、入稿データフォーマットの指定で、印刷出来ないエリアがあります。そこはgeometryというパッケージを使用して、ミリ単位で調整しました。

\usepackage[top=5mm,bottom=22mm,inner=10mm,outer=20mm]{geometry}

終わりに

LaTeXで技術同人誌(PHPerKaigi 2024 のパンフレット記事)を書いたお話でした。
Re:VIEWも良さそうですし、そのうち触ろうかなって思います。

GitHubで編集を提案

Discussion