.latexmkを使いこなしたい

# .latexmkってわけわからんけど…

* BiBTeXでうまく日本語論文と英語論文を表示したい
* APAのように文中引用と文末引用を異なる形式で行いたい
* LuaLaTeX や (u)pLaTeX, XeTeXまで対応したい
* 同じのレポジトリに異なるOSからアクセスしたい
    * LaTeXコンパイルを行いたい
    * OSに依って異なるPDFビューアーを使ってリアルタイムに更新を行いたい

全てを叶えるべく.latexmkを作成しました．

```Perl
#!/usr/bin/env perl
# $ENV{'TEXINPUTS'}='./tex//:' . $ENV{'TEXINPUTS'}; 
$ENV{'BSTINPUTS'}='./sty//:' . $ENV{'BSTINPUTS'};

# $ENVについては'locate texmf.cnf'で変数名称を確認すること
# https://ja.overleaf.com/learn/latex/Questions/I_have_a_lot_of_.cls%2C_.sty%2C_.bst_files%2C_and_I_want_to_put_them_in_a_folder_to_keep_my_project_uncluttered._But_my_project_is_not_finding_them_to_compile_correctly

##-----------------------------------------------------------------------------
## latex options
##-----------------------------------------------------------------------------
$latexargs       = '  -shell-escape  -synctex=1  -file-line-error';
$latexsilentargs = $latexargs. '  -interaction=batchmode';
# -synctex=1 … プレビュー画面からソースコードの該当箇所に移動できるようにします
# -shell-escape … 任意の外部コマンドの実行(mintedのpygmentsなど)
# -halt-on-error … コンパイル中にエラーが発生した場合、コンパイルを終了します
# -interaction=nonstopmode … コンパイル中にエラーが起きても、ユーザーにどう処理するかの指示を求めずにコンパイルを続行します(-interaction=batchmode)
# -file-line-error … TeXファイルの何行目でエラーが発生したかを表示します(https://tex.stackexchange.com/questions/258814/what-is-the-difference-between-interaction-nonstopmode-and-halt-on-error)

$args = $latexargs; # $latexsilentargs or $latexsargs


##-----------------------------------------------------------------------------
## latex
##-----------------------------------------------------------------------------
# ここで指定を行わないと自動保管される(defolt値は変更されず-no-shell-escapeで実行される)
$latex    = 'platex  -synctex=1';
$uplatex  = 'uplatex  -kanji=utf8  -no-guess-input-enc'.$args;
$pdflatex = 'pdflatex'.$args;
$lualatex = 'lualatex'.$args;
$xelatex  = 'xelatex'.$args;

$lualatex_silent_switch = 'lualatex'. $latexsilentargs;
# 実行時の-silentオプションを使用した場合に，コンパイルするコマンドの設定


##-----------------------------------------------------------------------------
## pdf_mode
##-----------------------------------------------------------------------------
# $pdf_mode         = 0; # $latexによりdviファイルを生成する。PDFを出力しない
# $pdf_mode         = 1; # $pdflatexを使ってdviファイルなどを経由せずに直接PDFを作成
# $pdf_mode         = 2; # $latexにより生成されたdviファイルを$dvipsによりpsファイルに変換したあと、$ps2pdfによりPDFを作成
# $pdf_mode         = 3; # $latexによりdviファイルを生成し、$dvipdfによりPDFを作成
$pdf_mode         = 4; # $lualatexにより直接PDFを作成
# $pdf_mode         = 5; # $xelatexによりdviファイルを生成後、$xdvipdfmxによりPDFを作成


##-----------------------------------------------------------------------------
## BiB
##-----------------------------------------------------------------------------
$bibtex    = 'upbibtex';# 'pbibtex';
$biber     = 'biber %O --bblencoding=utf8 -u -U --output_safechars %B';
# –bblencoding=utf8 … bblファイル（参考文献ファイル）の文字コードをUTF-8にします
# -u … 入力ファイルの文字コードをUTF-8にします
# -U … 出力ファイルの文字コードをUTF-8にします
# –output_safechars … ユニコード文字をLaTeXの命令を使ってエンコードした形で出力させます


##-----------------------------------------------------------------------------
## index
##-----------------------------------------------------------------------------
$makeindex = 'upmendex %O -o %D %S';


##-----------------------------------------------------------------------------
## dvi (lualtex使用のため不活性化)
##-----------------------------------------------------------------------------
$dvipdf = 'dvipdfmx %O -o %D %S';
$dvips  = 'dvips %O -z -f %S | convbkmk -u > %D';
$ps2pdf = 'ps2pdf.exe %O %S %D';


##-----------------------------------------------------------------------------
# preview
##-----------------------------------------------------------------------------
$pvc_view_file_via_temporary = 0;
# -pvc実行時に残す待避データの保管数

## for Windows-----------------------------------------------------------------------------
if ($^O eq 'MSWin32') { # SumatraPDF を Windowsだとpathが違う気がする
  if (-f 'C:/Program Files/SumatraPDF/SumatraPDF.exe') {
    $pdf_previewer = '"C:/Program Files/SumatraPDF/SumatraPDF.exe" -reuse-instance';
  } elsif (-f 'C:/Program Files (x86)/SumatraPDF/SumatraPDF.exe') {
    $pdf_previewer = '"C:/Program Files (x86)/SumatraPDF/SumatraPDF.exe" -reuse-instance';
  } else {
    $pdf_previewer = 'SumatraPDF -reuse-instance';
    # $pdf_previewer = 'texworks'; 
  }

## for Linux-----------------------------------------------------------------------------
} elsif ($^O eq 'linux') {
  if (-d '/mnt/c/Windows/') { # for WSL : /mnt/c/Windows のディレクトリがある
    print "=== WSL ===\n";
    if (-f '/mnt/c/Program Files/SumatraPDF/SumatraPDF.exe') {
      $pdf_previewer = '"/mnt/c/Program Files/SumatraPDF/SumatraPDF.exe" -reuse-instance';
    } elsif (-f '/mnt/c/Program Files (x86)/SumatraPDF/SumatraPDF.exe') {
      $pdf_previewer = '"/mnt/c/Program Files (x86)/SumatraPDF/SumatraPDF.exe" -reuse-instance';
    } else {
      $pdf_previewer = 'SumatraPDF -reuse-instance';
    }
  } else {
    print "=== Native Linux ===\n";
    $pdf_previewer = "xdg-open";
    # $pdf_previewer = "start %S";
  }
  # $pdf_previewer = 'evince';
  # $pdf_previewer = "start %S";
  # $pdf_previewer = 'texworks';
  # $pdf_previewer = "xdg-open %S";

## for MacOS-----------------------------------------------------------------------------
} elsif ($^O eq 'darwin') {
  # $dvi_previewer = "open %S";
  # $pdf_previewer = "open %S";
  # $pdf_previewer = "open -ga Preview %S";
  $pdf_previewer = 'open -ga /Applications/Skim.app';
  
  # $pdf_update_method = 4;
  # $pdf_update_command = 'open -ga /Applications/Skim.app';
  # $pdf_update_command = "open -ga Preview %S";  
  # $pdf_previewer = 'open -ga /Applications/Skim.app';

## for other OS-----------------------------------------------------------------------------
} else {
#   $dvi_previewer = "start %S";
  $pdf_previewer = "start %S";
}
# $pdf_previewer = "start xpdf -remote %R %O %S"; 

##-----------------------------------------------------------------------------
```