作りました.
記事公開先はどっちかというとQiitaとかZennのほうが適切かもしれませんがMathlogの拡張なんでMathlogでUpします.
9/24 一部フォーマット仕様を修正. 追記9/24 を確認
Mathlogの記事をVisual Studio Codeで書くための非公式拡張です.記事本文の意味を変えない整形,Mathlog本体に寄せたローカルプレビュー,入力時の色分けと診断を提供します.
Mat-tom-ja.mathlog-vscode-extension
mathlog-vscode-extension-releases
VSCode 1.136.0以降.
Linux,Windowsで簡易動作確認済.
.mathlogmdファイルを作成または開きます.Mathlog: Open Previewでプレビューを開きます.編集は既定200ms後に反映され,エディタとプレビューはスクロール同期します.Shift+Alt+F(Format Document)で本文を整形します.(LinuxはCtrl+Shift+I)Mathlog: Select Preview Themeでeditor・light・darkから選べます.
Format Document
Mathlog preview
専用拡張子として.mathlogmd , .mathlogmacros という2つの独自ファイル拡張子を用意しています.(.mathlogmdは.txt,.mdでも利用可能)
参考文献には.bibを利用します.
| 分類 | 例 | フォーマット | プレビュー |
|---|---|---|---|
| TeX | $ $$$ $$ | 空白・括弧・折り返しを整える | MathJaxでSVGへ描画 |
| 形式ブロック | &&&def title〜&&& | 内部(contents)をフォーマット | 本文をMarkdownとして整形 |
| Markdown | 見出し#箇条書き - | tab揃えなどを行う | markdown-itでHTMLへ変換 |
| HTML | <span><div> | タグと属性を保持 | 一部属性限定で描画 |
| アノテーション | <!-- mathlog-format: ... -->% mathlog-format: ... | 拡張機能を制御する独自構文 (コメントアウト) | 本文に出さない |
実行時の依存は,Node.js上で動くJavaScriptライブラリに限定する.
| 動作層 | ライブラリ | 用途 |
|---|---|---|
| 実行時 | prettier・@prettier/sync | Markdownと表の整形 |
| 実行時 | markdown-it | プレビューのMarkdown変換 |
| 実行時 | mathjax | 数式のSVG描画(外部CDNは使わない) |
| 実行時 | refa | アノテーション正規表現のまとめ |
| 開発時 | @vscode/test-cli・@vscode/test-electron | VSCode統合テスト |
| 開発時 | playwright | ブラウザ試験と公式表示の取得 |
| 開発時 | vscode-textmate・vscode-oniguruma | 文法スコープの確認 |
| 開発時 | pngjs・pixelmatch・parse5 | 画像比較とDOM正規化 |
| 開発時 | PaddleOCR | OCR評価(Pythonの外部ツール) |
| 開発時 | mocha | 単体テストの実行 |
| 開発時 | eslint | 静的検査 |
拡張本体への同梱は,動作層が実行時であるものに限る.開発時のものは配布物に含まれない.
拡張本体はTypeScriptで実装し,実行時はVSCode API以外の外部サービスへ接続しない.
記事本文の意味を変えないことを優先し,判断できない箇所は変更しない.
align・eqnarray・arrayは&の列と行末の\\を揃える.,と.は対象外).mathlog-format:アノテーションで,範囲ごとに改行の禁止(no-break)・空白の削除(no-whitespace)・整形からの保護(no-format)を指定できる.行長の上限,小スコープの閾値,全角置換の範囲は設定(mathlog.formatting.*)で変更できる.
TextMate文法で構文を識別し,色はVSCodeのテーマが決めます.既定テーマが色を持たない表の区切り・水平線・宣言ラベルには,拡張が薄いグレーを与えます.
| 構文 | 色の出どころ | 無効化設定 |
|---|---|---|
| 見出し | テーマ | - |
| 数式(インライン・表示・LaTeX環境) | テーマ | - |
| 形式ブロックの境界と種類 | テーマ | - |
コメント(HTMLコメント・数式内の%) | テーマ | - |
| リンク | テーマ(リンク色) | links |
| 画像 | テーマ | links |
| 箇条書き | テーマ | lists |
| 引用 | テーマ | quotes |
| 表の区切り | 既定色(薄いグレー) | tables |
| 水平線 | 既定色(薄いグレー) | horizontalRules |
宣言ラベル[label] | 既定色(薄いグレー) | labels |
参照[[label]] | テーマ(リンク色) | labels |
| HTML | <span><div> | html |
| コード(フェンス・インライン・タブ字下げ) | テーマ | code |
無効化はmathlog.highlighting.disabledDecorationsへカテゴリ名を入れて行います.mathlog.highlighting.insideFormalBlocksをfalseにすると,形式ブロック本文の装飾(箇条書き・引用・表・水平線・ラベル・リンク・HTML・コード)をまとめて無効化できます.
文字装飾(**太字**など)はエディタでは既定で無色で,プレビューでは反映します.
Mathlog: Open PreviewでWebviewを開く.編集から既定200ms後に本文を再変換し,MathJaxの描画中に変更が続いた場合は最新の1件だけを描画する.mathlog.preview.updateDelayは0〜2000msで変更可能.
Markdownはmarkdown-itで変換し,形式ブロック,ラベル参照,Mathlog固有の箇条書き,表,引用,限定的なHTMLを処理する.HTMLはspanとdivのclass,data-*,styleのcolorだけを許可し,それ以外はエスケープする.<br>は改行として許可する.
MathJaxは同梱の3.2系tex-svgを使う.\\tag,\\label,\\ref,\\eqrefは同じプレビュー内で解決するが,\\tagのない式には自動連番を付けない.形式ブロック番号と数式番号は連動しない.
プレビューの配色はeditor,light,darkから選択.エディタとプレビューは元の行番号とブロック単位の位置を使って双方向にスクロール同期する.
XyJax,TikZ,Mathlog独自マクロのうち未登録のものは対象外.解析に失敗した数式はMathJaxのエラー表示として描画し,原稿は変更しない.
診断は純粋な解析結果をVSCodeのProblemsパネルへ変換する.
| 診断 | 条件 | 重大度 |
|---|---|---|
| 未定義ラベル | [[label]]の参照先が,見出し・形式ブロック・数式のラベル,参考文献キーのどれにもない | Warning |
| 未定義マクロ | \nameが,同梱MathJaxのコマンド・登録済みコマンド・マクロファイル・本文中の定義のどれにもない | Warning |
| 未定義参考文献キー | \cite{key}のkeyが参考文献ファイルにない | Warning |
| 未閉鎖構文 | コードフェンス・形式ブロック・数式・LaTeX環境がファイル末尾までに閉じられていない | Warning |
| 不正なアノテーション | mathlog-format:の正規表現がコンパイルできない | Error |
ワークスペース共通のマクロは既定.mathlog-macros,参考文献は既定.mathlog-bibliography.bibから読み込む.mathlog.resources.macrosとmathlog.resources.bibliographyで複数パスを指定でき,存在しないファイルは無視する.記事ごとの追加は次のHTMLコメントで宣言する.
<!-- mathlog-macros: macros.mathlogmacros -->
<!-- mathlog-bibliography: references.bib -->
マクロは\\newcommand,\\renewcommand,\\defを解析し,補完・診断・プレビューへ渡す.プレビューを開いた後に追加したマクロは反映されるが,削除した定義はプレビューを開き直すまで残る.
テストは以下の観点で実施.
| 区分 | 確認内容 | CI実行 |
|---|---|---|
| 単体 | フォーマッタ(記事とマクロファイル),スコープとセマンティックトークン,テーマ整合,診断,補完,プレビューのHTML生成とマスク計算 | 有 |
| 統合 | VSCode API,コマンド,診断の表示,プレビューの起動 | 有 |
| ブラウザ | Webviewを実ブラウザで描画し,レイアウト・更新・MathJaxマクロを確認 | 無 |
| ゴールデン | 保存済みの公式PNG・正規化DOMとローカル描画の比較 | 無 |
| フォーマッタ評価 | 352件の整形結果を公式表示と比較し,OCRと画像差で評価 | 無 |
| 描画保持 | 350件について,整形の前後でMathlogの描画が変わらないことを確認 | 無 |
| ツール単体 | 取得・比較ツール自身のテスト | 有 |
プレビューなど画像判定が関与するテストケースに対してはpriorityScoreを設定し,2以下をOK判定としています.priorityScoreは複数の判定項目に異なる点数を付与し,その合計値です.
例えばOCRでの文字列比較には4点の重みをつけ,非一致である場合判定NG.(TOLERATED例外有)PASSまたはTOLERATEDをOK判定としています.
| 判定 | 点数 | 扱い |
|---|---|---|
PASS | 0 | 一致 |
TOLERATED | 1〜2 | 画像判定NGのみ,仕様上NG許容など |
NG | 3以上 | 修正対象 |
| 区分 | 件数 | OK | TOLERATED | NG |
|---|---|---|---|---|
| 単体 | 381 | 381 | - | 0 |
| 統合 | 15 | 15 | - | 0 |
| ブラウザ | 18 | 18 | - | 0 |
| ツール単体 | 52 | 52 | - | 0 |
| ゴールデン | 11 | 11 | - | 0 |
| フォーマッタ評価 | 352 | 340 | 12 | 0 |
| 描画保持 | 350 | 334 | 15 | 1 |
描画保持のNG 1件は\begin{align}に対して\end{array}が書かれた箇所を,仕様どおり\end{align}まで数式として整形するために描画がわずかに動く既知のケースで,許容としております.機械的にTOLERATED判定を追加するのも悩ましい描画の穴をついたテストケースのため,意図的にNG判定を残しています.
また本結果はベースライン完成時点での集計結果であり,実際のリリースバージョンでNG判定が発生している可能性があることについてご了承ください.これは画像系のテスト項目全件実施に3時間程度かかってしまうので評価頻度を妥協しているためです.
| 設定 | 既定 | 内容 |
|---|---|---|
mathlog.formatting.additionalInfixSymbols | [] | 中置記号として扱う記号を追加する |
mathlog.formatting.mathBracketOpeningStyle | "nextLine" | 長い数式を展開するときの開始括弧の位置 |
mathlog.formatting.mathLineLimit | 80 | 数式の折り返しの目安 |
mathlog.formatting.mathSmallScopePointLimit | 10 | 括弧展開の対象から外す小スコープの閾値 |
mathlog.formatting.fullWidthNormalization | 各グループtrue | 全角類似文字の置換(グループ単位で無効化できる) |
mathlog.formatting.characterReplacements | [] | 追加の文字置換(例: 、→,) |
mathlog.preview.colorTheme | "editor" | プレビューの配色(editor・light・dark) |
mathlog.preview.updateDelay | 200 | 編集からプレビュー更新までの待ち時間(ms) |
mathlog.highlighting.disabledDecorations | [] | 色付けをやめるカテゴリ |
mathlog.highlighting.insideFormalBlocks | true | 形式ブロック本文の装飾を色付けする |
mathlog.resources.macros | [".mathlog-macros"] | 読み込むマクロファイル |
mathlog.resources.bibliography | [".mathlog-bibliography.bib"] | 読み込む参考文献ファイル |
xy環境と\\xymatrixは描画しない.以上が本拡張機能の概要です.
なかったから.VSCodeの拡張機能が.
Mathlog公式の下書き機能でも問題はないのですが,以下の部分でVSCode上での執筆ができることの価値が有りました.
| 項目 | Mathlog | VSCode(+本拡張) |
|---|---|---|
| フォーマット | なし | あり |
| ハイライト | なし | 色分けにより可読性向上 |
| 構文エラー | 数式の描画エラー | より豊富に実装:未定義ラベル・マクロ・参考文献キー, 閉じ忘れ,不正なアノテーション |
| 自動置換 | - | ,・.を,・.へ自動置換( characterReplacementsで任意の置換も追加可) |
| バージョン管理 | - | Git/GitHubが使える |
| 校正 | - | Copilot・Codexなどで添削できる |
| 入力支援 | 形式ブロック等GUIで挿入可能$などの自動閉じetc. | 左記に加えスニペット使用可能 |
| オフライン | 不可(変更を保存できない) | 可(MathJax同梱,外部CDNへ接続しない) gitでローカルコミット可能 |
| 画像 | 都度アップロードするため管理がしにくい | フォルダにまとめておくことで管理しやすい |
逆に,VSCode上で作業することでブラウザへのアップロードの手間が増えるので完全な上位互換では有りません.トレードオフは発生します.
とはいえGit/GitHubでのバージョン管理,フォーマット,更にはAIに添削をさせることができるという点で,本拡張機能の開発の価値は大いにあると判断しました.
拡張機能の説明に記載しておきましたのでご一読のうえ利用ください.
Mat-tom-ja.mathlog-vscode-extension
自分用に作ったやつなので更新改善のペースはかなり遅いと思われます.
CICDも完璧に作り込めてるとまでは言えないので定期更新の仕組み組んでるとかそういう感じでもないです.
ただ明確な不具合やもっとこうしたらいいんじゃない?等あったらコメント歓迎です.
本来単にMathlogの記事をつらつら書いてたんですが,「やってらんねぇ〜〜〜!」と正直なってしまい,作りました笑.本来やりたかったMathlogの執筆作業に戻りたいと思います.
箇条書きと数式の組み合わせに関するフォーマット仕様を修正しました.
文章の後ろで始めた長い数式を複数行へ展開するとき,開始の$だけがタブ字下げされた行へ落としていました.Mathlogは箇条書き項目内のタブ字下げされた$だけの行を数式として読まないため,プレビューの数式と本文がズレます.
リリース直前に意図して入れた変更だったのですがフォーマット前後で描画を崩してしまう誤った修正だったため,取り消しました.
入力例:
- 補題 $a_{1} + a_{2} + \cdots + a_{10} = b_{1} + b_{2} + \cdots + b_{10} + c_{1} + c_{2} + \cdots + c_{10}$ が成り立つ.
公式の描画
修正前フォーマット仕様:
- 補題
$
a_{1} + a_{2} + \cdots + a_{10} = b_{1} + b_{2} + \cdots + b_{10} + c_{1} +
c_{2} + \cdots + c_{10}
$ が成り立つ.
公式の描画
修正後フォーマット仕様:
- 補題 $
a_{1} + a_{2} + \cdots + a_{10} = b_{1} + b_{2} + \cdots + b_{10} + c_{1} +
c_{2} + \cdots + c_{10}
$ が成り立つ.
公式の描画
1つの項目に数式が2つある場合も同じで,2つ目の$も直前の本文と同じ行へ残します.修正後の出力は再整形しても変化しません.
あと雛形作りました.とても簡素な作りですがもし使いたい方がいれば.
https://github.com/Mat-tom-ja/mathlog-template