SATySFi で CV を書いた話

Page content

はじめに

先日 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-textblock-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-groupinline-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 Actionsdocker を使って自動ビルドを動かしました。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 みたいに格好良く書けるインタフェースが用意されているので、そっちを使う様に書きかえるかもしれないです。