管理者権限(sudo)無しで extractbb の自動起動を有効化する


## 背景

  * LaTeX + graphicx パッケージ + dvipdfmx で画像ファイルを文書に挿入する場合、事前に各々の画像ファイルについて extractbb を実行して .xbb ファイルを作成する必要がある。
  * 最近の環境では、「外部コマンドの実行が許可されていれば」LaTeX の実行時に extractbb が自動的に実行され、dvips や pdfTeX と同等に容易に画像挿入ができる。
  * セキュリティ担保のため、既定では外部のコマンドの実行を「特別許可リスト」にあるコマンドに限定している。一部の TeX 配布（W32TeX 等）では extractbb は「特別許可リスト」に最初から入っているが、TeX Live（2014 以前）では入っていない。そのため、TeX Live で dvipdfmx を利用する場合、この「特別許可リスト」（Kpathsea 変数 `shell_escape_commands`）に extractbb を自分で追加する必要がある。（他にも選択肢はあるが、最近ではこの運用方法が推奨される場合が多い。）
  * ところがこの設定をするためには、Kpathsea の設定ファイル（texmf.cnf）を編集（または作成）する必要がある。その上、Unix 系 OS の場合、このファイルを置くべきパスは `/usr`、`/etc` 等の配下にある。従って、“通常の手順”に従って設定を行うには管理者（スーパーユーザ）の権限（“sudo できる権利”）が必要になる。
  * しかし実は、ある程度新しい環境であれば、管理者権限が無くても「特別許可リスト」を編集する手段は存在する。

## 前提

  * Unix 系 OS の環境を、**管理者権限を全く持たない**アカウントで利用している。
  * TeX Live（2010 以降）またはその派生の TeX 配布がインストールされている。

以上の条件の下で、「特別許可リスト」`shell_escape_commands` に extractbb を追加する手順を示す。

## 原理

  * 一般に、「TeX で読み込むファイル」は、“システム側の”TEXMF ツリー（`$TEXMFLOCAL` 等）と“ユーザ側の”TEXMF ツリー（`$TEXMFHOME` 等）のどちらに配置することもできる。後者はホームディレクトリの配下にある（例えば `$TEXMFHOME`  は普通は `~/texmf` である）ので自由に読み書きできる。
  * ところが、texmf.cnf は例外であり、既定では“ユーザ側”のツリーに配置しても認識されない。texmf.cnf の配置場所のパスリストを表す Kpathsea 変数は `$TEXMFCNF` だが、これには `$TEXMFLOCAL` 等の“システム側”ツリーの配下のパスしか含まれていないからである。（ちなみに、“通常の手順”において texmf.cnf を新たに作成する場合は、このリストにあるパスに配置することになる。）
  * `$TEXMFCNF` の値を texmf.cnf の中で設定することはできない。（`$TEXMFCNF` はそもそも「texmf.cnf を探すため」にあるのだから当然。）
  * しかし、環境変数を通して設定することは可能である。
  * 従って、“ユーザ側”のツリーの中の適切なパスに新しい texmf.cnf を作成した上で、**環境変数を利用**して `$TEXMFCNF` のパスリストにそのディレクトリを追加すればよい。
  * もちろん、「環境変数の利用は可能な限り避けるべき」なのが正道ではあるが、今の場合、それしか方法がない。

## 手順

※bash での操作を仮定する。
※環境によっては、ここに挙げた手順が途中で**失敗**する場合がある。失敗した時に元の状態に復元できるように配慮すること。

### ① texmf.cnf を配置するパスを決める

  * Kpathsea 変数 `$TEXMFCONFIG` の値を調べる。

    ```bash
    $ kpsewhich --var-value=TEXMFCONFIG
    /home/oreore/.texlive2014/texmf-config
    ```

    この値が「ユーザが書き込めるパス」を指している場合は、

    ```
    «$TEXMFCONFIGの値»/web2c
    ```

    を「配置パス」とする。（今の場合、`/home/oreore/.texlive2014/texmf-config/web2c` となる。）**→②に進む**

  * Kpathsea 変数 `$TEXMFHOME` の値を調べる。

    ```bash
    $ kpsewhich --var-value=TEXMFHOME
    /home/oreore/texmf
    ```

    この値が「ユーザが書き込めるパス」を指している場合は、

    ```
    «$TEXMFHOMEの値»/web2c
    ```

    を「配置パス」とする。**→②に進む**

  * `$TEXMFCONFIG` も `$TEXMFHOME` も使えないので**失敗**である。

### ② 追加した texmf.cnf が認識されるように設定する

  * 以下の内容のファイルを `«配置パス»/texmf.cnf` として作成する。
    （既に存在する場合は追記する。）

    ```
    test=OK
    ```

    ※テスト用に、`$test` という Kpathsea 変数を設定している。

  * `mktexlsr` を実行する。

  * Kpathsea 変数 `$test` の値を調べる。

    ```bash
    $ kpsewhich --var-value=test
    ```

    これで、`OK` が出力された場合は、既に適切な設定になっている。**→③に進む**

  * 環境変数 `$TEXMFCNF` を次のように設定する。

    ```bash
    export TEXMFCNF=«配置パス»:
    ```

    ※最後の `:` に注意。これは「既定の `$TEXMFCNF` のパスリストの先頭に `(配置パス)` を追加する」という意味である。

  * `mktexlsr` を実行する。

  * 再び、Kpathsea 変数 `$test` の値を調べる。

    ```bash
    $ kpsewhich --var-value=test
    OK
    ```

    `OK` が出力された場合は、追加の texmf.cnf を読む設定は成功。**→③に進む**

  * 追加の texmf.cnf を読む設定ができないので、**失敗**である。

### ③ 追加の texmf.cnf 中で shell_escape_commands を指定

  * 現在の Kpathsea 変数 `$shell_escape_commands` の値を調べる。

    ```bash
    $ kpsewhich --var-value=shell_escape_commands
    bibtex,bibtex8,…(略)…,repstopdf
    ```

  * 先程作成（編集）した `«配置パス»/texmf.cnf` について、`test=OK` の行を以下のものに置き換える。

    ```
    shell_escape_commands=«先に調べた$shell_escape_commandsの値»,extractbb
    ```

    ※原則として一行で書く必要があるが、行末に `\` を入れると継続行と見做されるのでこれを利用して途中で改行できる。

  * 再び、変数 `$shell_escape_commands` の値を調べる。

    ```bash
    $ kpsewhich --var-value=shell_escape_commands
    bibtex,bibtex8,…(略)…,repstopdf,extractbb
    ```

    正しく `extractbb` が追加されていれば成功である。**→④に進む**

  * 何故か上手くいかないので、**失敗**である。

### ④ 実際に extractbb が起動されるかを調べる

  * 画像ファイル（EPS以外）を挿入するような適当な LaTeX 文書ファイルをコンパイルして、extractbb が自動起動されるかを確認する。
    <br>
    コンパイルが正常終了して、dvipdfmx の出力の PDF 文書中で画像が正常に挿入されれば成功。**→⑤に進む**
    <br>
    ※なお、コンパイル終了時に .xbb ファイルが存在するとは限らない。（最新の環境ではパイプ入力を行うのでファイルは生成されない。）

  * コンパイルが失敗して、その原因が extractbb が自動起動できなかったことにある場合、結局、設定は**失敗**したことになる。

    ※「extractbb が自動起動できなかった」場合、コンパイル時に以下のエラーが出る。

    ```
    ! LaTeX Error: File `image.xbb' not found. Use -shell-escape option to generate
     automatically.
    ```

    また、TeX のログファイルの中に次のような行が存在する。

    ```
    runsystem(extractbb image.png)...disabled.
    ```

### ⑤ 後処理

  * ②において、環境変数 `$TEXMFCNF` を設定した場合は、その設定を永続させる処理をする。例えば、`~/.bash_profile` に `export TEXMFCNF=«配置パス»:` を追記する。

## 補足

  * sudo が可能な場合に行うべき“普通の手順”については、「[TeX Wiki - Linux](http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?Linux)」を参照。
  * TeX Live 2015 以降では、extractbb が既定で「特別許可リスト」（`shell_escape_commands`）に含まれるようになる。従って、ユーザが自分で追加する設定自体が不要になる。

## 参考資料

  * [Debian-specific information about TeX packages Chapter 2 - Changing your configuration, file placement](https://people.debian.org/~preining/TeX/TeX-on-Debian/ch2.html)