SATySFi で CV を書いた話
はじめに
先日 SATySFi を使ってCVを書いたのでその話を書いてみます。基本的には cv-satysfi (仮名) というクラスファイルの使い方の説明をしています。ちなみに記事の雰囲気は SLyDIFi でらくらくスライド作成 - Qiita を参考にしています。
cv-satysfi とは
cv-satysfiとは、組版処理システムSATySFiでCurriculum Vitae (CV)を作成するためのクラスファイルです。LaTeXでは例えば LaTeX Templates に幾つもCV用のテンプレートがありますが、同等のクラスファイルは寡聞にして存じません。 SATySFiでCVを作成するためのクラスファイルは恐らくこれが始めてだと思われます。
そもそも Curriculum Vitae (CV) とは
Curriculum Vitae (CV) は英語で履歴書のことです。英語で履歴書というと Curriculum vitae 以外にも Résumé がありますが、恐らく組版上必要となる要素は変わらないので本記事では違いを気にしません。ちなみに日本語の履歴書と違って CVやRésumé には特定の形式がない様です。
cv-satysfi でできること
CV作成ができます。CVの組版は以下の様になります。レイアウトは Wilson Resume/CV を参考にしています。PDFの例はGitHub Actionsのartifactからダウンロードできます。サンプルコードを読むと大体の使い方がわかるかもしれません。
全体の構造
cv-satysfi を用いるためには cv.satyh
を適切は場所に配置する必要があります。ローカルに配置してもグローバルに配置しても動作するはずです。この辺りはThe SATySFi bookの7章も参照してください。Satyrographosにはまだ対応していません。
cv-satysfiの全体像は次の様になります。
@import: cv
document (|
name = `John Smith`;
|) '<
>
基本的には以下の様になっています。
cv.satyh
を読み込むdocument(|options|)'<block>
で内容を書く- 但しオプションは名前を指定する
name
のみ
CV作成
正直なところ、CVの組版は stdja
を使う様な普通の文章と大きくは変わりません。節を作る際は +section
を使うことができますし、箇条書きを使いたい場合は itemize.satyh
を使うことができます。但し itemize.satyh
の箇条書きをCVに使ったところ、空白の見栄えがあまり良くなかったので少し弄ったものが cv.satyh
にあります。今回CVを組版するにあたって作ったコマンドは以下の様になります。
+twocolumn
前述の例では一番始めのにある住所や生年月日などが書かれている場所が部分的に二段組みになっています。私が知る限りではSATySFiでこの様に部分的に二段組みをするコマンドは開発されていない様なので作りました。
+twocolumn
の型は以下の様になります。 最初の float
は0から1までの間の浮動小数点数で、左右の幅の比を設定します。デフォルトでは0.65で、左がやや広めになっています。その次の2つの block-text
が左右のブロックの内容になります。
direct +twocolumn : [float?; block-text; block-text] block-cmd
+tabbedblock
前述の例ではEducationやEmployment Historyの下の様に、LaTeXの \description
の様な組版が使われています。これらは \description
とは違ってヘッダの部分より左側に説明の文が来ない様になっていますが、この様なコマンドも開発されていない様なので作りました。
+tabbedblock
の型は以下の様になります。 最初の length
はヘッダ部分の幅です。デフォルトでは50ptです。その次に inline-text
と block-text
の組のリストを受け取ります。この inline-text
がヘッダ部分で、 block-text
が本文の部分です。
direct +tabbedblock : [length?; (inline-text * block-text) list] block-cmd
+skill-groups
前述の例には出てきていませんが、CVには以下の様なスキルを書くことがよくあります。この様なスキルを書くためのコマンドとして、 +skill-groups
を作りました。
+skill-groups
や関連する skill-group
の型は以下の様になります。
direct +skill-groups : [skill-group list] block-cmd
type skill-group =
| SkillGroup of inline-text * inline-text list
skill-group
の inline-text
がスキルグループのタイトルに対応し、その次の inline-text list
が各スキルのリストになっています。
その他の機能について
今回の例には出てきていませんが、実は出版リストを組むための bib-item
型 +publications
コマンドも用意しました。今回は詳細の説明はしませんが、以下の様な型になっています。
type bib-in-proceedings =
(|
author : inline-text list;
title : inline-text;
booktitle : inline-text;
series : inline-text option;
volume : int option;
number : inline-text option;
pages : int * int;
year : int;
|)
type bib-article =
(|
author : inline-text list;
title : inline-text;
journal : inline-text;
volume : int option;
number : inline-text option;
pages : int * int;
year : int;
|)
type bib-item =
| InProceedings of bib-in-proceedings
| Article of bib-article
direct +publications : [bib-item list] block-cmd
また、実は dblp のxmlから xslt を使ってこの bib-item list
を自動で生成する様なスクリプトも書きましたが…力尽きたのでそれはまた次回ということにします。
CIについて
今回パッケージを開発するにあたり、 GitHub Actions と docker を使って自動ビルドを動かしました。unit testの様なものはありませんが、少なくとも型エラーなどについては自動で知らせることができます。
dockerのイメージは amutake さんの作った satysfi-dockerを使いました (ブログ記事)。設定方法はさほど難しくないので yamlファイル を参照するのが簡単だと思います。
課題
とりあえずcv-satysfiを作ってみましたが、SLyDIFiと大体同じ様な課題があります。
フレキシブルなテーマ変更
まず始めに、色やレイアウト等がベタ書きなので調整がそこまで簡単ではないです。正直これはLaTeXのCVテンプレートも結構そうなのである程度しょうがないとは思いますが、例えば複数テーマ間の切り替えが簡単にできると何か良いですかね。但し、真面目に実装するとHaskellの型クラスの様なものが欲しくなる気もします。SATySFiで上手くできるのかどうかは良く知りません。
satyrographosへの対応
satyrographosに対応していないので手動でインストールする必要があります。モジュール化などもう少し色々がんばったらsatygraphosに対応させるかもしれません。
SATySFi-base 対応
SATySFi-baseという、SATySFiの汎用的なライブラリがあります。今回実装した組版上の要素の多くはCV以外でも使うと思うので、SATySFi-baseに移植するなどしてCV以外でも使える様にすると良いかもしれないです。あと、SATySFi-baseには Inline.read
みたいに格好良く書けるインタフェースが用意されているので、そっちを使う様に書きかえるかもしれないです。