VSCode＋TeXで論文執筆環境を構築したら想定以上に快適な環境が完成したので備忘録メモ

筆者は学生時代を最後に論文という文章を作成する環境とサヨナラしていました。しかし、幸運な巡り合わせにより、再び論文を書く機会を得ました。折角得られた機会を活かして学生時代論文やレポート作成で愛用していたTeX(LaTeX)を再び使ってみようと決意しました。学生時代はTeXStudioというOSSのエディターを利用していました。しかし、最近Visual Studio Code(以下VSCode)の進化が著しく、VSCodeで快適に執筆が出来る。。。物は試しと構築してみた所、予想以上に快適な環境が完成しました。今後も改良を続けて行くつもりですが、まずは構築方法を備忘録として残しておこうと思います。

# 環境情報
WSL2上のUbuntuとMacで環境構築を実行しました。

## Linux
* Ubuntu 22.04 @ WSL2
* Visual Studio Code 1.76.1
* TeX Live 2021

## Mac
* macOS 12.6.3 Monterey
* Visual Studio Code 1.76.1
* TeX Live 2021

# TeX Liveのインストール
まずはTeX形式のファイルをビルドするための様々なアプリケーションを含んだディストリビューションで最もメジャーであるTeX Liveをインストールします。

## Ubuntuの場合

### 2023/4/12更新: TeX Live 2023インストール
TeX Live 2021はもう使えないようです。証明書の期限切れエラーとなります(2023/4現在)。最新版のインストールは以下のリンクに詳しい説明が有ります。

https://texwiki.texjp.org/?Linux#texlive

<details><summary>旧バージョンインストール</summary><div>

当初フルバージョンをインストールしようと以下のコマンドを実行した所。。。

```bash
$ sudo apt install -y texlive-full
```
> 12時間 50分 16秒

と信じられない程時間を要すことが判明したので、最低限(日本語、英語)文書を作成出来る環境を構築することとし、以下のコマンドを実行しました。

```bash
sudo apt install -y texlive-lang-japanese
```

インストールが完了したら、latexindentというアプリケーションをインストールします。これをインストールせずにVSCode上でビルドを実行するとエラー終了します。Ubuntuの場合は、texlive-extra-utilsをインストールするとインストールされます。

```bash
sudo apt install -y texlive-extra-utils
```

aptでインストール可能なTeX Liveは2021であり、最新版(2022)はソースをビルドしてインストールが必要など煩雑です。よってしばらくTex Live 2021を利用できるようにtlmgrのリポジトリをTeX Live2021の物に変更し、フォントセットをインストールします。

```bash
sudo tlmgr init-usertree
sudo tlmgr option repository https://ftp.math.utah.edu/pub/tex/historic/systems/texlive/2021/tlnet-final/
sudo tlmgr install collection-fontsrecommended
```

</div></details>

## Macの場合
Homebrewを用いてインストールを実行します。

```bash
brew install --cask basictex
```

```bash
sudo tlmgr update --self --all
sudo tlmgr paper a4
sudo tlmgr install collection-langjapanese
```

Macでも同様にlatexindentをインストールします。

```bash
brew install latexindent
```

フォントセットをインストールします。

```bash
sudo tlmgr install collection-fontsrecommended
```

# VSCodeにLaTeX Workshop拡張機能の追加
VSCodeにLaTeX Workshop拡張機能をインストールします。コマンドでインストールする場合は、以下を実行します。拡張機能のストアからGUI操作でインストールすることも可能です。

```bash
code --install-extension james-yu.latex-workshop --force
```

# 自動ビルドの設定
`*.tex`ファイルが保存されたら、自動的にPDFにビルドされる様にビルドスクリプト(Recipe)及びビルドに必要なtoolを定義します。`settings.json`に以下を追記します。Ubuntuの場合、ptex2pdfの`-u`オプションを付けたままjsarticleドキュメントクラスのファイルのビルドを実行するとビルドエラーになります。設定追記後はVSCodeを再読み込みするか、再起動します。

:warning: 初回ビルドのみ自動で実行されず、Ctrl + Alt + B(Mac: option + command + B)を打鍵してビルドを実行させます。以降は保存される度にビルドが自動実行されます。

```json: Ubuntuの場合
  "latex-workshop.latex.autoBuild.run": "onFileChange",
  "latex-workshop.latex.recipes": [
    {
      "name": "ptex2pdf",
      "tools": ["ptex2pdf"]
    }
  ],
  "latex-workshop.latex.tools": [
    {
      "name": "ptex2pdf",
      "command": "ptex2pdf",
      "args": [
        "-l",
        "-ot",
        "-kanji=utf8 -synctex=1 -interaction=nonstopmode -file-line-error",
        "%DOC%"
      ]
    }
  ],
  "latex-workshop.view.pdf.viewer": "tab",
```

<details><summary>-u オプションを付けた時のエラーログ @ Ubuntu</summary><div>

```text
This is e-pTeX, Version 3.141592653-p3.9.1-210218-2.6 (utf8.euc) (TeX Live 2022/dev/Debian) (preloaded format=platex 2023.3.13)  13 MAR 2023 18:51
entering extended mode
 restricted \write18 enabled.
 file:line:error style messages enabled.
 %&-line parsing enabled.
**/home/user/manuscripts/textest/test2
(/home/user/manuscripts/textest/test2.tex
pLaTeX2e <2021-11-15> (based on LaTeX2e <2021-11-15> patch level 1)
L3 programming layer <2022-01-21> (/usr/share/texlive/texmf-dist/tex/platex/jsclasses/jsarticle.cls
Document Class: jsarticle 2021/06/28 jsclasses (okumura, texjporg)
\jsc@mpt=\dimen154
\jsc@mmm=\dimen155
\jsc@smallskipamount=\skip47
LaTeX Info: Redefining \textmc on input line 497.
LaTeX Info: Redefining \textgt on input line 499.
\symmincho=\mathgroup4
LaTeX Font Info:    Overwriting symbol font `mincho' in version `bold'
(Font)                  JY1/mc/m/n --> JY1/gt/m/n on input line 561.
LaTeX Font Info:    Font shape `JT1/mc/m/n' will be
(Font)              scaled to size 9.60999pt on input line 755.
LaTeX Font Info:    Font shape `JY1/mc/m/n' will be
(Font)              scaled to size 9.60999pt on input line 755.
\fullwidth=\dimen156
LaTeX Font Info:    Font shape `JT1/mc/m/n' will be
(Font)              scaled to size 7.68799pt on input line 908.
LaTeX Font Info:    Font shape `JY1/mc/m/n' will be
(Font)              scaled to size 7.68799pt on input line 908.
\c@part=\count184
\c@section=\count185
\c@subsection=\count186
\c@subsubsection=\count187
\c@paragraph=\count188
\c@subparagraph=\count189
\@abstractbox=\box67
\c@figure=\count190
\c@table=\count191
\abovecaptionskip=\skip48
\belowcaptionskip=\skip49
\jsc@tocl@width=\dimen157
\@lnumwidth=\dimen158
\bibindent=\dimen159
(/usr/share/texlive/texmf-dist/tex/platex/jsclasses/jslogo.sty
Package: jslogo 2019/07/25 okumura, texjporg
LaTeX Info: Redefining \TeX on input line 82.
LaTeX Info: Redefining \LaTeX on input line 135.
LaTeX Info: Redefining \LaTeXe on input line 188.
)
\heisei=\count192
) (/usr/share/texlive/texmf-dist/tex/platex/ipsj/ipsj.sty (/usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty
Package: geometry 2020/01/02 v5.9 Page Geometry
 (/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
Package: keyval 2014/10/28 v1.15 key=value parser (DPC)
\KV@toks@=\toks17
) (/usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty
Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead.
 (/usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
Package: iftex 2020/03/06 v1.0d TeX engine tests
))
\Gm@cnth=\count193
\Gm@cntv=\count194
\c@Gm@tempcnt=\count195
\Gm@bindingoffset=\dimen160
\Gm@wd@mp=\dimen161
\Gm@odd@mp=\dimen162
\Gm@even@mp=\dimen163
\Gm@layoutwidth=\dimen164
\Gm@layoutheight=\dimen165
\Gm@layouthoffset=\dimen166
\Gm@layoutvoffset=\dimen167
\Gm@dimlist=\toks18
) (/usr/share/texlive/texmf-dist/tex/platex/titlesec/titlesec.sty
Package: titlesec 2021/07/05 v2.14 Sectioning titles
\ttl@box=\box68
\beforetitleunit=\skip50
\aftertitleunit=\skip51
\ttl@plus=\dimen168
\ttl@minus=\dimen169
\ttl@toksa=\toks19
\titlewidth=\dimen170
\titlewidthlast=\dimen171
\titlewidthfirst=\dimen172
)) (/usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-dvips.def
File: l3backend-dvips.def 2022-01-12 L3 backend support: dvips
\l__pdf_internal_box=\box69
\g__pdf_backend_object_int=\count196
\l__pdf_backend_content_box=\box70
\l__pdf_backend_model_box=\box71
\g__pdf_backend_annotation_int=\count197
\g__pdf_backend_link_int=\count198
\g__pdf_backend_link_sf_int=\count199
) (./test2.aux)
\openout1 = `test2.aux'.

LaTeX Font Info:    Checking defaults for OML/cmm/m/it on input line 4.
LaTeX Font Info:    ... okay on input line 4.
LaTeX Font Info:    Checking defaults for OMS/cmsy/m/n on input line 4.
LaTeX Font Info:    ... okay on input line 4.
LaTeX Font Info:    Checking defaults for OT1/cmr/m/n on input line 4.
LaTeX Font Info:    ... okay on input line 4.
LaTeX Font Info:    Checking defaults for T1/cmr/m/n on input line 4.
LaTeX Font Info:    ... okay on input line 4.
LaTeX Font Info:    Checking defaults for TS1/cmr/m/n on input line 4.
LaTeX Font Info:    ... okay on input line 4.
LaTeX Font Info:    Checking defaults for OMX/cmex/m/n on input line 4.
LaTeX Font Info:    ... okay on input line 4.
LaTeX Font Info:    Checking defaults for U/cmr/m/n on input line 4.
LaTeX Font Info:    ... okay on input line 4.
LaTeX Font Info:    Checking defaults for JY1/mc/m/n on input line 4.
LaTeX Font Info:    ... okay on input line 4.
LaTeX Font Info:    Checking defaults for JT1/mc/m/n on input line 4.
LaTeX Font Info:    ... okay on input line 4.

*geometry* driver: auto-detecting
*geometry* detected driver: dvips
*geometry* verbose mode - [ preamble ] result:
* driver: dvips
* paper: <default>
* layout: <same size as paper>
* layoutoffset:(h,v)=(0.0pt,0.0pt)
* modes: 
* h-part:(L,W,R)=(62.328pt, 529.78906pt, 62.328pt)
* v-part:(T,H,B)=(93.49207pt, 754.17021pt, 77.91003pt)
* \paperwidth=597.49843pt
* \paperheight=845.04324pt
* \textwidth=529.78906pt
* \textheight=754.17021pt
* \oddsidemargin=-9.94199pt
* \evensidemargin=-9.94199pt
* \topmargin=-17.1869pt
* \headheight=20.0pt
* \headsep=18.40898pt
* \topskip=12.76073pt
* \footskip=31.16971pt
* \marginparwidth=36.98749pt
* \marginparsep=18.49374pt
* \columnsep=21.81479pt
* \skip\footins=16.0pt plus 5.0pt minus 2.0pt
* \hoffset=-6.87735pt
* \voffset=-6.87735pt
* \mag=913
* \@twocolumntrue
* \@twosidefalse
* \@mparswitchfalse
* \@reversemarginfalse
* (1in=72.27pt=25.4mm, 1cm=28.453pt)

LaTeX Font Info:    Font shape `JT1/mc/m/n' will be
(Font)              scaled to size 11.53198pt on input line 6.
LaTeX Font Info:    Font shape `JY1/mc/m/n' will be
(Font)              scaled to size 11.53198pt on input line 6.
LaTeX Font Info:    Font shape `JT1/gt/m/n' will be
(Font)              scaled to size 11.53198pt on input line 6.
LaTeX Font Info:    Font shape `JY1/gt/m/n' will be
(Font)              scaled to size 11.53198pt on input line 6.
LaTeX Font Info:    Font shape `JT1/gt/m/n' will be
(Font)              scaled to size 9.60999pt on input line 7.
LaTeX Font Info:    Font shape `JY1/gt/m/n' will be
(Font)              scaled to size 9.60999pt on input line 7.
[1

] (./test2.aux) ) 
Here is how much of TeX's memory you used:
 1572 strings out of 479850
 25018 string characters out of 5887378
 328994 words of memory out of 5000000
 19943 multiletter control sequences out of 15000+600000
 475744 words of font info for 59 fonts, out of 8000000 for 9000
 269 hyphenation exceptions out of 8191
 70i,5n,76p,197b,192s stack positions out of 5000i,500n,10000p,200000b,80000s

Output written on test2.dvi (1 page, 584 bytes).
```

</div></details>

```json: Macの場合
  "latex-workshop.latex.autoBuild.run": "onFileChange",
  "latex-workshop.latex.recipes": [
    {
      "name": "ptex2pdf",
      "tools": ["ptex2pdf"]
    }
  ],
  "latex-workshop.latex.tools": [
    {
      "name": "ptex2pdf",
      "command": "ptex2pdf",
      "args": [
        "-u",
        "-l",
        "-ot",
        "-kanji=utf8 -synctex=1 -interaction=nonstopmode -file-line-error",
        "%DOC%"
      ]
    }
  ],
  "latex-workshop.view.pdf.viewer": "tab",
```

# Snipettsを作成
Snipettsを作成しました。まだ最低限ですが、これから加筆修正して使いやすくしていく予定です。以下の内容を`latex.json`に書き込むとSnippetsとして利用出来ます。

```json
	"Normal Template for Doc": {
		"prefix": "normal",
		"body": [
			"\\documentclass[a4j, 12pt]{jsarticle}",
			"",
			"\\begin{document}",
			"",
			"$0",
			"",
			"\\end{document}",
		],
		"description": "Normal Template"
	}
```

# STYファイルを追加する方法
`*.sty`ファイルを追加する必要性が生じた時の為に追加方法をまとめておきたいと思います。`titlesec.sty`を追加する例で説明します。但し、この方法だとPCをリカバリーした時などに復旧が大変なのでホームディレクトリにシンボリックリンクを作ってバックアップが取りやすい様にしようと思っています。但し、CTANに格納されている`*.sty`を追加する場合は`tlmgr`コマンドでインストール可能です。

```bash
sudo tlmgr install <styファイル名>
```

## Ubuntuの場合

```bash
cd /usr/share/texlive/texmf-dist/tex/platex
sudo mkdir titlesec
cd titlesec/
sudo wget http://tug.ctan.org/tex-archive/macros/latex/contrib/titlesec/titlesec.sty
sudo mktexlsr
```

### シンボリックリンクの作成

```bash
ln -s /usr/share/texlive/texmf-dist/tex/platex ~/tex_stys
```

## Macの場合

```bash
cd /usr/local/texlive/2022basic/texmf-dist/tex/platex/
sudo mkdir titlesec
cd titlesec/
sudo wget http://tug.ctan.org/tex-archive/macros/latex/contrib/titlesec/titlesec.sty
sudo mktexlsr
```

### シンボリックリンクの作成

```bash
ln -s /usr/local/texlive/2022basic/texmf-dist/tex/platex/ ~/tex_stys
```

# 実際にTeXファイルをビルド
`*.tex`ファイルを編集して保存すると自動的にビルドが実行され、PDFが作成されます。編集せずにビルドする場合は、Ctrl + Alt + B(Mac: option + command + B)を打鍵します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/0b77eedc-6d05-95cc-2e1f-a853c9d89ec7.png)

![textest.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/2b2a8948-895f-8070-efb0-e0a0e77a4b8d.gif)

# まとめ
今回VSCodeでTeX文書作成環境を構築しました。これから利用しながら改良を重ねていこうと思います。まずは最低限動作する環境の構築を目指しましたが、昔調べた時と比較して操作が簡単になっている様な気がしました。技術の進歩には今更ながら脱帽です。

# Reference

https://texwiki.texjp.org/?Visual%20Studio%20Code%2FLaTeX

https://texwiki.texjp.org/?ptex2pdf

https://texwiki.texjp.org/?TeX%20Live

https://qiita.com/y-w/items/614843b259c04bb91495

https://qiita.com/ZoneTsuyoshi/items/c87e9ea2a76b552773d2

http://www2.otani.ac.jp/~yfukuda/platex/mojisize.html

https://mathlandscape.com/latex-size/

http://tug.ctan.org/tex-archive/macros/latex/contrib/titlesec/titlesec.sty

http://www.yamamo10.jp/yamamoto/comp/latex/make_doc/doc_settings/index.php

https://medemanabu.net/latex/documentclass/

https://texwiki.texjp.org/?ptex2pdf

https://zenn.dev/dannchu/articles/5da2d31a832458

https://github.com/James-Yu/LaTeX-Workshop/wiki

https://qiita.com/rainbartown/items/d7718f12d71e688f3573#latexmkrc-%E3%81%AE%E7%B7%A8%E9%9B%86

https://blog.cles.jp/item/13403

https://blog.cles.jp/item/13153