VSCode + WSLの環境におけるlatexmkによるコンパイルについて

VSCode + WSLの環境におけるlatexmkによるコンパイルについて

- kursk KURSK の投稿
返信数: 4
VSCode + WSL の環境でLaTeXを使いたいと考えて、https://qiita.com/popunbom/items/7d02fc75ad23b735d28c の記事を参考にして環境を構築しました。 この際、上記記事はWSL用のものではなかったため、WSL用の記事も参考にしながら進めた結果、WSL側とWindows側にTexLiveが2重にインストールされている状況(WSLのターミナルとコマンドプロンプトのどちらでもplatexコマンドが使える)になったため、PCの容量節約のためにCドライブ直下のtexliveフォルダを削除しました。 この結果、platexコマンドなどはwsl上のターミナルでは使えるが、コマンドプロンプト上では使えないという状態になりました。 この状態では、ターミナル上でコマンドを使ってコンパイルすることはできるのですが、VSCode上で「Build LaTeX project」ボタンを使ってコンパイルすることはできなくなりました。 おそらくsettings.jsonファイル内の設定がwindows上のTexLiveを想定したものになっているからだと思うのですが、設定の仕方がわかりません。 どうかご教授ください。
コンパイルを実行しようとした際、画面右下に「Recipe terminated with fatal error: spawn latexmk ENOENT.」と表示されます。
またターミナルの出力タブに表示されるメッセージは以下の通りです。
今回はC:\tex\report.tex のコンパイルを試みました。
[02:33:35] BUILD command invoked.
[02:33:35] The document of the active editor: file:///c%3A/tex/report.tex
[02:33:35] The languageId of the document: latex
[02:33:35] Current workspace folders: undefined
[02:33:35] Current workspaceRootDir:
[02:33:35] Found root file from active editor: c:\tex\report.tex
[02:33:35] Keep using the same root file: c:\tex\report.tex
[02:33:35] Building root file: c:\tex\report.tex
[02:33:35] Build root file c:\tex\report.tex
[02:33:35] outDir: c:/tex
[02:33:35] Recipe step 1: latexmk, -f,-gg,-pv,-xelatex,-synctex=1,-interaction=nonstopmode,-file-line-error,c:/tex/report
[02:33:35] Recipe step env: undefined
[02:33:35] cwd: c:\tex
[02:33:35] LaTeX build process spawned. PID: 37964.
[02:33:35] LaTeX fatal error: spawn latexmk ENOENT, 'latexmk' �́A�����R�}���h�܂��͊O���R�}���h�A
����\�ȃv���O�����܂��̓o�b�` �t�@�C���Ƃ��ĔF������Ă��܂���B
. PID: 37964.
[02:33:35] Does the executable exist? PATH: undefined
[02:33:35] The environment variable $SHELL: undefined
[02:33:37] Manager.fileWatcher.getWatched: {"c:\\tex":["report.tex"]}
[02:33:37] Manager.filesWatched: ["c:\\tex\\report.tex"]
[02:33:37] BibWatcher.bibWatcher.getWatched: {}
[02:33:37] BibWatcher.bibsWatched: []
[02:33:37] PdfWatcher.pdfWatcher.getWatched: {}
[02:33:37] PdfWatcher.pdfsWatched: []
settings.jsonファイルや.latexmkrcファイルは上記qiita記事に掲載されているものをそのままペーストして追記したものです。また.latexmkrcはユーザーフォルダ直下やCドライブ直下、report.texが存在するフォルダ直下などに配置して試行してみましたが、どれもうまくいきませんでした。
Windowsのバージョン:バージョン2004(OSビルド 19041.1237)
VSCodeのバージョン:「更新の確認」ボタンを押したところ、「現在入手可能な更新はありません。」と表示されました。
追記:WSL上でのLaTeXのインストールは、
sudo apt update sudo apt upgrade sudo apt install texlive-full sudo cpan Log::Log4perl Log::Dispatch
以上の4コマンドをターミナルに入力しました。
kursk KURSK への返信

Re: VSCode + WSLの環境におけるlatexmkによるコンパイルについて

- 和田 勇 の投稿
>Recipe step 1: latexmk, -f,-gg ...
>...
>LaTeX fatal error: spawn latexmk ENOENT, 'latexmk' ...

となっているので、お見立てのようにVScode の場所から wsl にインストールされた latexmk を呼び出せていない ですね、

試してないけど https://event.phys.s.u-tokyo.ac.jp/physlab2021/advent-calendar/epexwm73p/ の方を参考にされたらどうでしょうか?

ポイントは、wsl の世界にある texlive のコマンドは

wsl.exe latexmk ...

とか

wsl.exe ptex2pdf -l ....

のようにするためのラッパースクリプトを文中では、/mnt/c/latex-tools.sh として利用されているようです。

動かなければ、 wsl.exe tlmgr conf をコマンドプロンプトで実行した結果と setting.json の latex 関連を見せてください。

なお Cドライブ直下の .latexmkrc は通常は参照しません。
和田 勇 への返信

Re: VSCode + WSLの環境におけるlatexmkによるコンパイルについて

- kursk KURSK の投稿
返信ありがとうございます。ご紹介いただいた記事そのままではうまく動作できなかった(シェルスクリプトの内容でエラーが出た?)のですが、下記の記事を参考にして、wslpath 機能を使えば一部はうまく動作させることができました。
https://qiita.com/ryoi084/items/967315f3ad6a20734ffd
現在のsettings.json ファイルの中身は以下のようになっています。
"latex-workshop.view.pdf.viewer": "tab",
"latex-workshop.latex.tools": [
{
"name": "latexmk",
"command": "wsl.exe",
"args": [
"latexmk",
"-synctex=1",
"-interaction=nonstopmode",
"-file-line-error",
"-pdf",
"`wslpath %DOC%`"
]
},
{
"name": "pdflatex",
"command": "wsl.exe",
"args": [
"pdflatex",
"-synctex=1",
"-interaction=nonstopmode",
"-file-line-error",
"`wslpath %DOC%`"
]
},
{
"name": "bibtex",
"command": "wsl.exe",
"args": [
"bibtex",
"`wslpath %DOCFILE%`"
]
},
{
"name":"ptex2pdf",
"command": "wsl.exe",
"args": [
"ptex2pdf",
"-l",
"-ot",
"-kanji=utf8 -synctex=1",
"-interaction=nonstopmode",
"`wslpath %DOC%`"
]
},
{
"name":"ptex2pdf (uplatex)",
"command": "wsl.exe",
"args": [
"ptex2pdf",
"-l",
"-u",
"-ot",
"-kanji=utf8 -synctex=1",
"-interaction=nonstopmode",
"`wslpath %DOC%`"
]
},
{
"name": "pbibtex",
"command": "wsl.exe",
"args": [
"pbibtex",
"-kanji=utf8",
"`wslpath %DOCFILE%`"
]
}
],
//レシピの設定
"latex-workshop.latex.recipes": [
{
"name": "ptex2pdf",
"tools": [
"ptex2pdf"
]
},
{
"name": "latexmk",
"tools": [
"latexmk"
]
},
{
"name": "pdflatex",
"tools": [
"pdflatex",
]
},
{
"name": "pdflatex -> bibtex -> pdflatex",
"tools": [
"pdflatex",
"bibtex",
"pdflatex",
]
},
{
"name": "ptex2pdf -> pbibtex -> ptex2pdf",
"tools": [
"ptex2pdf",
"pbibtex",
"ptex2pdf",
]
},
{
"name": "ptex2pdf (uplatex)",
"tools": [
"ptex2pdf (uplatex)",
]
},
{
"name": "ptex2pdf (uplatex) -> pbibtex -> ptex2pdf (uplatex)",
"tools": [
"ptex2pdf (uplatex)",
"pbibtex",
"ptex2pdf (uplatex)",
]
},
],
"latex-workshop.latex.autoBuild.run": "never"
ただし、この設定に変えてからもlatexmkによるコンパイルはうまくできませんでした。ですが、これはおそらく.latexmkrcの内容によるエラーだと思うので、現在のコンパイル方法で事足りる以上、latexmkの書き方については後で自分で勉強してみようと思います。
以下はwsl.exe tlmgr conf をコマンドプロンプトで実行した結果です。

(running on Debian, switching to user mode!)
=========================== version information ==========================
tlmgr revision 53568 (2020-01-27 19:20:16 +0100)
tlmgr using installation: /usr/share/texlive
TeX Live (http://tug.org/texlive) version 2019
==================== executables found by searching PATH =================
PATH: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/mnt/c/Program Files (x86)/Common Files/Oracle/Java/javapath:/mnt/c/Program Files (x86)/Intel/iCLS Client/:/mnt/c/Program Files/Intel/iCLS Client/:/mnt/c/Windows/system32:/mnt/c/Windows:/mnt/c/Windows/System32/Wbem:/mnt/c/Windows/System32/WindowsPowerShell/v1.0/:/mnt/c/Program Files (x86)/Intel/Intel(R) Management Engine Components/DAL:/mnt/c/Program Files/Intel/Intel(R) Management Engine Components/DAL:/mnt/c/Program Files (x86)/Intel/Intel(R) Management Engine Components/IPT:/mnt/c/Program Files/Intel/Intel(R) Management Engine Components/IPT:/mnt/c/Program Files (x86)/NVIDIA Corporation/PhysX/Common:/mnt/c/Windows/system32:/mnt/c/Windows:/mnt/c/Windows/System32/Wbem:/mnt/c/Windows/System32/WindowsPowerShell/v1.0/:/mnt/c/Windows/System32/OpenSSH/:/mnt/c/Program Files/NVIDIA Corporation/NVIDIA NvDLISR:/mnt/c/Users/(Windowsのユーザー名)/AppData/Local/Microsoft/WindowsApps:/mnt/c/Users/(Windowsのユーザー名)/AppData/Local/Programs/Microsoft VS Code/bin:/mnt/c/texlive/2021/bin/win32
dvipdfmx: /usr/bin/dvipdfmx
dvips: /usr/bin/dvips
fmtutil: /usr/bin/fmtutil
kpsewhich: /usr/bin/kpsewhich
luatex: /usr/bin/luatex
mktexpk: /usr/bin/mktexpk
pdftex: /usr/bin/pdftex
tex: /usr/bin/tex
tlmgr: /usr/bin/tlmgr
updmap: /usr/bin/updmap
xetex: /usr/bin/xetex
=========================== active config files ==========================
config.ps: /usr/share/texlive/texmf-dist/dvips/config/config.ps
fmtutil.cnf: /usr/share/texmf/web2c/fmtutil.cnf
mktex.cnf: /etc/texmf/web2c/mktex.cnf
pdftexconfig.tex: /var/lib/texmf/tex/generic/config/pdftexconfig.tex
texmf.cnf: /etc/texmf/web2c/texmf.cnf
texmf.cnf: /usr/share/texmf/web2c/texmf.cnf
texmf.cnf: /usr/share/texlive/texmf-dist/web2c/texmf.cnf
updmap.cfg: /usr/share/texmf/web2c/updmap.cfg
updmap.cfg: /usr/share/texlive/texmf-dist/web2c/updmap.cfg
============================= font map files =============================
kanjix.map: /var/lib/texmf/fonts/map/dvipdfmx/updmap/kanjix.map
pdftex.map: /var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map
ps2pk.map: /var/lib/texmf/fonts/map/dvips/updmap/ps2pk.map
psfonts.map: /var/lib/texmf/fonts/map/dvips/updmap/psfonts.map
=========================== kpathsea variables ===========================
ENCFONTS=.:{{}/home/(Ubuntuのユーザー名)/.texlive2019/texmf-config,/home/(Ubuntuのユーザー名)/.texlive2019/texmf-var,/home/(Ubuntuのユーザー名)/texmf,!!/usr/local/share/texmf,/etc/texmf,!!/var/lib/texmf,!!/usr/share/texmf,!!/usr/share/texlive/texmf-dist}/fonts/enc//
SYSTEXMF=/var/lib/texmf:/usr/local/share/texmf:/usr/share/texlive/texmf-dist:/usr/share/texmf
TEXCONFIG={{}/home/(Ubuntuのユーザー名)/.texlive2019/texmf-config,/home/(Ubuntuのユーザー名)/.texlive2019/texmf-var,/home/(Ubuntuのユーザー名)/texmf,!!/usr/local/share/texmf,/etc/texmf,!!/var/lib/texmf,!!/usr/share/texmf,!!/usr/share/texlive/texmf-dist}/dvips//
TEXFONTMAPS=.:{{}/home/(Ubuntuのユーザー名)/.texlive2019/texmf-config,/home/(Ubuntuのユーザー名)/.texlive2019/texmf-var,/home/(Ubuntuのユーザー名)/texmf,!!/usr/local/share/texmf,/etc/texmf,!!/var/lib/texmf,!!/usr/share/texmf,!!/usr/share/texlive/texmf-dist}/fonts/map/{kpsewhich,pdftex,dvips,}//
TEXMF={{}/home/(Ubuntuのユーザー名)/.texlive2019/texmf-config,/home/(Ubuntuのユーザー名)/.texlive2019/texmf-var,/home/(Ubuntuのユーザー名)/texmf,!!/usr/local/share/texmf,/etc/texmf,!!/var/lib/texmf,!!/usr/share/texmf,!!/usr/share/texlive/texmf-dist}
TEXMFCONFIG=/home/(Ubuntuのユーザー名)/.texlive2019/texmf-config
TEXMFDBS={!!/usr/local/share/texmf,!!/var/lib/texmf,!!/usr/share/texmf,!!/usr/share/texlive/texmf-dist}
TEXMFDIST=/usr/share/texlive/texmf-dist
TEXMFHOME=/home/(Ubuntuのユーザー名)/texmf
TEXMFLOCAL=/usr/local/share/texmf
TEXMFMAIN=/usr/share/texlive/texmf-dist
TEXMFSYSCONFIG=/etc/texmf
TEXMFSYSVAR=/var/lib/texmf
TEXMFVAR=/home/(Ubuntuのユーザー名)/.texlive2019/texmf-var
TEXPSHEADERS=.:{{}/home/(Ubuntuのユーザー名)/.texlive2019/texmf-config,/home/(Ubuntuのユーザー名)/.texlive2019/texmf-var,/home/(Ubuntuのユーザー名)/texmf,!!/usr/local/share/texmf,/etc/texmf,!!/var/lib/texmf,!!/usr/share/texmf,!!/usr/share/texlive/texmf-dist}/{dvips,fonts/{enc,type1,type42,type3}}//
VARTEXFONTS=/tmp/texfonts
WEB2C={{}/home/(Ubuntuのユーザー名)/.texlive2019/texmf-config,/home/(Ubuntuのユーザー名)/.texlive2019/texmf-var,/home/(Ubuntuのユーザー名)/texmf,!!/usr/local/share/texmf,/etc/texmf,!!/var/lib/texmf,!!/usr/share/texmf,!!/usr/share/texlive/texmf-dist}/web2c
==== kpathsea variables from environment only (ok if no output here) ====
kursk KURSK への返信

Re: VSCode + WSLの環境におけるlatexmkによるコンパイルについて

- 和田 勇 の投稿

回答ありがとうございました。備忘録を兼ねてちょっとまとめました

  • %DOC% や %DOCFILE% が以下のように取り扱われるようですので wslpath で windows の path を wsl 風に変換というのは妥当ですね もしかしたら %DOCFILE% であれば wslpath もいらないかもしれない

    情報源 https://aumisb.github.io/2019/06/09/visual-studio-code-for-tex.html

    変数名 意味
    %DOC% The LaTeX root file path and name without the .tex extension
    %DOCFILE% The LaTeX root file      name without the .tex extension
    %DIR% The LaTeX root file path
    %TMPDIR% A temporary folder for storing ancillary files
    %OUTDIR% The output directory configured in latex-workshop.latex.outDir
  • wsl で apt install した texlive は 2019 ですね。

  • latexmkrc の参照先について

    • wsl 側の Ubuntuのユーザー名のホームディレクトリ直下の .latexmkrc
    • カレントディレクトリの .latexmkrc
    • 両方あった場合は、 wsl latexmk -C を実行すると以下のように表示されます。

     Rc files read:
        /home/(Ubuntuのユーザー名)/.latexmkrc
       .latexmkrc
     Latexmk: This is Latexmk ... 省略
     
  • 追記 ...「環境変数編集」で PATH から C:\texlive\2021\bin\win32 を削除しておいた方が良いと思います。

kursk KURSK への返信

Re: VSCode + WSLの環境におけるlatexmkによるコンパイルについて

- kursk KURSK の投稿
今更ですが、環境を再構築してみたところうまく動作させることができましたので備忘録を兼ねて書いておきたいと思います。

まず、質問投稿時点でうまくいっていなかった原因は、VSCodeの拡張機能である「LaTeX Workshop」が、Windows上のVSCodeにのみインストールされており、「Remote - WSL」によって作られたUbuntu環境のWSLにはインストールされていなかったことが原因だと思われます。これを解消するためには先に「Remote - WSL」をインストールし、画面左下にWSL: Ubuntuと表示されている状態でLaTeX WorkshopをWSL側にインストールしなければならないです。

また、WSL上のVSCodeを使用した場合はwslpath構文も不必要であり、またコマンドをwsl.exeに置換する必要もありませんでした。LuaLaTeXによるコンパイルのみを想定しているものですが、一応settings.jsonファイルの中身と.latexmkrcファイルの中身を記載しておきます。.latexmkrcファイルはカレントディレクトリに配置しました。

settings.json

"latex-workshop.latex.recipes":[
{
"name": "LuaLatex",
"tools": ["lualatexmk"]
}
],
"latex-workshop.latex.tools": [
{
"name" : "lualatexmk",
"command" : "latexmk",
"args":[
"-synctex=1",
"-halt-on-error",
"-interaction=nonstopmode",
"-file-line-error",
"%DOC%"
]
}
]

.latexmkrc

$lualatex = 'lualatex %O %S';
$bibtex = 'bibtex %O %B';
$max_repeat = 5;
$pdf_mode = 4;