🌊

Typstで現時刻を取得する方法

2024/11/10に公開

結論から申し上げると、しばらくは公式な方法はないでしょう。ただし、公式からも逃げ道が容易されており、少々面倒くさいですが、それを使えば現時刻を取得することができます。

理由としては、関数の純粋性による最適化の考量や、プレビューしながらの現時刻を書く意味、現時刻を使う必要性のなさ及びランダムの値を生成するなど危険な悪用防止などが挙げられているようです。議論の経緯は、以下のIssueをご参照ください。

https://github.com/typst/typst/issues/1988

方法

まず以下のコードを書きます。

time.typ
#let get-now() = {
  let now-str = if "now" in sys.inputs {
    sys.inputs.now
  } else {
    datetime.today().display("[year] [month] [day]") + " 00 00 00"
  }
  let (year, month, day, hour, minute, second) = now-str.split(" ").map(int)
  datetime(year: year, month: month, day: day, hour: hour, minute: minute, second: second)
}

#get-now()

プレビュー時

以上のコードはプレビュー時にtoday()に00:00:00の時間が表示されます。

datetime(
    year: 2024,
    month: 11,
    day: 10,
    hour: 0,
    minute: 0,
    seconds: 0
)

コンパイル時

Unix系のshell、例えばbashやfish、zshなどでコンパイルする際に以下のようなコマンドを実行すると

typst compile time.typ --input "now=$(date '+%Y %m %d %H %M %S')"

以下のように現時刻が表示されます。

datetime(
    year: 2024,
    month: 11,
    day: 10,
    hour: 16,
    minute: 20,
    seconds: 20
)

Discussion