latexindentの設定をカスタマイズして使う

#はじめに
latexindentというLaTeXのソースを自動で成形してくれるツールがある。
設定の仕方を毎回忘れるのでここに書き留めておく。

#前提
TeX Liveをインストールした状態のWindowsもしくはLinux

##Windows
本来latexindentはPerlで書かれているのでPerl環境が必要だが、TeX Liveにバイナリが同梱されているのでPerl環境なしで動く。
LaTeX-Workshopを使っていたらVSCode上で `shift`+`alt`+`F` すると成形される。

##Linux
Linuxではバイナリが同梱されてないのでPerl環境が必要になる。
`# pacman -S perl perl-CPAN`
などでインストールする。

この状態で
`# latexindent`
とするとライブラリがないと怒られるので足りないライブラリを
`# cpan Log::Log4perl`
などでCPANからライブラリを導入していく。
これに関しては[この記事](https://gist.github.com/serihiro/9fc160d547199f23718515dd4f9b2978)が詳しい。

#設定
latexindentはデフォルトの設定だとぐちゃぐちゃなインデントをしてしまうので、設定を変更する。
latexindentの設定は`defaultSettings.yaml`というファイルで行う。

##ファイルの場所

###Windows
Windowsでの場合、たいてい設定ファイルは以下の場所にある。
`texlive\2020\texmf-dist\scripts\latexindent\defaultSettings.yaml`
この場所にない場合、Linuxの項目に示した方法でパスを調べる。

###Linux
Linuxの場合、ディストリビューションによって生成される場所が異なるので
`# latexindent`
を実行すると作業ディレクトリに生成される`indent.log`を参照して`defaultSetting.yaml`のファイルパスを確認する。

```indent.log
...
INFO: YAML settings read: defaultSettings.yaml
      Reading defaultSettings.yaml from /usr/share/texmf-dist/scripts/latexindent/defaultSettings.yaml
...
```

##defaultSettings.yaml
使いそうな設定項目を取り上げていく。
ごく一部しか取り上げられていないので、詳細は以下のドキュメントを参照してほしい。
https://latexindentpl.readthedocs.io/en/latest/sec-default-user-local.html

###バックアップファイルに関する設定
latexindentは実行するたび`myfile.bak0` `myfile.bak1` `myfile.bak2`のようにバックアップファイルが生成されるが、
下記の設定項目を`1`にすると、一つのバックアップファイルを上書きしていくようになる。

```defaultSettings.yaml
# only one backup per file: 
#   - if onlyOneBackUp is 0 then, as a safety measure, 
#     the number on the extension increments by 1 each time:
#
#           myfile.bak0, myfile.bak1, myfile.bak2
#   - if you set onlyOnebackUp to 1, then the backup file will
#     be overwritten each time (not recommended until you trust the script)
onlyOneBackUp: 1
```

`0`にしておいたほうが安全は安全だが慣れてくると邪魔になるので`1`にする。

###図表環境におけるインデントの設定
tabularなどでのインデントに関する設定は下記の項目で行う。


```defaultSettings.yaml
# name of code blocks that should have their body aligned at ampersand delimiters
lookForAlignDelims:
   tabular: 
      delims: 1
      alignDoubleBackSlash: 1
      spacesBeforeDoubleBackSlash: 2        #変えた
      multiColumnGrouping: 0
      alignRowsWithoutMaxDelims: 1
      spacesBeforeAmpersand: 2              #変えた
      spacesAfterAmpersand: 1
      justification: left
      alignFinalDoubleBackSlash: 0
      dontMeasure: 0
      delimiterRegEx: '(?<!\\)(&)'
      delimiterJustification: left
   tabularx:
      delims: 1
   longtable: 1
   tabu: 1
   array: 1
   matrix: 1
   bmatrix: 1
   Bmatrix: 1
   pmatrix: 1
   vmatrix: 1
   Vmatrix: 1
   align: 1
   align*: 1
   alignat: 1
   alignat*: 1
   aligned: 1
   cases: 1
   dcases: 1
   listabla: 1
```

セル間のスペースと最後の`\\`とのスペースを`1`から`2`にしている。[^1]

###itemize環境などにおけるインデントの設定
`\item`などの後にインデントがいらない場合は`0`に設定する。

```defaultSettings.yaml
# if you want the script to look for \item commands 
# and format it, as follows (for example),
#       \begin{itemize}
#           \item content here
#                 next line is indented
#                 next line is indented
#           \item another item
#       \end{itemize}
# then populate indentAfterItems. See also itemNames
indentAfterItems:
    itemize: 1
    enumerate: 1
    description: 1
    list: 1
```

###章・段落の後のインデントの設定
`\section`などのあとにインデントをするかを設定する。

```defaultSettings.yaml
# if you want to add indentation after
# a heading, such as \part, \chapter, etc
# then populate it in here - you can add 
# an indent rule to indentRules if you would 
# like something other than defaultIndent
#
# you can also change the level if you like, 
# or add your own title command
indentAfterHeadings:
    part:
       indentAfterThisHeading: 1        #変えた
       level: 1
    chapter: 
       indentAfterThisHeading: 1        #変えた
       level: 2
    section:
       indentAfterThisHeading: 1        #変えた
       level: 3
    subsection:
       indentAfterThisHeading: 1        #変えた
       level: 4
    subsection*:
       indentAfterThisHeading: 1        #変えた
       level: 4
    subsubsection:
       indentAfterThisHeading: 1        #変えた
       level: 5
    paragraph:
       indentAfterThisHeading: 1        #変えた
       level: 6
    subparagraph:
       indentAfterThisHeading: 1        #変えた
       level: 7
```

デフォルトだと`0`だが`1`にすると圧倒的に見やすい。

また、インデントを何で行うか以下の項目で設定する。
`"\t"`だとタブでインデントが行われる。スペースを使いたい場合は`" "`のようにする。

```defaultSettings.yaml
# if you have indent rules for particular code blocks
# then you can populate them in indentRules; for example, you might just want 
# to use a space " " or maybe a double tab "\t\t"
indentRules:
   myenvironment: "\t\t"
   anotherenvironment: "\t\t\t\t"
   chapter: "\t"                        #変えた
   section: "\t"                        #変えた
   item: "\t"                           #変えた
   myitem: "\t"                         #変えた
```


#おわりに
設定できる項目はこんなものじゃないので
https://latexindentpl.readthedocs.io/en/latest/sec-default-user-local.html
をみて各個人の最高の設定を作り出して最高のLaTeXライフを送りましょう。


[^1]: しかし日本語文字が含まれていると設定しても結局インデントがずれる