Sokratesさんの備忘録ないし雑記帳

書きたいことを書いている.駄文注意.

Windows Subsystem for Linux で Texdoc を使いたいというおはなし

Windows Subsystem for Linux (以下WSL)でTexdoc を使うための方法についての記事です.
元々はLaTeX 初心者が知るべきただ一つのコマンド - Sokratesさんの備忘録ないし雑記帳という記事のおまけにしていたのですが,分量的に分けたほうが良いと判断したので,別記事にします.

2022/2/26 追記: Windows 11 ビルド 22000 以上を使っている場合,GUI サポートが始まったため,この記事の前半の方法を使わなくても,WSL から Texdoc によってドキュメントを読めるようになりました.詳しいことは記事の最後に回しますが,「どうしても SumatraPDF などの Windows の pdf viewer で Texdoc のドキュメントを読みたい」などの事情がない限りは GUI サポートを利用した方が楽だと思います.追記終わり.

1. WSL で Texdoc を使えないんだけどォォォォォォ!!!

WSL ユーザーという原罪のため,Texdoc が使えないかわいそうな皆さん.こんばんは.私もそんな人間の一人です.私かわいそう.

WSL でたとえば,

$ texdoc texdoc

を実行すると

texdoc warning: DISPLAY is not set; your viewer will likely have problems.
texdoc warning: Try --list to list results instead of displaying them.

などと表示されブチ切れる羽目になります.これは残念ながら現状 WSL に対して,GUI はサポートされていないからだと考えられます(2022/2/26 追記: Windows 11 ビルド 22000 以上を使っている場合,GUI サポートがあります.そのため,この記事の方法を使わなくても,WSL から Texdoc によってドキュメントを読めるようになりました.追記終わり.*1.そのため,WSL 側から Windows の pdf viewer などを呼び出すように設定の変更をするしかありません*2.「おっ,なら設定ファイルを書き直せばいいんだな」と思われるかもしれませんが,ある事情から少し工夫をしないと,WSL の Texdoc と Windows の pdf viewer を連携させることができません.ここでは,その方法を紹介します.
基本的には下記のリンク先の方法と同じですが,一部私の工夫が入っています.
"DISPLAY is not set; your viewer will likely have problems" on Windows Subsystem for Linux · Issue #59 · TeX-Live/texdoc · GitHub

私程度が読むようなドキュメントは pdf であることが多いため,pdf を読むための方法しか紹介しませんが,ご了承ください.ただし,ここに書いてあるようなスクリプトをファイルの種類ごとに書いて,viewer として設定すればうまくいくとは思います*3

おそらく,この方法はディストリビューションなどに依存しないと考えられますが,動作確認は

  • エディション Windows 10 Home
  • バージョン 20H2
  • OS ビルド 19042.685

の中で WSL 2 の ubuntu-20.04 で行っています.
また,TeX Live の バージョンは 2019.20200218-1 です.

2. 方法の紹介の前の注意

あらかじめ申し上げますが,ここで紹介する方法で Texdoc から pdf ファイルを読めるようになっても Texdoc からの

texdoc warning: DISPLAY is not set; your viewer will likely have problems.
texdoc warning: Try --list to list results instead of displaying them.

というメッセージはナント消えません!バカな!そこをご了承の上で下記の方法を試してみてください.
また,わたしが普段使う pdf viewer が Sumatra PDF なので,例として,SumatraPDF を呼び出すように書いています.それ以外の pdf viewer を使いたい人々は適時そこを読み替えてお読みください.

3. WSL から Texdoc を呼び出すそんなに冴えているわけでもないやり方

ステップ 1.

pdf viewer を呼び出すための bash スクリプト*4を書きます(なぜそんな面倒なことをするのかは後で補足します).
次のような bashスクリプトを openpdf という名前*5で WSL の path が通っている場所に置きます*6
GitHub - Sokratesnil/wsl-scripts に同じスクリプトを置いてあるので,そちらからダウンロードしても構いません.

#!/bin/sh
for file in "$@"
do
  pathinwsl=`realpath $file`
  pathinwindows=`wslpath -w $pathinwsl`
  SumatraPDF.exe "$pathinwindows" &
done

この bash スクリプトの SumatraPDF.exe を他の好きな pdf viewer の実行ファイルに置き換えれば,その pdf viewer で texdoc が探してきた pdf ドキュメントを読めるはずです.たぶん. 2021/1/6 追記.実際,chrome.exe に置き換えることで Google Chrome で pdf の閲覧ができました.

openpdf を作ったら

$ chmod +x openpdf

とコマンドを実行して,実行者権限を付与してください.

ステップ 2.

Texdoc の設定ファイルを書きます.
Texdoc の設定ファイルを置く場所は

$ texdoc -f

を実行すると分かります.わたしの場合は

/usr/share/texlive/texmf-dist/scripts/texdoc/texdoclib.tlu 3.0
Configuration files are:
    active      /usr/share/texlive/texmf-dist/texdoc/texdoc.cnf
Recommended file(s) for personal settings:
    /home/xxx/texmf/texdoc/texdoc.cnf

などと表示されたので,/home/xxx/texmf/texdoc/ に設定ファイル texdoc.cnf を用意すれば良いことが分かります.もし,存在しないディレクトリなどが途中にあった場合は適時 mkdir texmf などを実行して,ディレクトリを作ってください.

さて,texdoc.cnf に次の一行を書きます.

viewer_pdf=openpdf

これは Texdoc の pdf viewer を指定しています.

ステップ 3. 最後に

$ texdoc texdoc

を実行してみて,エラーが出つつも pdf viewer が立ち上がり,Texdoc の公式ドキュメントを読むことができれば成功です.他のドキュメントも立ち上げてみましょう.

4.なぜこんな回りくどい方法を......

ここで紹介する方法は一見すると回り道に見えるかもしれません.普通に考えると,

viewer_pdf=SumatraPDF.exe

とすればうまくいきそうなのですが,読みたいドキュメントまでの path の指定が wsl と texdoc で食い違いが発生するようで,うまくドキュメントを開くことができません(かなしい). openpdf はその問題を解決するために path の変換をしてから pdf viewer に pdf ファイルを渡すようにしています.

"DISPLAY is not set; your viewer will likely have problems" on Windows Subsystem for Linux · Issue #59 · TeX-Live/texdoc · GitHub の方法(以下元ネタ)との違いと私の方法の違いも述べておきます(以下の二段落は興味のある方だけお読みください).
元ネタと私の方法は wsl と texdoc の path の食い違いを補正するという点は共通しています.問題は呼び出すアプリの違いです.元ネタの方法だと powershell.exe を呼び出すようにしています.しかし,これでは動作が重くなります.powershell.exe という重いソフトウェアを呼び出さない分によってわずかですが,動作が軽くなっています.
一方,元ネタのスクリプトだと,texdoc に呼び出されるファイルの拡張子に Windows 側で関連付けられているソフトウェアを呼び出すようになっているという利点があります.そのため,pdf 以外のドキュメントにもバリバリ目を通したい方は,もしかすると元のスクリプトを使ったほうが良いのかもしれません.

5.最後に

 このバグ(?)は WSL の GUI サポートが開始されれば解消されると予想されるため,texdoc 側で対応する予定はまったくないそうです(以下のリンクを参照).しょうがないね.
https://github.com/TeX-Live/texdoc/issues/59?s=09#issuecomment-720107960

2022/2/26 追記: Windows 11 ビルド 22000 以上を使っている場合,GUI サポートが始まったため,この記事の方法を使わなくても,WSL から Texdoc によってドキュメントを読めるようになりました.「どうしても SumatraPDF などの Windows の pdf viewer で Texdoc のドキュメントを読みたい」などの事情がない限りは GUI サポートを利用した方が楽だと思います.追記終わり.


A. GUI サポートを得た WSL で Texdoc を使う方法(2022/2/26 追記)

Windows 11 ビルド 22000 以上を使っている場合,GUI サポートが始まったため,もっと簡単に Texdoc を利用できるようになりました.ここではその場合の WSL および Texdoc の設定の仕方を軽く説明します.

注意:WSL で使えないような Sumatra PDF などの pdf viewer をどうしても使いたい場合や WSL1 を使いたい場合などは,結局上の GUI サポートに頼らない設定をする必要があります.

WSL の GUI サポートを使う方法について

前提として,Windows 11 ビルド 22000 以上であることが必要です.また,使っているシステムに対応する vGPU 用のドライバーをインストールする必要があります.詳しいことは公式ドキュメントWSL で Linux GUI アプリを実行する | Microsoft Docsの「前提条件」を読んでください.

pdf viewer をインストールする.

WSL のGUI サポートを使えるようになったら,適当な pdf viewer を WSL に入れてください.たとえば,ubuntu ディストリビューションで evince をインストールする場合は,

$sudo apt update
$sudo apt upgrade
$sudo apt install evince

とすれば良いです(debian と Kali linux なら同じコマンドでいけるはず).

pdf viewer を設定する

pdf viewer をインストールできたら, Texdoc の設定ファイルを書きます.Texdoc の設定ファイルを置く場所は

$ texdoc -f

を実行すると分かります.わたしの場合は

/usr/share/texlive/texmf-dist/scripts/texdoc/texdoclib.tlu 3.0
Configuration files are:
    active      /usr/share/texlive/texmf-dist/texdoc/texdoc.cnf
Recommended file(s) for personal settings:
    /home/xxx/texmf/texdoc/texdoc.cnf

などと表示されたので,/home/xxx/texmf/texdoc/ に設定ファイル texdoc.cnf を用意すれば良いことが分かります.もし,存在しないディレクトリなどが途中にあった場合は適時 mkdir texmf などを実行して,ディレクトリを作ってください.

さて,たとえば,evince で texdoc のドキュメントを読むようにしたい場合は texdoc.cnf に次の一行を書きます.

viewer_pdf=evince

使いたい pdf viewer が他にあるならば,"evince"の部分をその pdf viewer を呼び出すコマンドに置き換えてください.

追記終わり.

*1:WSL の GUI については,サードパーティ製のものが存在するそうですが,私は使ったことありません.もし,そういう製品を使ったらここに書いてあるような問題は起こらないのかもしれないですが,どうなんですかね.よくわからない.2022/2/26 追記: Windows 11 ビルド 22000 以上を使っている場合,GUI サポートがあります.追記終わり.

*2:または,WSL から Texdoc を立ち上げることを諦めて,Windows 側にTeX Live を入れるかです.昔の私のように(わたしかわいそう).

*3:試してないですが.

*4:実は以前あげていたものと少し変えています.WSL の Texdoc を使う分には以前のもので十分なのですが,たとえば,以前のバージョンの openpdf で Windows 下の pdf ファイルを開こうとすると,開くことができません.これは,以前のバージョンでは SumatraPDF.exe に渡す path の変換を WSL に任せてしまっているためです.汎用性を上げるために SumatraPDF.exe に渡す path を明示的に変換するように変更しました.

*5:名前は他のものでも良いですが,わかりやすい名前にした方が良いと考えます.

*6:ちなみに,動作確認の際は~/bin/openpdf としました.