LaTeXで技術同人誌を書いた
PHPerKaigi 2024 のパンフレット記事で4ページ分の技術同人誌を書きました。
印刷物は初めて作ったのですが、出来るだけ綺麗な仕上がりになるようにしたかったので、LaTeXで書きました。
この記事では、技術書を書くときに使ったLaTeXの設定などを共有します。
この記事は meihei GW アドベントカレンダー4日目の記事です
meihei GW アドベントカレンダーとは、meiheiがゴールデンウィークの5月1日〜5日までの間に毎日記事を投稿する企画です。勝手にやっています。
完成物
一応後ろにあと2ページあります。
(読んでもらう用の画像ではないので、ざっくりLaTeXっぽさを感じてください)
LaTeXを使うモチベーション
初めての執筆ということで、いくつかのツールを検討し「Re:VIEW」と「LaTeX」に行き着きました。
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ではその設定ができるので、以下の記事を参考にしつつ作りました。
実際の設定はこんな感じです。
\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で読み込むようにしました。
-
draw.ioから図をSVG形式でエクスポート
-
inkscapeでSVGからEPSに変換
inkscape --export-filename=/path/to/graph.eps /path/to/graph.svg
- 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も良さそうですし、そのうち触ろうかなって思います。
Discussion