9
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Typstでコードを埋め込むには【codelstパッケージ】

Last updated at Posted at 2024-03-18

はじめに

Typstはここ最近広がりを見せている新しい組版システムです。学術論文の作成に利用可能であり、一般にLaTeXと比べて高速なコンパイルを行えることが特徴です。

この記事では、Typstでソースコードをレンダリングするためのパッケージである、codelstについての簡単な説明と使い方を紹介します。

ソースコードのレンダリング

基本的な使い方

codelstパッケージは次のように記述することで導入が可能です。今回はバージョン2.0.0を利用します。

import_codelst.typ
#import "@preview/codelst:2.0.0": sourcecode

追記 2024/04/23
codelst v2.0.1が公開されました。これ以前のバージョンを使っているとコードの行番号の表示がうまくいかないようなので、最新バージョンを使うようにしておくと良いでしょう。

これによって、codelstパッケージが導入され、sourcecode関数が利用可能になります。この関数を利用して、ソースコードを次のように記述することができます。

#import "@preview/codelst:2.0.0": sourcecode

#sourcecode[```c
    #include <stdio.h>

    int main() {
        printf("Hello, World!\n");
        return 0;
    }
```]

このように記述することで、次のようにソースコードがレンダリングされます。

行番号とともにソースコードが表示されていることがわかります。余談ですが、Typst標準のコードブロックも存在し、次のような記述で利用することができます。

```c
#include <stdio.h>
int main() {
    printf("Hello, World!\n");
    return 0;
}
```

このように記述することで、次のようにソースコードがレンダリングされます。

このように、表示したいソースコードをトリプルバッククォート(```)で囲むことで、Typst標準のコードブロックを利用することができます。トリプルバッククォートの直後に拡張子を指定することで、適切なシンタックスハイライトも行われます(今回はC言語のサンプルコードを用いています)。しかし、学術論文やレポートを書く際には、行番号の表示や装飾を行いたいことが多いため、codelstパッケージを利用するのがよさそうです。

ファイルの読み込み

codelstパッケージを利用する際、ソースコードをそのまま貼り付けるのではなく、ファイルを読み込んでソースコードを表示することも可能です。その場合、sourcefile関数を利用して次のように記述します。

#import "@preview/codelst:2.0.0": sourcefile, 

#sourcefile(read("Hello_world.c"), file:"Hello_world.c")

このように記述することで、Hello_world.cというファイルを読み込んで、その内容を表示することができます。

sourcecode関数と同様に表示が行えていることがわかると思います。

フレームのカスタム

ここまで省略していましたが、sourcecode関数を利用する際は基本的に#sourcecode(<オプション>)[<ソースコード>]という形式で記述します。ここではオプションを指定することによるフレームのカスタムについて紹介します。

フレームの非表示

オプションにおいてframe: noneを指定することで、フレームを非表示にすることができます。

#sourcecode(
    frame: none
)[```c
    #include <stdio.h>

    int main() {
        printf("Hello, World!\n");
        return 0;
    }
```]

フレームの枠線

フレームの色や形状を変更するには、block関数を利用して、

#sourcecode(
    frame: block.with(<オプション>)
)[<ソースコード>]

のように記述すれば良いようです。例えばフレームの枠線を変更する際は次のように記述します。

#sourcecode(
    frame: block.with(
        stroke: 1pt + fuchsia
    )
)[```c
    #include <stdio.h>

    int main() {
        printf("Hello, World!\n");
        return 0;
    }
```]

詳しくは公式ドキュメントのrect要素に関するページのstrokeの欄を参照するのがオススメですが、簡単に説明すると、strokeオプションは<線の太さ> + <色>という形式で指定することができます。線の太さの指定方法はlength、色の指定方法はcolorを参照してください。

インセット

フレームの内側に余白を設けたいときは、insetオプションを指定します。

#sourcecode(
    frame: block.with(
        stroke: 3pt + fuchsia,
        inset: (x: 10pt, y: 10pt)
    )
)[```c
    #include <stdio.h>

    int main() {
        printf("Hello, World!\n");
        return 0;
    }
```]

insetオプションはこのように、xyの値を指定することで、それぞれの方向に余白を設けることができます。デフォルトは5ptです。

フレームの角丸

フレームの角を丸めるには、radiusオプションを指定します。

#sourcecode(
    frame: block.with(
        stroke: 3pt + fuchsia,
        inset: (x: 10pt, y: 5pt),
        radius: 5pt
    )
)[```c
    #include <stdio.h>

    int main() {
        printf("Hello, World!\n");
        return 0;
    }
```]

フレーム内部の背景色

フレーム内部の背景色を変更するには、fillオプションを指定します。

#sourcecode(
    frame: block.with(
        stroke: 3pt + fuchsia,
        inset: (x: 10pt, y: 5pt),
        radius: 5pt,
        fill: fuchsia.lighten(96%)
    )
)[```c
    #include <stdio.h>

    int main() {
        printf("Hello, World!\n");
        return 0;
    }
```]

例に示した通り、lighten関数を利用することで、指定した色を明るくすることができます。その他、グラデーションなども設定できるようなので、公式ドキュメントのcolorを参照してみると良いかもしれません。

ソースコードの表示

行番号のカスタム

行番号はデフォルトではソースコードの左側に表示されます。これを右側に表示するには、numbers-side: rightを指定します。

#sourcecode(
    numbers-side: right
)[```c
#include <stdio.h>

int main()
{
    int num1, num2, sum, product;

    printf("Enter the first integer: ");
    scanf("%d", &num1);

    printf("Enter the next integer: ");
    scanf("%d", &num2);

    sum = num1 + num2;
    product = num1 * num2;

    printf("The sum of the entered integers is: %d\n", sum);
    printf("The product of the entered integers is: %d\n", product);

    return 0;
}

```]

ソースコードの最初の行のコード番号を1以外に変更したい場合は、numbers-startオプションを利用します。

#sourcecode(
    numbers-side: right,
    numbers-start: 10
)

今回はnumbers-start: 10を指定しているため、ソースコードの最初の行のコード番号が10になっています。

行番号の表示を開始する行を指定するには、numbers-firstオプションを利用します。

#sourcecode(
    numbers-side: right,
    numbers-start: 10,
    numbers-first: 12
)

今回はnumbers-first: 12を指定しているため、ソースコードの行番号が12から表示されています。numbers-startと紛らわしいですが、numbers-startは行番号の最初の値自体を変更するもので、numbers-firstは表示を開始する行を指定するものです。

numbers-stepオプションは行番号の表示間隔を指定するオプションです。デフォルトでは1ですが、例えば2を指定すると、偶数行のみに行番号が表示されるようになります。

#sourcecode(
    numbers-side: right,
    numbers-start: 10,
    numbers-first: 12,
    numbers-step: 2
)

numberingオプションを使用すると、ナンバリングに用いる数字の形式を変更することができます。デフォルトでは単なるアラビア数字ですが、例えばnumbering: (1)のように指定することで、括弧で囲まれたアラビア数字が表示されるようになります。

#sourcecode(
    numbers-side: right,
    numbers-start: 10,
    numbers-first: 12,
    numbers-step: 2,
    numbering: "(1)"
)

また、使う場面は少
ないと思いますが、numbering:"I"のように指定することで、ローマ数字が表示されるようになります。パッと見では行番号が分かりづらそうですが・・・・・・。

また、numbering:noneを指定することで、行番号を非表示にすることもできます。

特定の行をハイライト

特定の行をハイライトするには、highlightedオプションを利用します。

#sourcecode(
    highlighted:(1,3,5)
)

今回はhighlighted:(1,3,5)を指定しているため、1行目、3行目、5行目がハイライトされています。要するにarrayを渡してやればよいので、range関数を利用することで、範囲やハイライトする行の間隔を指定することもできます。

#sourcecode(
    highlighted:range(1, 10, step:2)
)

range関数やarrayについては公式ドキュメントのarrayを参照してください。

空白行について

余談ですが、sourcecode関数を利用する際、ソースコード前後の空白行は、デフォルトだと次のように削除されるようです。

#sourcecode(
    frame: block.with(
        stroke: 1pt + fuchsia,
        inset: (x: 10pt, y: 5pt),
        radius: 5pt,
        fill: fuchsia.lighten(96%)
    )
)[```c

    #include <stdio.h>

    int main() {
        printf("Hello, World!\n");
        return 0;
    }

```]

もし空白行を削除されたくない場合は、showlines: trueと記述することにより、空白行をそのまま表示することができます。

#sourcecode(
    showlines: true,
    frame: block.with(
        stroke: 1pt + fuchsia,
        inset: (x: 10pt, y: 5pt),
        radius: 5pt,
        fill: fuchsia.lighten(96%)
    )
)[```c

    #include <stdio.h>

    int main() {
        printf("Hello, World!\n");
        return 0;
    }

```]

おわりに

備忘録代わりの記事ではありますが、間違いなどがあれば指摘していただけると幸いです。また、codelstパッケージには他にも様々なオプションが用意されているため、ぜひ公式ドキュメントを参照してみてください。

参考文献

9
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?