Google Apps ScriptのgetValueの型をいい感じにする
GASでスプレッドシートから値を読むときに getValue とか getValues とか使うけど、 @types/google-apps-script の定義だと戻り値の型が any
になっていて扱いにくい。
公式のドキュメントには戻り値の型について
The value may be of type
Number
,Boolean
,Date
, orString
depending on the value of the cell.
と書いてあるので、型がこの4つのどれかになってるかどうか判定する関数を用意するといい感じになる。
type TypeMap = { string: string; number: number; boolean: boolean; Date: Date; }; type ValueType = TypeMap[keyof TypeMap]; function checkType<T extends keyof TypeMap>(x: ValueType, typeName: T): x is TypeMap[T] { if (typeName === 'Date') { return x && typeof x === 'object' && x.constructor.name === 'Date'; } else { return typeof x === typeName; } } function assertType<T extends keyof TypeMap>(x: ValueType, typeName: T, message?: string): asserts x is TypeMap[T] { if (!checkType(x, typeName)) { throw new Error(message); } }
checkType
の定義に使ってる機能はUser-Defined Type Guards、 assertType
の定義に使ってるのはAssertion Functionsというらしい。
MathJaxの出力をSVGとして保存できるツールを作った
https://github.com/quartorz/sdjax https://gh-pages.quart.red/sdjax/
MathJaxのSVGをそのまま保存すると文字が表示されないけど、文字のアウトラインが別のSVGの中にあるのが原因なので、そのSVGから文字のデータをコピーしてやればうまく保存できる。
XyJaxを入れてあるので頑張れば図も描ける。
例えば、↓を入力すると上みたいな図ができる。
\begin{xy} (-15,0)="A",(15,0)="A2", (0,33)*{A}, (0,15)="0"*{0},+/d1cm/+/l0.5cm/="1"*{1},+/d1.2cm/+/r0.8cm/="2"*{2}, "A";"A2" **\crv{<-1.5cm,-2.1cm>&<0cm,-3cm>&<1.5cm,-2.1cm>}, "A";"A2" **\crv{<-1.5cm,2.1cm>&<0cm,3cm>&<1.5cm,2.1cm>}, (40,0)="X",(70,0)="X2", (55,33)*{B}, (55,20)="a"*{a},+/d0.8cm/+/l0.5cm/="b"*{b},+/d1cm/+/r0.8cm/="c"*{c},+/d1cm/+/l0.5cm/="d"*{d},+/d1cm/+/r0.8cm/="e"*{e}, "X";"X2" **\crv{<4cm,-2.1cm>&<5.5cm,-3cm>&<7cm,-2.1cm>}, "X";"X2" **\crv{<4cm,2.1cm>&<5.5cm,3cm>&<7cm,2.1cm>}, \ar @[red] "0"+/r0.3cm/+/u0.1cm/;"a"+/l0.3cm/+/u0.1cm/, \ar @[red] "1"+/r0.3cm/+/u0.1cm/;"c"+/l0.3cm/+/u0.1cm/, \ar @[red] "2"+/r0.3cm/+/u0.1cm/;"d"+/l0.3cm/+/u0.1cm/, \ar @[blue] "a"+/l0.3cm/+/d0.1cm/;"0"+/r0.3cm/+/d0.1cm/, \ar @[blue] "b"+/l0.3cm/;"0"+/r0.3cm/+/d0.2cm/, \ar @[blue] "c"+/l0.3cm/+/d0.1cm/;"1"+/r0.3cm/+/d0.1cm/, \ar @[blue] "d"+/l0.3cm/+/d0.1cm/;"2"+/r0.3cm/+/d0.1cm/, \ar @[blue] "e"+/l0.3cm/;"2"+/r0.3cm/+/d0.2cm/, \end{xy}
Prince XML + KaTeX
CSSのpage-margin boxというのを触ってみようとしたけど、 Comparison of browser engines (CSS support) - Wikipedia を見たら対応してるのがPrince XMLとMarthaというエンジンしかなかった。 なんとなくPrince XMLの方が導入が楽そうだったからとりあえずPrince XMLを使ってみることにした。
続きを読む