Google Apps ScriptのgetValueの型をいい感じにする

GASでスプレッドシートから値を読むときに getValue とか getValues とか使うけど、 @types/google-apps-script の定義だと戻り値の型が any になっていて扱いにくい。

公式のドキュメントには戻り値の型について

The value may be of type Number, Boolean, Date, or String 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を入れてあるので頑張れば図も描ける。

f:id:quartorz:20201119113018p:plain

例えば、↓を入力すると上みたいな図ができる。

\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を使ってみることにした。

続きを読む