8
1

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

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

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

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

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

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

001.png

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

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

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

002.png

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

ファイルの読み込み

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

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

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

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

003.png

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

フレームのカスタム

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

フレームの非表示

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

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

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

004.png

フレームの枠線

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

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

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

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

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

005.png

詳しくは公式ドキュメントの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;
    }
```]

006.png

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;
    }
```]

007.png

フレーム内部の背景色

フレーム内部の背景色を変更するには、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;
    }
```]

008.png

例に示した通り、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;
}

```]

011.png

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

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

012.png

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

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

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

013.png

今回は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
)

014.png

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

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

015.png

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

016.png

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

特定の行をハイライト

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

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

017.png

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

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

018.png

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;
    }

```]

009.png

もし空白行を削除されたくない場合は、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;
    }

```]

010.png

おわりに

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

参考文献

追記

2024/04/23

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

  1. これはMarkdownの記法と同じなので、慣れ親しんでいる方が多いかもしれません。

8
1
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
8
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?