こんにちは, iduknです.
Typstには, 少し前までchem-parという化学式を記述するのに便利なパッケージがあったのですが, Typstのバージョンアップによって使用不可となってしまいました.
そこで, Geminiとともにこのパッケージを再編集したものを作ったので紹介します.
なお, 新機能として同位体の記述にも対応しました.
目次
ソースコード
// --- chem.typ: 化学式・同位体を自動で整形するための最終版ライブラリ ---
#let chem-style(body) = {
// 1. 元素記号のリストを定義
let elements = ("H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", "Na", "Mg", "Al", "Si", "P", "S", "Cl", "Ar", "K", "Ca", "Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn", "Ga", "Ge", "As", "Se", "Br", "Kr", "Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag", "Cd", "In", "Sn", "Sb", "Te", "I", "Xe", "Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu", "Hf", "Ta", "W", "Re", "Os", "Ir", "Pt", "Au", "Hg", "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr", "Ra", "Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", "Md", "No", "Lr", "Rf", "Db", "Sg", "Bh", "Hs", "Mt", "Ds", "Rg", "Cn", "Nh", "Fl", "Mc", "Lv", "Ts", "Og", "D", "Me", "Et", "Pr", "Bu", "Ph", "Bz", "R", "M", "X", "L")
// 2. 互換性のある方法で、元素リストを文字の長さが長い順に並べ替え
let sorted-elements = elements.sorted(key: it => -it.len())
let isotope-regex = regex("\^(\d+)(" + sorted-elements.join("|") + ")")
show isotope-regex: m => {
show regex("\^(\d+)"):n =>{
show regex("\^"): b => ""
show regex("\d+"): num => super(num)
n
}
m
}
// 4. 化学式のためのルール (例: H2O や Mg2+)
let formula-regex = regex(
"\(?((" + sorted-elements.join("|") + ")+\d*)+(\)\d*)?(\d*[\+-])?"
)
let chm(chm)={
math.upright(text[#chm])
}
show formula-regex: it => {
// 数字を下付き文字に
show regex("\d+"): n => sub(n)
// 電荷(+や-)を上付き文字に
show regex("\d*[\+-]"): c => super(c)
chm[#it]
}
// 5. 本文全体に上記のルールを適用
body
}
使用例
コード
#import "./chem.typ":* //各自のディレクトリ構成に合わせて
#show:chem-style
以下に, H2O, ^3He, ^4He それぞれの相図を示す.
結果
ということで今回はTypstで化学式を楽に入力するソースコードを紹介しました.
是非参考にし, そしてよりスマートに実装してみてください!
また, より良い方法を共有してくれる方や, 分かりづらい点などありましたら, コメント等でお知らせいただけると幸いです.
以上, iduknでした.
最後までご覧いただきありがとうございました.