# 機能設計書 58-LaTeX

## 概要

本ドキュメントは、space-vimにおけるLaTeXサポート機能の設計を定義する。vim-latex-live-previewプラグインを利用したLaTeX文書のライブプレビュー機能を提供する。

### 本機能の処理概要

LaTeX文書の作成と編集を支援するため、リアルタイムでPDFプレビューを表示するライブプレビュー機能を提供する。

**業務上の目的・背景**：LaTeXは学術論文、技術文書、数式を含む文書の作成に広く利用される組版システムである。LaTeX文書の編集においては、コンパイル結果を即座に確認できるライブプレビュー機能が作業効率を大幅に向上させる。vim-latex-live-previewは、バックグラウンドでコンパイルを行い、PDFビューアでリアルタイムに結果を表示する。

**機能の利用シーン**：学術論文、技術文書、数式を含む文書などのLaTeXソースファイル（.tex）を編集する際に有効化される。:LLPStartPageコマンドでプレビューを開始し、編集内容が自動的にコンパイルされてPDFビューアに反映される。

**主要な処理内容**：
1. LaTeXファイルのバックグラウンドコンパイル
2. OS別のPDFビューア自動設定
3. リアルタイムPDFプレビュー表示
4. プレビュー自動更新

**関連システム・外部連携**：vim-latex-live-previewプラグインとの連携。macOSではTeXShop、LinuxではEvince等のPDFビューアと連携。

**権限による制御**：特になし。レイヤー有効化によりすべての機能が利用可能。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | PDFビューア | 主画面 | コンパイル結果のPDFプレビュー表示 |

## 機能種別

構文解析 / 言語サポート / ライブプレビュー / ドキュメント作成支援

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| g:livepreview_previewer | String | No | PDFビューアコマンド | OS依存 |

### 入力データソース

- LaTeXソースファイル（.tex）のバッファ内容

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| PDFファイル | バイナリ | コンパイル結果のPDFドキュメント |
| プレビュー表示 | 視覚表示 | PDFビューアでの表示 |

### 出力先

- 一時PDFファイル
- 外部PDFビューア

## 処理フロー

### 処理シーケンス

```
1. レイヤー読み込み
   └─ +lang/latexレイヤーが有効化される
2. プラグイン読み込み
   └─ vim-latex-live-previewがvim-plugにより読み込まれる（遅延読み込み）
3. 設定適用
   └─ spacevim#autocmd#latex#Init()でOS別ビューア設定が適用される
4. ファイル検出
   └─ .texファイルオープン時にfiletypeがtexに設定される
5. プレビュー開始
   └─ :LLPStartPageコマンドでライブプレビュー開始
6. 自動更新
   └─ 編集内容がバックグラウンドでコンパイルされPDFビューアに反映
```

### フローチャート

```mermaid
flowchart TD
    A[Vim起動] --> B{latexレイヤー有効?}
    B -->|Yes| C[vim-latex-live-preview登録]
    B -->|No| Z[終了]
    C --> D{.texファイルを開く?}
    D -->|Yes| E[filetype=tex設定]
    D -->|No| F[待機]
    F --> D
    E --> G[プラグイン読み込み]
    G --> H[Init関数実行]
    H --> I[OS別ビューア設定]
    I --> J[編集可能状態]
    J --> K{:LLPStartPage実行?}
    K -->|Yes| L[バックグラウンドコンパイル開始]
    K -->|No| J
    L --> M[PDFビューア起動]
    M --> N[ライブプレビュー表示]
    N --> O{編集?}
    O -->|Yes| P[再コンパイル]
    P --> N
    O -->|No| N
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-58-01 | レイヤー依存 | +lang/latexレイヤーの有効化が必要 | .spacevimファイルでレイヤー指定時 |
| BR-58-02 | ファイルタイプ検出 | .texファイルで自動有効化 | ファイルオープン時 |
| BR-58-03 | 遅延読み込み | texファイルタイプでのみプラグインロード | for: 'tex'指定 |
| BR-58-04 | macOSビューア | macOSではTeXShop使用 | g:spacevim.os.mac=1 |
| BR-58-05 | Linuxビューア | LinuxではEvince使用 | g:spacevim.os.linux=1 |

### 計算ロジック

特になし

## データベース操作仕様

### 操作別データベース影響一覧

該当なし（データベース操作を行わない）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | プラグイン未インストール | vim-plugによるインストール未完了 | :PlugInstall実行 |
| - | LaTeX未インストール | システムにLaTeXがインストールされていない | TeXLive等のインストール |
| - | ビューア未検出 | PDFビューアが見つからない | g:livepreview_previewer設定 |
| - | コンパイルエラー | LaTeXソースに構文エラー | エラーメッセージ確認・修正 |

### リトライ仕様

- コンパイルエラー後、ソース修正で自動再コンパイル

## トランザクション仕様

該当なし

## パフォーマンス要件

- コンパイルはバックグラウンドで非同期実行
- プレビュー更新：ファイル保存から3秒以内

## セキュリティ考慮事項

- LaTeXコンパイラはシステムコマンドを実行可能（\write18）
- 信頼できるLaTeXソースのみコンパイルすること

## 備考

- macOSでTeXShopを使用する場合、自動更新設定が必要
  - `defaults write TeXShop BringPdfFrontOnAutomaticUpdate NO`
- pdflatex、lualatex、xelatexなど複数のコンパイラに対応
- vimtexプラグインとの併用でより高度な機能が利用可能

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

LaTeXレイヤーはプラグイン登録と初期化関数で構成される。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | packages.vim | `layers/+lang/latex/packages.vim` | プラグイン登録とautocmd設定 |
| 1-2 | latex.vim | `core/autoload/spacevim/autocmd/latex.vim` | OS別ビューア設定 |

**読解のコツ**: `autocmd! User`はプラグイン読み込み後に呼び出されるフック。vim-plugの遅延読み込み完了後にInit関数が実行される。

#### Step 2: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | packages.vim | `layers/+lang/latex/packages.vim` | MPマクロによるプラグイン登録 |

**主要処理フロー**:
1. **1行目**: `MP 'xuhdev/vim-latex-live-preview', { 'for': 'tex' }` - vim-latex-live-preview登録（遅延読み込み）
2. **2行目**: `autocmd! User vim-latex-live-preview call spacevim#autocmd#latex#Init()` - プラグイン読み込み後にInit関数呼び出し

#### Step 3: 初期化関数を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | latex.vim | `core/autoload/spacevim/autocmd/latex.vim` | OS別ビューア設定とInit関数 |

**主要処理フロー**:
- **1-6行目**: OS別のPDFビューア設定
  - macOS: `open -a texshop`
  - Linux: `evince`
- **8-11行目**: `spacevim#autocmd#latex#Init()`関数定義
- **10行目**: `g:livepreview_previewer`にOS別ビューアを設定

### プログラム呼び出し階層図

```
.spacevim (ユーザー設定)
    │
    └─ Layer '+lang/latex' 有効化
           │
           └─ packages.vim
                  │
                  ├─ MP 'xuhdev/vim-latex-live-preview' (遅延読み込み登録)
                  │
                  └─ autocmd! User vim-latex-live-preview
                         │
                         └─ spacevim#autocmd#latex#Init()
                                │
                                └─ g:livepreview_previewer設定
                                       │
                                       ├─ macOS: texshop
                                       └─ Linux: evince
```

### データフロー図

```
[入力]               [処理]                    [出力]

.spacevim ───▶ レイヤーシステム ───▶ プラグイン登録
                     │
                     ▼
.texファイル ───▶ vim-latex-live-preview
                     │
                     ├───▶ バックグラウンドコンパイル
                     │            │
                     │            ▼
                     │      一時PDFファイル
                     │            │
                     │            ▼
                     └───▶ PDFビューア ───▶ プレビュー表示
                           (texshop/evince)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| packages.vim | `layers/+lang/latex/packages.vim` | 設定 | プラグイン登録とautocmd |
| latex.vim | `core/autoload/spacevim/autocmd/latex.vim` | autoload | OS別ビューア設定・初期化 |
| LAYERS.md | `layers/LAYERS.md` | ドキュメント | レイヤー一覧とプラグイン情報 |
