コードブロックとアルゴリズム ― lstlisting, minted, algorithmic
Folioのコード表示環境を完全ガイド.lstlisting,minted,verbatimによるコードブロックの書き方と対応言語,algorithm/algorithmic環境による擬似コードの記述方法を解説する.
1 コードブロック
Folioでは3種類のコード表示環境が使える.いずれもシンタックスハイライト付きで表示される.
1.1 lstlisting 環境
言語を [language=...] で指定する:
def fibonacci(n: int) -> int:
"""n番目のフィボナッチ数を返す"""
if n <= 1:
return n
a, b = 0, 1
for _ in range(2, n + 1):
a, b = b, a + b
return b
# 使用例
for i in range(10):
print(f"F({i}) = {fibonacci(i)}")
別の言語の例:
interface Article {
id: string;
title: string;
content: string;
tags: string[];
createdAt: Date;
}
async function fetchArticle(id: string): Promise<Article> {
const response = await fetch('/api/articles/' + id);
if (!response.ok) {
throw new Error('Article not found: ' + id);
}
return response.json();
}
1.2 minted 環境
minted は言語を波括弧で指定する:
public class BinarySearch {
public static int search(int[] arr, int target) {
int left = 0, right = arr.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] == target) return mid;
else if (arr[mid] < target) left = mid + 1;
else right = mid - 1;
}
return -1;
}
}
1.3 対応言語
シンタックスハイライトが対応している主な言語:
| 言語指定 | 言語名 |
Python |
Python |
JavaScript / javascript |
JavaScript |
TypeScript / typescript |
TypeScript |
Java / java |
Java |
C / c |
C言語 |
C++ / cpp |
C++ |
Bash / bash |
Bash / Shell |
JSON / json |
JSON |
LaTeX / latex |
LaTeX |
Markdown / markdown |
Markdown |
1.4 verbatim 環境
ハイライトなしでそのまま表示する場合は verbatim 環境を使う:
これはそのまま表示される.
インデントも保持される.
特殊文字 $ % & # も変換されない.
2 アルゴリズム擬似コード
2.1 algorithm + algorithmic 環境
algorithm はキャプション付きのコンテナ,algorithmic は擬似コードの本体である:
\begin{algorithm}
\caption{ユークリッドの互除法}
\begin{algorithmic}
\Function{GCD}{$a, b$}
\While{$b \neq 0$}
\State $t \gets b$
\State $b \gets a \mod b$
\State $a \gets t$
\EndWhile
\Return $a$
\EndFunction
\end{algorithmic}
\end{algorithm}
表示結果:
2.2 制御構造
algorithmic 環境で使える制御構造:
条件分岐:
\begin{algorithmic}
\If{$x > 0$}
\State $\text{sign} \gets +1$
\ElsIf{$x < 0$}
\State $\text{sign} \gets -1$
\Else
\State $\text{sign} \gets 0$
\EndIf
\end{algorithmic}
表示結果:
ループ:
\begin{algorithmic}
\For{$i \gets 1$ \KwTo $n$}
\State $S \gets S + a_i$
\EndFor
\end{algorithmic}
表示結果:
\begin{algorithmic}
\While{キューが空でない}
\State $v \gets$ \Call{Dequeue}{}
\For{$u \in \text{Adj}(v)$}
\If{$u$ が未訪問}
\State $u$ を訪問済みにする
\State \Call{Enqueue}{$u$}
\EndIf
\EndFor
\EndWhile
\end{algorithmic}
表示結果:
2.3 入出力と事前条件
\begin{algorithmic}
\Require $n \geq 0$(非負整数)
\Ensure $n!$ を返す
\Function{Factorial}{$n$}
\If{$n = 0$}
\Return $1$
\EndIf
\Return $n \times$ \Call{Factorial}{$n - 1$}
\EndFunction
\end{algorithmic}
表示結果:
2.4 より複雑な例:マージソート
\begin{algorithm}
\caption{マージソート}
\begin{algorithmic}
\Function{MergeSort}{$A, l, r$}
\If{$l < r$}
\State $m \gets \lfloor (l + r) / 2 \rfloor$
\State \Call{MergeSort}{$A, l, m$}
\State \Call{MergeSort}{$A, m+1, r$}
\State \Call{Merge}{$A, l, m, r$}
\EndIf
\EndFunction
\end{algorithmic}
\end{algorithm}
表示結果:
3 まとめ
Folioではコード表示(lstlisting,minted)と擬似コード(algorithmic)の両方が追加設定なしで使える.次回はダイアグラムと表について見ていく.