✒️

[打倒LaTeX !!] 生まれたての組版システム'Typst'の使い方と便利な機能を実装した話(2023.10)

2023/11/05に公開

*この記事は、とある大学の授業の成果発表の一部として制作されたもので、一部情報が更新されていなかったり、誤りがある可能性があるのでご了承ください。何かお気づきの点がありましたら、ご指摘ください。また、Texはものすごくリスペクトしています。マジで、、

共同研究: sunny, Lyle

目次

はじめに
Typstとは
Typstのインストールと使い方
使用感
改変のためのBUILDの方法
改善したい内容

改善の内容と結果

おわりに

0. はじめに

こんにちは、この記事は皆さんにはまだ聞き馴染みがないであろう、生まれたての新しい組版システム "Typst" をさらに便利に改善しようと奮闘した記録になっています。

Typst について、インストールから使い方についても軽くまとめてあるので、何か参考にできることがあれば幸いです。

1. typstとは

皆さんは、レポートや課題等、文書を作成する際に、どのようなツールを用いるでしょうか。 Microsoft WordGoogle Document , Tex 等様々挙げられますが、特に数式が多い文書を書きたいとき、シンプルかつ表現の幅があり、さらにかなり細かく、正確な図表を作成できるTexは(特に理系の人間には)愛用されています。

確かに、 Tex は長い歴史を持ちながら古臭さもなく、また様々なツールが発達しており、とても便利ですが、 <span style="color: red; "> 覚えるまで少し慣れが必要で(これは何にでも言えますが)、さらにpdf出力に少し時間がかかったりして、不便を感じたことはないでしょうか。</span>

_そんな時に、お勧めなのが2023年に公開されたばかりの組版システムであるTypst(開発元のgithubに飛びます)です。_このTypst、まだ生まれたてほやほやなのですが、すでにレポートや様々な文書を書くのはお手のもの。とにかくTexを始める瞬間のような複雑な構文や面倒な文書の初期設定もなく、数式も簡単でスラスラ書くことができます。
例えば、以下のようなファイルをtypstでコンパイルしてみると、

exp.typ
#set text(font: "IPAMincho")
#show emph: set text(font: "Hiragino Mincho Pro")
#show label("強調赤"): set text(red)

//タイトル
#align(center, text(17pt)[
  *タイトル:Hello Typst!*
])
//ここから本文
= 見出し1
== 小見出し
ここから本文です。みなさんは好きなように文章を書いていきましょう。 こんな感じに段落の強調は簡単です。#label("強調赤")

もちろん、 
単語 #label("強調赤") の強調もできますよ、もちろんね!!

= 数式の例
数式は\$\$で囲みます。式番号は自動でつけてくれます。

$ <φ^*|φ> = integral_(0)^(L) φ^*φ dif x = 1 $

$ x^(1/2) = root(,x)=root(2,x)  $

上のtypの出力結果

そして、少しテクニカルな面として、関数を持ちいた文書の書き方もできます。

exp2.typ
1は2より小さい?? -> #(1 < 2)

-5の絶対値は、#calc.abs(-5) \


#calc.sin(1.5) \

#let date = datetime(
  year: 2023,
  month: 10,
  day: 29,
)

#date.display("今日は:[month]月[day]日") \
#date.display()

特徴がよく出ていますね。

これをコンパイルすると、

さらに、Typstは、プログラム自体はRustで書かれており、その特徴も相まって 処理の速度が早く、pdfの出力も爆速(文字通り「あ、」という間)で行ってしまうんです!!

以上のように、全く新しい組版システムのTypstは、Texよりもとっつきやすく、 _Tex_で挫折した方にもお勧めできるものです。もしかしたらTexを倒せたりして、、

ここまで読んでいただいた皆さん、Texより始めやすい新興勢力の Typst、使いたくなりましたか?以降この記事では、Typstの使い方や、発展的に使用時に気になる点を改善する方法をまとめていきます。どうぞ最後までお付き合いください。

2. typstのインストールと使い方

ここからは、 Typstを使いたくなった方向けに簡単なはじめ方をご紹介します。

尚、この記事のライターは、環境としてMacとLinuxを用いており、Windowsに関してはRUSTの環境設定等が多少変わる可能性があります。

公式サイト公式githubからもいくつかの方法を紹介されているので、そちらもご参照ください。

cargoを用いる (LINUX, Mac)

前述のとおり、TypstはRustで構成されており、インストールもCargoを用いることができます。ですがそのためにはRUSTをインストール(すでにインストールできている方は、飛ばしてください。)する必要があります。

$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

と実行するとRUSTをダウンロードをでき、(すでにインストールできている方は、飛ばしてください。)
(コードの引用、参考RUSTをインストール)
さらに、これを使って

$ cargo install --git https://github.com/typst/typst

を実行すると、すぐに使えるようになります。

(コードの引用、参考新興組版システム typst のススメ)

brew (Mac向け)

Mac OSをご利用の方にはお馴染みのHome Brewを用いることもできます。

$ brew install typst

言わずもがなですね。

winget (windows向け)

windowsに関しては、どうもRUSTの導入が面倒なんだとか(詳しくないのですいません)、、なのでwingetをつかって使えるようにしてしまいましょう。

$ winget install --id Typst.Typst

このほかにも、上記の公式サイトでは、nixやdockerを用いた方法や、なんならオンライン上でTypstを共同編集できるサイトも公開しているようです(使い勝手はわかりませんが、いつか別記事に書くかもです)。ここまできてやらないのは勿体無い。。。

ここまでできたら、試しにターミナルに

$ typst

と入力すると

Usage: typst [OPTIONS] <COMMAND>

Commands:
  compile  Compiles an input file into a supported output format [aliases: c]
  watch    Watches an input file and recompiles on changes [aliases: w]
.....

から始まるようなコマンド入力のヘルプが出力されます。これができたら、Typstをすぐに使用することができます。
例えば、

hoge.typ
hello Typst!

$ <φ^*|φ> = integral_(0)^(L) φ^*φ dif x = 1 $

というファイルを用意して

$ typst compile hoge.typ result.pdf //result.pdf を入れないと勝手にhoge.pdfにしてくれる。
$ typst compile hoge.typ -f png //出力形式を決める。

のコマンドを実行すると、このようにpdfやpngが出力されます(svg形式もできるそうです)。

上のtypの出力結果

このように簡単に始められ、文書を作成できるのです。
さらに、Typstの詳しいはじめ方、書き方は、当記事のライターの一人が別記事に詳しく書いています。ぜひご参照を!!

3. 使用感

typstの使いやすいところ

//とにかくコンパイルが早い、数式が早い等の具体例
Typstの紹介にも書きましたが、使っていてとにかく数式が簡単ですし、コンパイルも早く、各コマンドについて一つ一つ解説している公式のページもあるので、少し書いてみればすぐに慣れてしまいます。

しかもpolyluxというライブラリを使用すると簡単なスライドも作成できます。まだほんの少しの機能でありますが、将来的に使いやすく便利なものになる可能性はありますね。これに関してもライターの一人が記事を書いているので、詳しくはそちらをご参照を!!

typstに感じる不便さ

ここまでTypstの便利さを強くアピールしてきましたが、もちろんTypstにも多少の不便さを感じます。

おそらく多くの日本語使用者の方は、Texほど日本語に対応しきれていないことや、サポートガイド等、困った時に参照するためのドキュメントが少ないことに手こずるでしょう。(→そんなあなたに、ライターが日本語のガイドを書きはじめました。)

gitにも様々なISSUEが挙げられていてやはりまだまだ完全ではないようです。

Typstはまだ歴史が浅く、これからさらに改善されていくことが期待できますが、今すぐ便利に使いたい我々にとっては早急にこれらの問題点を改善したくなりますね。。実際この記事のライターもTypstでフォントを明朝体にセットすると、以下の画像のように漢字の直前にひらがなの「に」を配置すると消えてしまう事象を確認し、改善方法を探りたくなりました。

一部の漢字の直前の明朝体の"に"が行方不明です!!

このような動機で、Typstのソースコードをいじることにしました。以降の章では、実際にTypstを改善していく方法と実際に実装したこと等について書いていきます。

4. 改変のためのBUILDの方法 (Linux, Mac)

この記事を読んでくださっている方の中でも、公開されているソースコードをいじったことがある、という方は指折りかもしれません。実際、ライターもほぼ初めての経験となったため、ここでは奮闘の記録を少し詳しく書いておきます。

これにもいくつか方法がありますが、簡単なのは、開発元のgithubからzipをダウンロードすることでしょう。今回、ライターもzipでダウンロードをしました。

gitからzipをダウンロードしよう!!

ここから、Download ZIPを押すか、または、

$ git clone https://github.com/typst/typst.git

でcloneすることでソースコードを自分のPCにダウンロードできます。実際、ダウンロードしたzipを解凍したtypstフォルダ (以後この記事では説明がない限り、ここからの相対パスを用いて説明します) で、

$ ls

を実行すると、

CONTRIBUTING.md	Cargo.toml	LICENSE		README.md	crates		flake.lock	rustfmt.toml	tools
Cargo.lock	Dockerfile	NOTICE		assets		docs		flake.nix	tests

のように内部のファイルやフォルダを確認でき、これによりここまでは成功できていることがわかります。

さらにこれらのコードをcargo buildします。

cargo build --release --target-dir <output_directory_path>

これを入力すると、

compile中の様子

のように実行が始まり、数分経つと(大体4分くらい)

  Compiling tracing-flame v0.2.0
   Compiling env_proxy v0.4.1
   Compiling rustls-pemfile v1.0.3
   Compiling memmap2 v0.7.1
   Compiling hayagriva v0.3.2
   Compiling typst-library v0.8.0 (~/指定したパス/~)
    Finished release [optimized] target(s) in 4m 05s

と表示されました。おそらくダウンロードしたソースコード等をコンパイルして適切に使用できる状態にできた(ビルド-BUILD-できた)とわかります。

しかし、このままでは実行が、

$ ./~コンパイルしたディレクトリ~/release/typst compile hoge.pdf 

等々、入力が面倒なので、zshのtypstの設定を変更してしまいましょう。これは実行環境で少し変わるので、注意してください。ターミナルで、

$ vi ~/.zshrc

と入力すると、設定画面が現れ、

alias typst='/~先ほど先ほどのビルド結果があるパス/typst'

という設定を追加することで、先ほどBUIDしたtypstが、今いるディレクトリにかかわらず、

$ typst

で実行できるようになります。結果としてコマンドの種類を表示してくれれば設定完了できたことになります。

今回の作業を応用してBUID先の実行ファイルを名前でバージョン管理して、この辺りの設定をいじれば旧verを試したいときにも面倒な作業が減りますね。

5. 改善したい点

ライターが使っていて気になった問題のうち"直せそう、改善できそう"と感じたものをあげていきます。

先にお詫びとして、先にあげた明朝体の"に"問題は、なんの成果も、得られませんでした!! フォントのコード周りの扱いを勉強しなければ手も足もでない気がしまして。。こういった文字だけ例外処理というのははあまり見栄えが良くなくてやりたくない気がしましたが、結局そうなるのでしょうか。

いろはにほへと-あいうえお問題

一つ目からヘンテコな名付けですが、これは文書の章の設定に関するもので、割と大事なものです。例えば、文書に

ott.typ
#set heading(numbering: "1.")
= 初章
= 中章
= 終章

と書いてみると、
これはしっかりできていますね  
となって、しっかり章の番号を設定できます。ですがたまには章番号に"ABC"とか"あいうえお"を使いたくなりますよね。実際やってみると、

aiueo.typ
#set heading(numbering: "あ.")
= 初章
= 中章
= 終章

としてみると、

流石に日本語には対応できていないかぁ、
となって、流石に厳しいようです。しかし、章設定の()内で使われているnumbering関数の使い方を公式ドキュメントで検索すると、

まさかの引数、そのほかにも漢数字、ハングルも使える
引数に"い"が取れることが判明!!これは嫌な予感がしますね。実際に仕様を確認すると、

#set heading(numbering: "い.")
= 初章
= 中章
= 終章

Typstって90年前からあったっけ、、
これには驚きました。ひらがなの順番と検索してでてきたのが"いろはにほへと"なんですかね。 伝統大事にし過ぎでしょ、どんだけ風流なんだよ。 とても面白いですが、流石に"あいうえお"は欲しいですよね。

剰余算対応

斜め文字問題

レポート等の文書を書いてる際、平文内で"ここは特に強調したい"というところに斜体を使うこともあるかと思います。もちろんTypstもアルファベットや数字の斜体は

_abcd_

で書くことができます。もちろん日本人たるもの、日本語の文字に用いたくなりますよね。

_abcd1234_

_最近すごく寒くなりましたね ToT_

日本語はそのまんまか、、
こんな感じで、日本語を見事にスルーし、泣いてる絵文字だけ斜めに しやがり してくれました。普通のフォントでも表示してくれるだけ優秀ということにしときたいですが、少し不便なので頑張って直したいですね。

6. 改善の内容と結果

あいうえお問題

先ほど述べたこの問題は、すぐに解決しました。このソースコードはコメントを含めアルファベットと数字で構成されていますが、便宜上、"いろはに"を扱う部分では、処理の中で"い"が登場するはずです。よって、

$ git grep "い"

をしてしまえば、少ない数で見つかるはずです。実行した結果が

typst-library/src/meta/numbering.rs:    /// **Counting symbols** are `1`, `a`, `A`, `i`, `I`, `い`, `イ`, `א`, `가`,
typst-library/src/meta/numbering.rs:/// `I`, `い`, `イ`, `א`, `가`, `ㄱ`, or `*`, and then a suffix.
typst-library/src/meta/numbering.rs:            'い' => NumberingKind::HiraganaIroha,
typst-library/src/meta/numbering.rs:            Self::HiraganaIroha => 'い',
typst-library/src/meta/numbering.rs:                        'い', 'ろ', 'は', 'に', 'ほ', 'へ', 'と', 'ち', 'り', 'ぬ', 'る',

であり、まさにnumbering.rsというそれっぽいファイルですね。少し中身を少し見てみると、

typst-library/src/meta/numbering.rs
impl NumberingKind {
    /// Create a numbering kind from a lowercase character.
    pub fn from_char(c: char) -> Option<Self> {
        Some(match c {
            '1' => NumberingKind::Arabic,
            'a' => NumberingKind::Letter,
            'i' => NumberingKind::Roman,
            '*' => NumberingKind::Symbol,
            'א' => NumberingKind::Hebrew,
            '一' | '壹' => NumberingKind::SimplifiedChinese,
            'い' => NumberingKind::HiraganaIroha,
            'イ' => NumberingKind::KatakanaIroha,
            'ㄱ' => NumberingKind::KoreanJamo,
            '가' => NumberingKind::KoreanSyllable,
            _ => return None,
        })
    }

なるほど、"#set heading(numbering: "い.")"というコマンドを実行すると、"い"が引数として渡され、それをfrom_char関数で処理しているみたいですね。
そして、NumberingKind::Irohaがどうなっているかというと

typst-library/src/meta/numbering.rs
    /// Apply the numbering to the given number.
    pub fn apply(self, mut n: usize, case: Case) -> EcoString {
        match self {
            Self::Arabic => {
                eco_format!("{n}")
            }
            Self::Letter => zeroless::<26>(
                |x| match case {
                    Case::Lower => char::from(b'a' + x as u8),
                    Case::Upper => char::from(b'A' + x as u8),
                },
                n,
            ),
            Self::HiraganaIroha => zeroless::<47>(
                |x| {
                    [
                        'い', 'ろ', 'は', 'に', 'ほ', 'へ', 'と', 'ち', 'り', 'ぬ', 'る',
                        'を', 'わ', 'か', 'よ', 'た', 'れ', 'そ', 'つ', 'ね', 'な', 'ら',
                        'む', 'う', 'ゐ', 'の', 'お', 'く', 'や', 'ま', 'け', 'ふ', 'こ',
                        'え', 'て', 'あ', 'さ', 'き', 'ゆ', 'め', 'み', 'し', 'ゑ', 'ひ',
                        'も', 'せ', 'す',
                    ][x]
                },
                n,
            ),

番号に従って、対応する文字を返している、ということがわかりました。
これを他のに習って直した。

これら以外の問題は我々には対処しかねました。。後世の皆さんに期待します。

7. おわりに

いかがだったでしょうか。ここまで組版システムの新興勢力であるTypstの使用や改善について述べてきましたが、このソフトウェア自体がRUSTを用いたり、様々な工夫をして、高速ながらしっかりとしたpdf出力を実行できていることがわかりました。

しかし、Typstは十分に使う価値がある上でまだまだ改善や進化の余地がたくさんあります。特に日本語近辺(おそらくアルファベット以外を使うもの全般)には弱い印象を持ちます。これは仕方ないことですが、これからも進化し続けて、さらに使いやすくなっていくことを期待します。

皆さんもこの機会にTypstの古参勢として便利で簡単な文書作成の魅力を存分に活かしてみませんか??

裏話,参考にできる記事

実は、この記事で扱ったTypst以外にも新しい組版システムとしてSATySFiというものがありまして、最初はこれを使ってみようと思ったのですが、構成している言語がよくわからなくて。。。せっかくドキュメントが日本語で使いやすそうだったのに、、、一応GitHubのリンクを載せておきます。Macでは問題なく使えました。

参考,参照

https://typst.app/

https://github.com/typst/typst

https://chat.openai.com/

https://zenn.dev/msakuta/articles/2f1cd11d6099d6

Discussion