開発

この blog での書き方

記事の中でコードや数式をどう書くと、どう表示されるかの見本。書くときに見返すための控え。

約 3 分

この記事自身を表示した画面。左に本文、右に目次が並んでいる

記事を書くときに毎回思い出せないので、使える記法をひととおり並べておく。 ここは見本であって解説ではないので、書き方と出来上がりだけを置く。

ただのコードブロック

言語を書くと色が付く。明るい配色と暗い配色は、テーマの切り替えに合わせて入れ替わる (切り替えのために JavaScript は動いていない)。

```ts
const answer = 42;
```
const answer = 42;

ファイル名を出す

title を書くと、エディタのタブのような枠になる。どのファイルの話かを本文で 補わなくて済む。

```ts title="src/lib/posts.ts"
export function postPath(post: Post): string {
return `/blog/${post.id}/`;
}
```
src/lib/posts.ts
export function postPath(post: Post): string {
return `/blog/${post.id}/`;
}

ターミナル

シェルの言語を書くと、枠がターミナルの見た目になる。title を足すと、 どの機械の上で打っているかを書ける。

```sh title="手元"
pnpm check
```
手元
pnpm check

行を強調する

{} の中に行番号(範囲も可)を書く。どこを見てほしいかを本文で 「3 行目の」と書かずに済む。

```ts {2-3}
export function readingMinutes(body: string): number {
const characters = body.replace(/\s+/gu, "").length;
return Math.max(1, Math.ceil(characters / 500));
}
```
export function readingMinutes(body: string): number {
const characters = body.replace(/\s+/gu, "").length;
return Math.max(1, Math.ceil(characters / 500));
}

語を強調する

引用符で囲むと、その語を含むところに印が付く。正規表現も書ける。

```ts "trailingSlash" /always|directory/
export default defineConfig({
trailingSlash: "always",
build: { format: "directory" },
});
```
export default defineConfig({
trailingSlash: "always",
build: { format: "directory" },
});

足した行・消した行

ins=del= で、追加と削除を色分けできる。差分の記法を使わずに 「元のコードのまま」見せたいときはこちら。

```ts del={2} ins={3}
const posts = await getCollection("posts");
return posts;
return posts.sort(byPublishedDesc);
```
const posts = await getCollection("posts");
return posts;
return posts.sort(byPublishedDesc);

差分そのもの

diff で書くと行頭の + / - が印になる。lang を足すと、差分のまま その言語の色も付く。

```diff lang="ts"
const posts = await getCollection("posts");
- return posts;
+ return posts.sort(byPublishedDesc);
```
const posts = await getCollection("posts");
return posts;
return posts.sort(byPublishedDesc);

折り返す

既定では折らずに横スクロールする。1 行が長くて全部見せたいときだけ wrap

```sh wrap
ssh goma1 "pct exec 110 -- systemctl show minecraft --property=ActiveState --property=SubState --property=ExecMainStartTimestamp"
```
ターミナル
ssh goma1 "pct exec 110 -- systemctl show minecraft --property=ActiveState --property=SubState --property=ExecMainStartTimestamp"

行番号

showLineNumbers を書いたブロックにだけ番号が出る。startLineNumber で 途中から数えられるので、長いファイルの一部を引くときに使う。

```ts showLineNumbers startLineNumber=18
export async function getPublishedPosts(): Promise<Post[]> {
const posts = await getCollection("posts");
return posts.sort(byPublishedDesc);
}
```
export async function getPublishedPosts(): Promise<Post[]> {
const posts = await getCollection("posts");
return posts.sort(byPublishedDesc);
}

枠を消す

囲いが邪魔なときは frame="none"

```sh frame="none"
git switch -c feat/something
```
git switch -c feat/something

文の中の数式

$ で囲むと文の中に数式が入る。たとえば計算量が O(nlogn)O(n \log n) である、のように書ける。

計算量が $O(n \log n)$ である。

行を分けた数式

$$ で囲むと、独立した行になる。

$$
\int_0^\infty e^{-x^2}\,dx = \frac{\sqrt{\pi}}{2}
$$
0ex2dx=π2\int_0^\infty e^{-x^2}\,dx = \frac{\sqrt{\pi}}{2}

複数行そろえるときは aligned、場合分けは cases が使える。

P(落ちる)=1i=1n(1pi)i=1npi(pi1)\begin{aligned} P(\text{落ちる}) &= 1 - \prod_{i=1}^{n} (1 - p_i) \\ &\approx \sum_{i=1}^{n} p_i \quad (p_i \ll 1) \end{aligned} f(x)={1(x0)0(x<0)f(x) = \begin{cases} 1 & (x \geq 0) \\ 0 & (x < 0) \end{cases}

数式もビルド時に組み上がっている。読むときに数式のための JavaScript は動かない。 数式のための CSS とフォントは、数式のある記事にだけ配られる。

図は SVG を記事のディレクトリに置いて、画像として参照する。画像だけの段落は <figure> になり、"…" に書いた題がキャプションになる。

![読者のブラウザから CDN を経て、元のサーバへ向かう図](./flow.svg "経路の図")
読者のブラウザから CDN を経て、元のサーバへ向かう図
経路の図

図をコードとして書く記法(mermaid など)は使えない。書くとビルドが落ちて、 代わりに何をすればよいかを言ってくる。理由は ADR 0015。

写真・スクリーンショット

写真やスクリーンショットも、記事のディレクトリに置いて相対パスで参照する。書き方は 図と同じで、書いたあとの扱いが違う

![ブログのトップページ](./rendered.png "置いた画像は幅ちがいで配られる")
ブログのトップページ
置いた画像は幅ちがいで配られる

置いた 1 枚から、画面の広さに合う幅の画像がビルド時に作られる。読む側は自分に必要な 幅だけを落とす。本文の画像は下までスクロールして初めて読み込まれ、記事の先頭に 置いた cover だけは先に読み込まれる。

サイト内を検索