Zenn
👨‍🎓

電通大新入生のためのUpLaTeXとGnuPlotで始める学術論文執筆環境構築 - VSCode完全ガイド

2025/03/22に公開

UpLaTeXとGnuPlotで始める学術論文執筆環境構築 - VSCode完全ガイド

まず、電通大にご入学された方、それ以外の方も、おめでとうございます。
この記事では、Windows環境でVSCodeを利用したUpLaTeXとGnuPlotの連携環境の構築方法を解説します。学術論文やレポート作成に適した環境を効率的に構築し、高品質な図表を作成するためのノウハウを共有します。
基礎科学実験など、LaTeXを利用する機会は多々ありますが、UpLaTeX(アップではなくユープラテフ)を利用できると日本語での論文作成が捗ります。(日本語が全角なのが悪いですが...)
また、これらでGnuPlotが実行できなくてもそれ以外の要素、UpLaTeXを利用するところはできるようになっています。
GnuPlot関連のユーザーパッケージを削除すればいいです。
何もわからなければ、10. 自動セットアップスクリプトの項を御覧ください。
大学生活頑張っていきましょう。
不具合や質問があればTwitter(@nenchakki)のDMまで連絡をお願いします。できるところまでは対応します。

目次

  1. はじめに - 学術論文における図とグラフの重要性
  2. 必要なソフトウェアのインストール
  3. VSCodeのセットアップと設定
  4. LaTeXの環境構築
  5. GnuPlotのインストールとパスの設定
  6. gnuplot-lua-tikzの設定
  7. LaTeXでGnuPlotを利用する方法
  8. トラブルシューティング
  9. まとめ
  10. 自動セットアップスクリプト

1. はじめに - 学術論文における図とグラフの重要性

学術論文やレポートにおいて、図やグラフは単なる装飾ではなく、重要な情報を伝える手段です。特に実験データや理論モデルの可視化には、正確で見やすいグラフが不可欠です。

図表の基本ルール

学術論文における図表には、以下のような一般的なルールがあります:

  • 枠線: グラフは基本的に枠で囲み、座標軸を明確にする
  • キャプション: 図の下、表の上に配置するのが一般的
  • 参照: 本文中で必ず図表を参照する(「図1に示すように...」など)
  • サイズ: 文字が読みやすい大きさを確保(論文誌のガイドラインに従う)
  • 単位: 軸ラベルには必ず単位を記載する
  • 凡例: 複数のデータセットがある場合は凡例を付ける

LaTeXとGnuPlotを組み合わせることで、これらのルールに準拠した高品質な図表を作成できます。

2. 必要なソフトウェアのインストール

以下のソフトウェアをインストールする必要があります:

  1. TeX Live(LaTeX環境)
  2. VSCode(エディタ)
  3. GnuPlot(グラフ作成ツール)

TeX Liveのインストール

  1. TeX Live公式サイトから「install-tl-windows.exe」をダウンロード
  2. ダウンロードしたファイルを実行
  3. 「Install」ボタンをクリック(完全インストールを推奨、空き容量が少ない場合は「カスタムインストール」で最小限の構成も可能)
  4. インストールには30分〜1時間程度かかります
  5. インストール完了後、PCを再起動

VSCodeのインストール

  1. Visual Studio Code公式サイトからインストーラをダウンロード
  2. インストーラを実行
  3. 「PATH への追加」オプションにチェックを入れることを推奨
  4. インストール完了後、VSCodeを起動

GnuPlotのインストール

  1. GnuPlot公式サイトまたはSourceForgeから最新版のインストーラ(gp<バージョン>-win64-mingw.exe)をダウンロード
  2. インストーラを実行
  3. インストール先を決定(デフォルトは C:\Program Files\gnuplot
  4. 「Add application directory to your PATH environment variable」にチェックを入れる
  5. インストール完了

3. VSCodeのセットアップと設定

必要な拡張機能のインストール

VSCodeを起動し、以下の拡張機能をインストールします:

  1. LaTeX Workshop: 左側の拡張機能アイコンをクリックして「LaTeX Workshop」を検索してインストール
  2. Code Runner: 同様に「Code Runner」を検索してインストール(GnuPlotスクリプトの実行に便利)

settings.jsonの設定

  1. VSCodeで Ctrl+Shift+P を押してコマンドパレットを開く
  2. 「Preferences: Open Settings (JSON)」と入力して選択
  3. 以下の設定を追加(または既存の設定と統合)
{
  // ---------- Language ----------

  "[tex]": {
      // スニペット補完中にも補完を使えるようにする
      "editor.suggest.snippetsPreventQuickSuggestions": false,
      // インデント幅を2にする
      "editor.tabSize": 2
  },

  "[latex]": {
      // スニペット補完中にも補完を使えるようにする
      "editor.suggest.snippetsPreventQuickSuggestions": false,
      // インデント幅を2にする
      "editor.tabSize": 2
  },

  "[bibtex]": {
      // インデント幅を2にする
      "editor.tabSize": 2
  },

  // ---------- LaTeX Workshop ----------

  // 使用パッケージのコマンドや環境の補完を有効にする
  "latex-workshop.intellisense.package.enabled": true,

  // 生成ファイルを削除するときに対象とするファイル
  // デフォルト値に "*.synctex.gz" を追加
  "latex-workshop.latex.clean.fileTypes": [
      "*.aux",
      "*.bbl",
      "*.blg",
      "*.idx",
      "*.ind",
      "*.lof",
      "*.lot",
      "*.out",
      "*.toc",
      "*.acn",
      "*.acr",
      "*.alg",
      "*.glg",
      "*.glo",
      "*.gls",
      "*.ist",
      "*.fls",
      "*.log",
      "*.fdb_latexmk",
      "*.snm",
      "*.nav",
      "*.dvi",
      "*.synctex.gz"
  ],

  // ビルドのレシピ
  "latex-workshop.latex.recipes": [
      {
          "name": "latexmk",
          "tools": [
              "latexmk"
          ]
      }
  ],

  // ビルドのレシピに使われるパーツ
  "latex-workshop.latex.tools": [
      {
          "name": "latexmk",
          "command": "latexmk",
          "args": [
              "-silent",
              "-outdir=%OUTDIR%",
              "%DOC%"
          ]
      }
  ],

  // 自動ビルドをonFileChangeで有効にする
  "latex-workshop.latex.autoBuild.run": "onFileChange",

  // Code Runner for gnuplot 
  "code-runner.executorMapByFileExtension": {
      ".plt": "gnuplot $fullFileName"
  },

  "explorer.confirmDelete": false,
  "workbench.colorTheme": "Default Dark+",
  "editor.wordWrap": "on",
  "code-runner.runInTerminal": true,
  "manim-sideview.checkeredBackground": false,
  "manim-sideview.runOnSave": true
}

この設定は以下の特徴があります:

  • わかりやすいコメントによる設定の説明
  • latexmkを使った効率的なビルドプロセス(複数ステップを自動化)
  • GnuPlotファイル(.plt)の実行設定
  • エディタの使いやすさを向上させる設定(エディタの折り返し、テーマなど)

4. LaTeXの環境構築

.latexmkrcの設定

プロジェクトのルートディレクトリに .latexmkrc ファイルを作成し、以下の内容を記述します:

#!/usr/bin/env perl

# LaTeX
$latex = 'uplatex --shell-escape -synctex=1 -halt-on-error -file-line-error %O %S';
$max_repeat = 5;

# BibTeX / Biber
$bibtex = 'pbibtex %O %S';
$biber = 'biber --bblencoding=utf8 -u -U --output_safechars %O %S';

# Index
$makeindex = 'mendex %O -o %D %S';

# DVI to PDF
$dvipdf = 'dvipdfmx %O -o %D %S';
$pdf_mode = 3;

# Previewer
$pvc_view_file_via_temporary = 0;
if ($^O eq 'linux') {
  $dvi_previewer = "xdg-open %S";
  $pdf_previewer = "xdg-open %S";
} elsif ($^O eq 'darwin') {
  $dvi_previewer = "open %S";
  $pdf_previewer = "open %S";
} else {
  $dvi_previewer = "start %S";
  $pdf_previewer = "start %S";

  # --- Windowsで touch や rm の代替設定 ---
  $rm = 'del /Q';               # rm の代わりに del(削除)
  $touch = 'copy /B nul +,, >nul'; # touch の代用(何もしない)
  $cleanup_includes_cusdep_generated = 1;
}

# Clean up for full
$clean_full_ext = "%R.synctex.gz";

このファイルには次のような特徴があります:

  • TeX処理のコマンドとオプションの詳細設定
  • Windows、macOS、Linuxの各OSに適した設定
  • Windows環境での特別な設定(touchやrmコマンドの代替)
  • 参考文献処理(BibTeX、Biber)の設定
  • 索引作成(makeindex)の設定

LaTeXテンプレートの作成

プロジェクトフォルダに main.tex などの名前でファイルを作成し、以下のテンプレートを利用します:

\RequirePackage{plautopatch}
\RequirePackage[l2tabu, orthodox]{nag}

\documentclass[uplatex,dvipdfmx,a4paper,12pt]{jlreq}

% --- エンコーディングと言語設定 ---
\usepackage[utf8]{inputenc} % UTF-8エンコーディング
\usepackage[T1]{fontenc}    % フォントエンコーディング
\usepackage[english, japanese]{babel} % 多言語サポート

% --- レイアウトとフォーマット ---
\usepackage[top=15mm, bottom=20mm, left=20mm, right=20mm]{geometry} % ページレイアウトの設定

% --- グラフィックスと図表関連 ---
\usepackage[dvipdfmx]{graphicx} % 画像の挿入
\usepackage{tikz, gnuplot-lua-tikz} % Gnuplot連携
\usepackage[miktex]{gnuplottex}
\usetikzlibrary{external, calc, patterns, arrows.meta, backgrounds} % 外部化ライブラリと他のライブラリ

% --- グラフィックスの設定 ---
\pgfkeys{/pgf/images/include external/.code={\includegraphics{#1}}}
\usepackage{subcaption} % サブキャプションのサポート
\usepackage{float} % 図や表の配置制御
\usepackage{adjustbox} % 画像や表のサイズ調整

% --- 数式と科学記号 ---
\usepackage{amsmath, amssymb, bm} % 数学環境
\usepackage{physics} % 物理学関連の便利なコマンド
\usepackage[version=3]{mhchem} % 化学式の記述
\usepackage{siunitx} % SI単位系のサポート
\sisetup{
  separate-uncertainty, % 不確実性の分離
  output-decimal-marker={.}, % 小数点をピリオドに
  detect-all, % フォントやサイズを自動で検出
  per-mode=symbol, % 単位の分数形式をスラッシュ形式に
  exponent-product=\cdot, % 乗算記号を「⋅」で表示
  range-units=single, % 範囲における単位の省略を許可
  scientific-notation=true % 科学技術表記を許可
}

% --- その他のパッケージ ---
\usepackage{url} % URLの表示
\usepackage{booktabs} % 高品質な表
\usepackage{multirow} % 表のセルを跨ぐ
\usepackage{circuitikz} % 電気回路図の描画
\usepackage{bxtexlogo} % TeXのロゴ

% --- カスタム設定 ---
\renewcommand{\%}{\textsf{\char`\%}} % パーセント記号のカスタム表示

% --- カスタム関数の定義 ---
\pgfmathdeclarefunction{poisson}{2}{%
    \pgfmathparse{exp(-#2)*(#2)^(#1)/(#1)!}%
}

\title{タイトル}
\author{所属\\学籍番号 氏名}
\date{\today}

\begin{document}
\maketitle

% ここに本文を書く

\end{document}

5. GnuPlotのインストールとパスの設定

パスの確認と設定

GnuPlotインストール時に「PATH環境変数に追加」オプションを選択した場合でも、念のためパスが正しく設定されているか確認しましょう。

  1. Windowsキー + R を押して「ファイル名を指定して実行」を開く
  2. cmd と入力してコマンドプロンプトを起動
  3. gnuplot --version と入力して実行
  4. GnuPlotのバージョン情報が表示されればパスは正しく設定されています

パスが設定されていない場合は、以下の手順で追加します:

  1. Windowsキー + X を押して、「システム」を選択
  2. 「システムの詳細設定」→「環境変数」を選択
  3. 「システム環境変数」の「Path」を選択して「編集」をクリック
  4. 「新規」をクリックし、GnuPlotのインストールディレクトリ(例:C:\Program Files\gnuplot\bin)を追加
  5. 「OK」をクリックして設定を保存
  6. コマンドプロンプトを再起動し、再度 gnuplot --version でパスが通っているか確認

スタイルファイルの生成と更新

GnuPlotとLaTeXの連携に必要なスタイルファイルを生成するには、以下の手順を実行します:

  1. コマンドプロンプトを開く
  2. 以下のコマンドを実行してスタイルファイルを生成します:
    gnuplot -e "set term tikz createstyle"
    
  3. スタイルファイルが作成されたら、TeX Liveのファイルデータベースを更新します:
    mktexlsr
    

これにより、LaTeXがgnuplot-lua-tikzパッケージを見つけられるようになります。

コンパイルが無限ループする問題の解決

このままgnuplot環境を利用すると、LaTeX Workshopを利用した際にコンパイルが止まらなくなる現象が発生することがあります。これは、tikzファイルのタイムスタンプ設定によるものです。以下の手順で解決できます:

  1. テキストエディタ(メモ帳やVSCodeなど)で以下のファイルを開きます:

    C:\Program Files\gnuplot\share\lua\gnuplot-tikz.lua
    
  2. ファイル内の1299行目付近にある以下の部分を探します:

    notimestamp = false,
    
  3. この行を以下のように変更します:

    notimestamp = true,
    
  4. ファイルを保存します(管理者権限が必要な場合があります)

この修正により、tikzファイルにタイムスタンプが含まれなくなり、LaTeXのコンパイル時に無限ループが発生する問題が解決されます。タイムスタンプが変更されるたびにLaTeX Workshopが再コンパイルを行うため、notimestamptrueに設定することでこの問題を防止できます。

6. gnuplot-lua-tikzの設定

LaTeXとGnuPlotを連携させるためには、gnuplot-lua-tikzパッケージが必要です。しかし、このパッケージのスタイルファイルがない場合があります。以下の手順で確認し、必要に応じて設定します。

スタイルファイルの確認

  1. コマンドプロンプトを開き、以下のコマンドを実行してスタイルファイルがあるか確認します:
kpsewhich gnuplot-lua-tikz.sty
kpsewhich gnuplot-lua-tikz-common.tex
  1. パスが表示されればファイルは正しく配置されています。何も表示されない場合は、以下の手順でファイルを生成します。

スタイルファイルの生成と配置

  1. まず、TEXMFHOMEの場所を確認します:
kpsewhich -var-value=TEXMFHOME

これにより、個人用のTeXディレクトリが表示されます(例:C:\Users\<ユーザー名>\texmf)。

  1. GnuPlotを起動し、以下のコマンドを実行してスタイルファイルを生成します:
set term tikz createstyle
  1. 生成されたファイル(gnuplot-lua-tikz.sty、gnuplot-lua-tikz-common.tex など)を適切な場所に配置します。

    • プロジェクト固有の場合:プロジェクトフォルダ(例:VSCode/Folder)に配置

    • 全プロジェクト共通:TEXMFHOMEの適切なサブディレクトリに配置

      mkdir -p <TEXMFHOME>/tex/latex/gnuplot-lua-tikz
      cp gnuplot-lua-tikz.sty gnuplot-lua-tikz-common.tex <TEXMFHOME>/tex/latex/gnuplot-lua-tikz/
      
  2. TeX Live のファイルデータベースを更新します:

mktexlsr
  1. 再度 kpsewhich gnuplot-lua-tikz.sty を実行して、ファイルが見つかるか確認します。

7. LaTeXでGnuPlotを利用する方法

GnuPlotをLaTeXに直接埋め込む方法は主に2つあります:

  1. gnuplottexパッケージを使用する方法(直接埋め込み)
  2. gnuplot-lua-tikzを使用する方法(TikZを介した埋め込み)

今回は、より柔軟性が高い直接埋め込みの方法を中心に説明します。

gnuplottexパッケージを使った埋め込み

以下のようにLaTeXファイル内にGnuPlotコードを直接埋め込むことができます:

\begin{document}
\maketitle

\section{GnuPlotによるグラフ}

% シェルエスケープが有効な状態でコンパイルする必要があります
\begin{figure}[htbp]
  \centering
  \begin{gnuplot}[terminal=tikz, terminaloptions={size 10cm,6cm}]
    # GnuPlotのコードをここに記述
    set grid
    set xlabel "x"
    set ylabel "y"
    set title "Simple Function Plot"
    plot sin(x) title "sin(x)" with lines lw 2, \
         cos(x) title "cos(x)" with lines lw 2 lt 3
  \end{gnuplot}
  \caption{正弦波と余弦波のグラフ}
  \label{fig:sin-cos}
\end{figure}\ref{fig:sin-cos}は正弦波と余弦波のグラフを示しています。

\end{document}

実践的な例:データファイルを使用したプロット

実験データなどの外部ファイルを読み込んでプロットする例を示します:

\begin{figure}[htbp]
  \centering
  \begin{gnuplot}[terminal=tikz, terminaloptions={size 12cm,8cm}]
    # データをプロット
    set grid
    set xlabel "Time (s)"
    set ylabel "Voltage (V)"
    set title "Measured Data"
    
    # エラーバー付きのデータプロット
    plot "data.txt" using 1:2:3 with yerrorbars title "Measured Data" pt 7, \
         "data.txt" using 1:2 with lines title "Fitted Line" lw 2
  \end{gnuplot}
  \caption{測定データとフィッティング結果}
  \label{fig:measured-data}
\end{figure}

複数のサブプロットの作成

gnuplot-lua-tikzを使用すると、複数のサブプロットを含む複雑なグラフも作成できます:

\begin{figure}[htbp]
  \centering
  \begin{gnuplot}[terminal=tikz, terminaloptions={size 12cm,10cm}]
    # 複数のサブプロット
    set multiplot layout 2,2 title "Multiple Plots Example"
    
    # 1つ目のプロット
    set title "Plot 1: Linear Function"
    set xlabel "x"
    set ylabel "y"
    plot x title "f(x) = x" with lines lw 2
    
    # 2つ目のプロット
    set title "Plot 2: Quadratic Function"
    set xlabel "x"
    set ylabel "y"
    plot x**2 title "f(x) = x²" with lines lw 2
    
    # 3つ目のプロット
    set title "Plot 3: Sine Function"
    set xlabel "x"
    set ylabel "y"
    plot sin(x) title "f(x) = sin(x)" with lines lw 2
    
    # 4つ目のプロット
    set title "Plot 4: Exponential Function"
    set xlabel "x"
    set ylabel "y"
    plot exp(x) title "f(x) = e^x" with lines lw 2
    
    unset multiplot
  \end{gnuplot}
  \caption{様々な関数のグラフ}
  \label{fig:multi-plots}
\end{figure}

グラフの枠で囲む方法

学術論文では、グラフを枠で囲むことが一般的です:

\begin{gnuplot}[terminal=tikz, terminaloptions={size 10cm,6cm}]
  # 枠で囲むための設定
  set border 31 lw 1.5  # すべての辺に枠線を表示
  set grid            # グリッドを表示
  set xlabel "x"
  set ylabel "y"
  set title "Boxed Plot Example"
  plot sin(x) title "sin(x)" with lines lw 2
\end{gnuplot}

8. トラブルシューティング

コンパイルエラー:「gnuplot-lua-tikz.sty が見つからない」

対処法

  1. 前述の「gnuplot-lua-tikzの設定」セクションに従って、スタイルファイルを生成し配置する
  2. または、プロジェクトディレクトリに直接スタイルファイルをコピーする

GnuPlotが実行できない:「/bin/sh: gnuplot: command not found」

対処法

  1. GnuPlotが正しくインストールされていることを確認
  2. PATH環境変数にGnuPlotのbinディレクトリが含まれているか確認
  3. VSCodeを再起動して、環境変数の変更を反映させる

シェルエスケープが無効というエラー

対処法
コンパイルコマンドに --shell-escape オプションが含まれていることを確認。latexmkrcファイルに以下の行があるか確認:

$latex = 'uplatex --shell-escape -synctex=1 -halt-on-error -file-line-error %O %S';

GnuPlotが正しく動作しない

対処法

  1. GnuPlotを単独で実行して、コマンドが正しいか確認
  2. LaTeXで使用する前に、GnuPlotスクリプトを単独でテスト
  3. グラフの設定(特に日本語フォントなど)を確認

コンパイルが無限ループする問題

対処法
前述の「コンパイルが無限ループする問題の解決」セクションで説明したように、gnuplot-tikz.luaファイルのnotimestamp設定をtrueに変更します。問題が解決しない場合は、VSCodeの自動ビルド設定を見直してください。

9. まとめ

この記事では、Windows環境でVSCodeを使用してUpLaTeXとGnuPlotを連携させる方法を解説しました。学術論文やレポート作成に適した環境を構築することで、高品質な図表を簡単に作成できるようになります。

特にGnuPlotを直接LaTeXに埋め込む方法は、データの変更に柔軟に対応でき、一貫性のあるスタイルでグラフを作成できる利点があります。また、gnuplot-tikz.luaファイルの修正により、コンパイルの無限ループ問題も解決できました。

基本的な環境構築ができたら、GnuPlotの様々なコマンドや機能を学び、より洗練されたグラフを作成してみてください。また、TikZの機能を活用することで、さらに複雑な図表も作成可能です。

10. 自動セットアップスクリプト

環境構築の手順を自動化するPowerShellスクリプトを作成しました。このスクリプトを使用すると、必要なパスの設定やファイルの作成を自動的に行うことができます。

スクリプトの前提条件

このスクリプトを使用する前に、以下のソフトウェアがインストールされている必要があります:

  1. TeX Live - LaTeX環境(完全版または基本版)
  2. VSCode - Microsoft Visual Studio Code エディタ
  3. GnuPlot - グラフ作成ツール
  4. PowerShell - Windows 10以降には標準で搭載

また、スクリプト実行後に以下のVSCode拡張機能をインストールすることを推奨します:

  • LaTeX Workshop - LaTeXの編集・コンパイル機能を提供
  • Code Runner - GnuPlotスクリプトの実行を簡単にするための拡張機能

スクリプトが行う処理

このスクリプトは以下の操作を自動化します:

  1. 必要なソフトウェア(TeX Live、VSCode、GnuPlot)がインストールされているか確認
  2. PATH環境変数を確認し、必要に応じて設定を追加
  3. C:\VSCode\latex ディレクトリ構造を作成
  4. プロジェクトフォルダを作成
  5. VSCode設定ファイル(.vscode/settings.json)を生成
  6. LaTeX設定ファイル(.latexmkrc)を生成
  7. LaTeXのテンプレートファイル(main.tex)を作成
  8. gnuplot-lua-tikzスタイルファイルを生成し、適切な場所に配置
  9. gnuplot-tikz.luaファイルのnotimestamp設定を自動的に修正

スクリプトを実行すると、C:\VSCode\latexディレクトリに標準的なLaTeX+GnuPlot環境が構築され、すぐに論文執筆を始めることができます。また、コンパイル無限ループの問題も自動的に解決されます。

スクリプトの使用方法

  1. 以下のスクリプトを「setup-latex-gnuplot.ps1」などの名前で保存します

  2. PowerShellを管理者として実行します(スタートメニューで「PowerShell」を右クリック→「管理者として実行」)

  3. スクリプトのある場所に移動します。例えば:

    # デスクトップに保存した場合
    cd C:\Users\ユーザー名\Desktop
    
    # ダウンロードフォルダに保存した場合
    cd C:\Users\ユーザー名\Downloads
    
    # 特定のフォルダに保存した場合
    cd C:\作業フォルダ\LaTeX設定
    
  4. 実行許可を設定します(初回のみ):

    Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
    
  5. スクリプトを実行します:

    .\setup-latex-gnuplot.ps1
    
  6. 画面の指示に従って必要な情報を入力します

スクリプト全文

以下が完全なセットアップスクリプトです。コピーして使用してください。

# LaTeX+GnuPlot環境セットアップスクリプト
# このスクリプトはVSCodeでUpLaTeXとGnuPlotを連携させるための環境を構築します

# 管理者権限をチェック
if (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
    Write-Warning "管理者権限で実行してください!"
    Write-Host "スクリプトを管理者として再起動します..."
    
    # 自身を管理者として再起動
    $arguments = "& '" + $myinvocation.mycommand.definition + "'"
    Start-Process powershell -Verb runAs -ArgumentList $arguments
    Exit
}

# バナーを表示
Write-Host "========================================================" -ForegroundColor Cyan
Write-Host "     LaTeX+GnuPlot環境セットアップツール v1.2" -ForegroundColor Cyan
Write-Host "========================================================" -ForegroundColor Cyan
Write-Host ""
Write-Host "このスクリプトは以下の作業を行います:" -ForegroundColor Yellow
Write-Host "1. 必要なソフトウェアのインストール状況確認" -ForegroundColor Yellow
Write-Host "2. PATH環境変数の確認と設定" -ForegroundColor Yellow
Write-Host "3. C:\VSCode\latex ディレクトリの作成" -ForegroundColor Yellow
Write-Host "4. VSCode設定ファイルの作成" -ForegroundColor Yellow
Write-Host "5. LaTeX設定ファイルの作成" -ForegroundColor Yellow
Write-Host "6. LaTeXテンプレートファイルの作成" -ForegroundColor Yellow
Write-Host "7. gnuplot-lua-tikzスタイルファイルの設定" -ForegroundColor Yellow
Write-Host "8. gnuplot-tikz.luaファイルの修正" -ForegroundColor Yellow
Write-Host ""
Write-Host "========================================================" -ForegroundColor Cyan
Start-Sleep -Seconds 2

# 必要なソフトウェアのチェック
function Test-CommandExists {
    param ($command)
    $oldPreference = $ErrorActionPreference
    $ErrorActionPreference = 'stop'
    try { if (Get-Command $command) { return $true } }
    catch { return $false }
    finally { $ErrorActionPreference = $oldPreference }
}

# PATH環境変数に追加する関数
function Add-ToPath {
    param (
        [string]$PathToAdd,
        [string]$PathType = "User" # User または Machine
    )
    
    if (-not (Test-Path $PathToAdd)) {
        Write-Host "! 指定されたパス '$PathToAdd' が存在しません。" -ForegroundColor Red
        return $false
    }
    
    # 現在のPATH環境変数を取得
    if ($PathType -eq "User") {
        $currentPath = [Environment]::GetEnvironmentVariable("Path", [EnvironmentVariableTarget]::User)
    } else {
        $currentPath = [Environment]::GetEnvironmentVariable("Path", [EnvironmentVariableTarget]::Machine)
    }
    
    # パスが既に含まれているか確認
    if ($currentPath -split ";" -contains $PathToAdd) {
        Write-Host "✓ 指定されたパス '$PathToAdd' は既に環境変数に含まれています。" -ForegroundColor Green
        return $true
    }
    
    # PATHに追加
    $newPath = $currentPath + ";" + $PathToAdd
    
    try {
        if ($PathType -eq "User") {
            [Environment]::SetEnvironmentVariable("Path", $newPath, [EnvironmentVariableTarget]::User)
        } else {
            [Environment]::SetEnvironmentVariable("Path", $newPath, [EnvironmentVariableTarget]::Machine)
        }
        
        # 現在のセッションのPATHも更新
        $env:Path = $env:Path + ";" + $PathToAdd
        
        Write-Host "✓ '$PathToAdd' をPATH環境変数に追加しました。" -ForegroundColor Green
        return $true
    } catch {
        Write-Host "! PATH環境変数の更新に失敗しました。エラー: $_" -ForegroundColor Red
        return $false
    }
}

# ディレクトリを探索する関数
function Find-InstallationDirectory {
    param (
        [string]$SoftwareName,
        [string[]]$PossibleLocations,
        [string]$ExecutableName
    )
    
    Write-Host "  $SoftwareNameのインストールディレクトリを検索中..." -ForegroundColor Yellow
    
    foreach ($location in $PossibleLocations) {
        if (Test-Path $location) {
            $exePath = Join-Path $location $ExecutableName
            if (Test-Path $exePath) {
                Write-Host "  $SoftwareNameを発見: $location" -ForegroundColor Green
                return $location
            }
            
            # サブディレクトリも検索
            $subDirs = Get-ChildItem -Path $location -Directory
            foreach ($dir in $subDirs) {
                $exePath = Join-Path $dir.FullName $ExecutableName
                if (Test-Path $exePath) {
                    Write-Host "  $SoftwareNameを発見: $($dir.FullName)" -ForegroundColor Green
                    return $dir.FullName
                }
                
                # binディレクトリがある場合
                $binDir = Join-Path $dir.FullName "bin"
                if (Test-Path $binDir) {
                    $exePath = Join-Path $binDir $ExecutableName
                    if (Test-Path $exePath) {
                        Write-Host "  $SoftwareNameを発見: $binDir" -ForegroundColor Green
                        return $binDir
                    }
                }
            }
        }
    }
    
    return $null
}

Write-Host "【ステップ1】必要なソフトウェアの確認中..." -ForegroundColor Green

# TexLiveのチェック
$texliveInstalled = Test-CommandExists pdflatex
if ($texliveInstalled) {
    Write-Host "✓ TeX Live がインストールされています" -ForegroundColor Green
} else {
    Write-Host "✗ TeX Live がインストールされていません" -ForegroundColor Red
    Write-Host "  インストール方法: https://www.tug.org/texlive/acquire-netinstall.html" -ForegroundColor Yellow
}

# VSCodeのチェック
$vscodeInstalled = Test-CommandExists code
if ($vscodeInstalled) {
    Write-Host "✓ VSCode がインストールされています" -ForegroundColor Green
} else {
    Write-Host "✗ VSCode がインストールされていません" -ForegroundColor Red
    Write-Host "  インストール方法: https://code.visualstudio.com/" -ForegroundColor Yellow
}

# GnuPlotのチェック
$gnuplotInstalled = Test-CommandExists gnuplot
if ($gnuplotInstalled) {
    Write-Host "✓ GnuPlot がインストールされています" -ForegroundColor Green
} else {
    Write-Host "✗ GnuPlot がインストールされていません" -ForegroundColor Red
    Write-Host "  インストール方法: http://www.gnuplot.info/ または" -ForegroundColor Yellow
    Write-Host "  https://sourceforge.net/projects/gnuplot/files/gnuplot/" -ForegroundColor Yellow
}

# PATH環境変数の確認と設定
Write-Host ""
Write-Host "【ステップ2】PATH環境変数の確認と設定..." -ForegroundColor Green

# TeX Liveのパス設定
if (-not $texliveInstalled) {
    Write-Host "TeX Liveのインストールディレクトリを探索中..." -ForegroundColor Yellow
    $texlivePossibleLocations = @(
        "C:\texlive\2023\bin\win32",
        "C:\texlive\2024\bin\win32",
        "C:\texlive\2023\bin\win64",
        "C:\texlive\2024\bin\win64"
    )
    
    $texliveDir = $null
    
    # 最初にユーザーにインストールディレクトリを尋ねる
    $userInput = Read-Host "TeX Liveのbinディレクトリのパスを入力してください (例: C:\texlive\2023\bin\win64) [Enter で自動検索]"
    
    if ($userInput -and (Test-Path $userInput)) {
        $texliveDir = $userInput
    } else {
        $texliveDir = Find-InstallationDirectory -SoftwareName "TeX Live" -PossibleLocations $texlivePossibleLocations -ExecutableName "pdflatex.exe"
    }
    
    if ($texliveDir) {
        $addToPath = Read-Host "TeX LiveのパスをPATH環境変数に追加しますか? (Y/N)"
        if ($addToPath -eq "Y" -or $addToPath -eq "y") {
            Add-ToPath -PathToAdd $texliveDir -PathType "Machine"
            $texliveInstalled = $true
        }
    } else {
        Write-Host "! TeX Liveのインストールディレクトリが見つかりませんでした。" -ForegroundColor Red
        Write-Host "  先にTeX Liveをインストールするか、手動でPATH環境変数を設定してください。" -ForegroundColor Yellow
    }
}

# VSCodeのパス設定
if (-not $vscodeInstalled) {
    Write-Host "VSCodeのインストールディレクトリを探索中..." -ForegroundColor Yellow
    $vscodePossibleLocations = @(
        "${env:ProgramFiles}\Microsoft VS Code\bin",
        "${env:ProgramFiles(x86)}\Microsoft VS Code\bin",
        "${env:LOCALAPPDATA}\Programs\Microsoft VS Code\bin"
    )
    
    $vscodeDir = $null
    
    # 最初にユーザーにインストールディレクトリを尋ねる
    $userInput = Read-Host "VSCodeのインストールディレクトリを入力してください (例: C:\Program Files\Microsoft VS Code) [Enter で自動検索]"
    
    if ($userInput -and (Test-Path $userInput)) {
        $vscodeDir = Join-Path $userInput "bin"
        if (-not (Test-Path $vscodeDir)) {
            $vscodeDir = $userInput
        }
    } else {
        $vscodeDir = Find-InstallationDirectory -SoftwareName "VSCode" -PossibleLocations $vscodePossibleLocations -ExecutableName "code.exe"
    }
    
    if ($vscodeDir) {
        $addToPath = Read-Host "VSCodeのパスをPATH環境変数に追加しますか? (Y/N)"
        if ($addToPath -eq "Y" -or $addToPath -eq "y") {
            Add-ToPath -PathToAdd $vscodeDir -PathType "User"
            $vscodeInstalled = $true
        }
    } else {
        Write-Host "! VSCodeのインストールディレクトリが見つかりませんでした。" -ForegroundColor Red
        Write-Host "  先にVSCodeをインストールするか、手動でPATH環境変数を設定してください。" -ForegroundColor Yellow
    }
}

# GnuPlotのパス設定
if (-not $gnuplotInstalled) {
    Write-Host "GnuPlotのインストールディレクトリを探索中..." -ForegroundColor Yellow
    $gnuplotPossibleLocations = @(
        "${env:ProgramFiles}\gnuplot\bin",
        "${env:ProgramFiles(x86)}\gnuplot\bin",
        "C:\gnuplot\bin"
    )
    
    $gnuplotDir = $null
    
    # 最初にユーザーにインストールディレクトリを尋ねる
    $userInput = Read-Host "GnuPlotのインストールディレクトリを入力してください (例: C:\Program Files\gnuplot\bin) [Enter で自動検索]"
    
    if ($userInput -and (Test-Path $userInput)) {
        $gnuplotDir = $userInput
    } else {
        $gnuplotDir = Find-InstallationDirectory -SoftwareName "GnuPlot" -PossibleLocations $gnuplotPossibleLocations -ExecutableName "gnuplot.exe"
    }
    
    if ($gnuplotDir) {
        $addToPath = Read-Host "GnuPlotのパスをPATH環境変数に追加しますか? (Y/N)"
        if ($addToPath -eq "Y" -or $addToPath -eq "y") {
            Add-ToPath -PathToAdd $gnuplotDir -PathType "User"
            $gnuplotInstalled = $true
        }
    } else {
        Write-Host "! GnuPlotのインストールディレクトリが見つかりませんでした。" -ForegroundColor Red
        Write-Host "  先にGnuPlotをインストールするか、手動でPATH環境変数を設定してください。" -ForegroundColor Yellow
    }
}

# インストール状況の再確認
Write-Host ""
Write-Host "PATH環境変数設定後のソフトウェア状況:" -ForegroundColor Cyan
# TexLiveの再確認
if (Test-CommandExists pdflatex) {
    Write-Host "✓ TeX Live へのパスが正常に設定されています" -ForegroundColor Green
} else {
    Write-Host "! TeX Live へのパスが設定されていません。スクリプト終了後にコマンドプロンプトを再起動してください。" -ForegroundColor Yellow
}

# VSCodeの再確認
if (Test-CommandExists code) {
    Write-Host "✓ VSCode へのパスが正常に設定されています" -ForegroundColor Green
} else {
    Write-Host "! VSCode へのパスが設定されていません。スクリプト終了後にコマンドプロンプトを再起動してください。" -ForegroundColor Yellow
}

# GnuPlotの再確認
if (Test-CommandExists gnuplot) {
    Write-Host "✓ GnuPlot へのパスが正常に設定されています" -ForegroundColor Green
} else {
    Write-Host "! GnuPlot へのパスが設定されていません。スクリプト終了後にコマンドプロンプトを再起動してください。" -ForegroundColor Yellow
}

# C:\VSCode\latex ディレクトリ構造の作成
Write-Host ""
Write-Host "【ステップ3】C:\VSCode\latex ディレクトリ構造の作成..." -ForegroundColor Green

# VSCodeルートディレクトリ
$vscodeRoot = "C:\VSCode"
if (-not (Test-Path $vscodeRoot)) {
    New-Item -ItemType Directory -Path $vscodeRoot | Out-Null
    Write-Host "✓ VSCodeルートディレクトリを作成しました: $vscodeRoot" -ForegroundColor Green
} else {
    Write-Host "✓ VSCodeルートディレクトリが既に存在します: $vscodeRoot" -ForegroundColor Green
}

# LaTeXディレクトリ (スタイルファイルとプロジェクトの両方を含む)
$latexRoot = Join-Path $vscodeRoot "latex"
if (-not (Test-Path $latexRoot)) {
    New-Item -ItemType Directory -Path $latexRoot | Out-Null
    Write-Host "✓ LaTeXディレクトリを作成しました: $latexRoot" -ForegroundColor Green
} else {
    Write-Host "✓ LaTeXディレクトリが既に存在します: $latexRoot" -ForegroundColor Green
}

# プロジェクト名の取得
$projectName = Read-Host "作成するプロジェクトの名前を入力してください (例: project1)"
$workspacePath = Join-Path $latexRoot $projectName

# プロジェクトディレクトリの作成
if (-not (Test-Path $workspacePath)) {
    New-Item -ItemType Directory -Path $workspacePath | Out-Null
    Write-Host "✓ プロジェクトディレクトリを作成しました: $workspacePath" -ForegroundColor Green
} else {
    Write-Host "✓ 指定されたプロジェクトディレクトリが既に存在します: $workspacePath" -ForegroundColor Green
}

# VSCodeの設定フォルダを作成
$vscodeFolder = Join-Path $workspacePath ".vscode"
if (-not (Test-Path $vscodeFolder)) {
    New-Item -ItemType Directory -Path $vscodeFolder | Out-Null
}

# settings.jsonファイルの作成 (更新済み)
$settingsFile = Join-Path $vscodeFolder "settings.json"
$settingsContent = @'
{
  // ---------- Language ----------

  "[tex]": {
      // スニペット補完中にも補完を使えるようにする
      "editor.suggest.snippetsPreventQuickSuggestions": false,
      // インデント幅を2にする
      "editor.tabSize": 2
  },

  "[latex]": {
      // スニペット補完中にも補完を使えるようにする
      "editor.suggest.snippetsPreventQuickSuggestions": false,
      // インデント幅を2にする
      "editor.tabSize": 2
  },

  "[bibtex]": {
      // インデント幅を2にする
      "editor.tabSize": 2
  },

  // ---------- LaTeX Workshop ----------

  // 使用パッケージのコマンドや環境の補完を有効にする
  "latex-workshop.intellisense.package.enabled": true,

  // 生成ファイルを削除するときに対象とするファイル
  // デフォルト値に "*.synctex.gz" を追加
  "latex-workshop.latex.clean.fileTypes": [
      "*.aux",
      "*.bbl",
      "*.blg",
      "*.idx",
      "*.ind",
      "*.lof",
      "*.lot",
      "*.out",
      "*.toc",
      "*.acn",
      "*.acr",
      "*.alg",
      "*.glg",
      "*.glo",
      "*.gls",
      "*.ist",
      "*.fls",
      "*.log",
      "*.fdb_latexmk",
      "*.snm",
      "*.nav",
      "*.dvi",
      "*.synctex.gz"
  ],

  // ビルドのレシピ
  "latex-workshop.latex.recipes": [
      {
          "name": "latexmk",
          "tools": [
              "latexmk"
          ]
      }
  ],

  // ビルドのレシピに使われるパーツ
  "latex-workshop.latex.tools": [
      {
          "name": "latexmk",
          "command": "latexmk",
          "args": [
              "-silent",
              "-outdir=%OUTDIR%",
              "%DOC%"
          ]
      }
  ],

  // 自動ビルドをonFileChangeで有効にする
  "latex-workshop.latex.autoBuild.run": "onFileChange",

  // Code Runner for gnuplot 
  "code-runner.executorMapByFileExtension": {
      ".plt": "gnuplot $fullFileName"
  },

  "explorer.confirmDelete": false,
  "workbench.colorTheme": "Default Dark+",
  "editor.wordWrap": "on",
  "code-runner.runInTerminal": true,
  "manim-sideview.checkeredBackground": false,
  "manim-sideview.runOnSave": true
}
'@

Set-Content -Path $settingsFile -Value $settingsContent
Write-Host "✓ VSCode設定ファイルを作成しました: $settingsFile" -ForegroundColor Green
Write-Host "  (注: ソフトウェアのパスが見つからなかった場合は、VSCodeを再起動してください)" -ForegroundColor Yellow

# .latexmkrcファイルの作成 (更新済み)
$latexmkrcFile = Join-Path $workspacePath ".latexmkrc"
$latexmkrcContent = @'
#!/usr/bin/env perl

# LaTeX
$latex = 'uplatex --shell-escape -synctex=1 -halt-on-error -file-line-error %O %S';
$max_repeat = 5;

# BibTeX / Biber
$bibtex = 'pbibtex %O %S';
$biber = 'biber --bblencoding=utf8 -u -U --output_safechars %O %S';

# Index
$makeindex = 'mendex %O -o %D %S';

# DVI to PDF
$dvipdf = 'dvipdfmx %O -o %D %S';
$pdf_mode = 3;

# Previewer
$pvc_view_file_via_temporary = 0;
if ($^O eq 'linux') {
  $dvi_previewer = "xdg-open %S";
  $pdf_previewer = "xdg-open %S";
} elsif ($^O eq 'darwin') {
  $dvi_previewer = "open %S";
  $pdf_previewer = "open %S";
} else {
  $dvi_previewer = "start %S";
  $pdf_previewer = "start %S";

  # --- Windowsで touch や rm の代替設定 ---
  $rm = 'del /Q';               # rm の代わりに del(削除)
  $touch = 'copy /B nul +,, >nul'; # touch の代用(何もしない)
  $cleanup_includes_cusdep_generated = 1;
}

# Clean up for full
$clean_full_ext = "%R.synctex.gz";
'@

Set-Content -Path $latexmkrcFile -Value $latexmkrcContent
Write-Host "✓ LaTeX設定ファイルを作成しました: $latexmkrcFile" -ForegroundColor Green

# LaTeXテンプレートファイルの作成
$templateFile = Join-Path $workspacePath "main.tex"
$templateContent = @'
\RequirePackage{plautopatch}
\RequirePackage[l2tabu, orthodox]{nag}

\documentclass[uplatex,dvipdfmx,a4paper,12pt]{jlreq}

% --- エンコーディングと言語設定 ---
\usepackage[utf8]{inputenc} % UTF-8エンコーディング
\usepackage[T1]{fontenc}    % フォントエンコーディング
\usepackage[english, japanese]{babel} % 多言語サポート

% --- レイアウトとフォーマット ---
\usepackage[top=15mm, bottom=20mm, left=20mm, right=20mm]{geometry} % ページレイアウトの設定

% --- グラフィックスと図表関連 ---
\usepackage[dvipdfmx]{graphicx} % 画像の挿入
\usepackage{tikz, gnuplot-lua-tikz} % Gnuplot連携
\usepackage[miktex]{gnuplottex}
\usetikzlibrary{external, calc, patterns, arrows.meta, backgrounds} % 外部化ライブラリと他のライブラリ

% --- グラフィックスの設定 ---
\pgfkeys{/pgf/images/include external/.code={\includegraphics{#1}}}
\usepackage{subcaption} % サブキャプションのサポート
\usepackage{float} % 図や表の配置制御
\usepackage{adjustbox} % 画像や表のサイズ調整

% --- 数式と科学記号 ---
\usepackage{amsmath, amssymb, bm} % 数学環境
\usepackage{physics} % 物理学関連の便利なコマンド
\usepackage[version=3]{mhchem} % 化学式の記述
\usepackage{siunitx} % SI単位系のサポート
\sisetup{
  separate-uncertainty, % 不確実性の分離
  output-decimal-marker={.}, % 小数点をピリオドに
  detect-all, % フォントやサイズを自動で検出
  per-mode=symbol, % 単位の分数形式をスラッシュ形式に
  exponent-product=\cdot, % 乗算記号を「⋅」で表示
  range-units=single, % 範囲における単位の省略を許可
  scientific-notation=true % 科学技術表記を許可
}

% --- その他のパッケージ ---
\usepackage{url} % URLの表示
\usepackage{booktabs} % 高品質な表
\usepackage{multirow} % 表のセルを跨ぐ
\usepackage{circuitikz} % 電気回路図の描画
\usepackage{bxtexlogo} % TeXのロゴ

% --- カスタム設定 ---
\renewcommand{\%}{\textsf{\char`\%}} % パーセント記号のカスタム表示

% --- カスタム関数の定義 ---
\pgfmathdeclarefunction{poisson}{2}{%
    \pgfmathparse{exp(-#2)*(#2)^(#1)/(#1)!}%
}

\title{タイトル}
\author{所属\\学籍番号 氏名}
\date{\today}

\begin{document}
\maketitle

\section{はじめに}
ここに本文を書きます。

\section{GnuPlotによるグラフ}

\begin{figure}[htbp]
  \centering
  \begin{gnuplot}[terminal=tikz, terminaloptions={size 10cm,6cm}]
    # GnuPlotのコードをここに記述
    set grid
    set xlabel "x"
    set ylabel "y"
    set title "Simple Function Plot"
    plot sin(x) title "sin(x)" with lines lw 2, \
         cos(x) title "cos(x)" with lines lw 2 lt 3
  \end{gnuplot}
  \caption{正弦波と余弦波のグラフ}
  \label{fig:sin-cos}
\end{figure}

図\ref{fig:sin-cos}は正弦波と余弦波のグラフを示しています。

\end{document}
'@

Set-Content -Path $templateFile -Value $templateContent
Write-Host "✓ LaTeXテンプレートファイルを作成しました: $templateFile" -ForegroundColor Green

# サンプルGnuPlotファイルの作成
$gnuplotFile = Join-Path $workspacePath "sample.plt"
$gnuplotContent = @'
# サンプルGnuPlotスクリプト
set terminal wxt
set grid
set xlabel "x"
set ylabel "y"
set title "Sample Plot"
plot sin(x) title "sin(x)" with lines lw 2, \
     cos(x) title "cos(x)" with lines lw 2 lt 3
'@

Set-Content -Path $gnuplotFile -Value $gnuplotContent
Write-Host "✓ サンプルGnuPlotファイルを作成しました: $gnuplotFile" -ForegroundColor Green

# gnuplot-lua-tikzのセットアップ
Write-Host ""
Write-Host "【ステップ4】gnuplot-lua-tikzファイルの設定..." -ForegroundColor Green
Write-Host "スタイルファイルはC:\VSCode\latexフォルダに直接配置します" -ForegroundColor Yellow

# スタイルファイルのチェック
$styFile = "gnuplot-lua-tikz.sty"
$texFile = "gnuplot-lua-tikz-common.tex"

$styFilePath = Invoke-Expression "kpsewhich $styFile"
$texFilePath = Invoke-Expression "kpsewhich $texFile"

# スタイルファイルは直接 C:\VSCode\latex ディレクトリに配置
$vscodeStylesDir = $latexRoot
Write-Host "✓ スタイルファイルは $vscodeStylesDir に配置します" -ForegroundColor Green

if (($styFilePath -and $texFilePath) -and (-not $styFilePath.StartsWith($vscodeRoot))) {
    Write-Host "gnuplot-lua-tikzファイルが既存のシステムに存在します:" -ForegroundColor Yellow
    Write-Host "  $styFile: $styFilePath" -ForegroundColor Yellow
    Write-Host "  $texFile: $texFilePath" -ForegroundColor Yellow
    $copyToVSCode = Read-Host "既存のファイルをC:\VSCode\latexにもコピーしますか? (Y/N)"
    
    if ($copyToVSCode -eq "Y" -or $copyToVSCode -eq "y") {
        Copy-Item -Path $styFilePath -Destination (Join-Path $vscodeStylesDir $styFile)
        Copy-Item -Path $texFilePath -Destination (Join-Path $vscodeStylesDir $texFile)
        Write-Host "✓ ファイルをC:\VSCode\latexディレクトリにコピーしました" -ForegroundColor Green
    }
} elseif ((-not $styFilePath) -or (-not $texFilePath)) {
    Write-Host "gnuplot-lua-tikzファイルが見つかりません。C:\VSCode\latexに作成します..." -ForegroundColor Yellow
    
    # GnuPlotを使用してスタイルファイルを生成
    $gnuplotCmd = @"
gnuplot -e "set term tikz createstyle; exit"
"@
    
    try {
        Invoke-Expression $gnuplotCmd
        Write-Host "✓ gnuplot-lua-tikzスタイルファイルを生成しました" -ForegroundColor Green
        
        # 生成されたファイルをC:\VSCode\latexに移動
        $currentDir = Get-Location
        if (Test-Path (Join-Path $currentDir $styFile)) {
            Copy-Item (Join-Path $currentDir $styFile) $vscodeStylesDir
            Copy-Item (Join-Path $currentDir $texFile) $vscodeStylesDir
            Write-Host "✓ スタイルファイルを $vscodeStylesDir に配置しました" -ForegroundColor Green
            
            # TEXMFメタデータベースを更新する代わりにLaTeXのサーチパスを設定
            # 追加の入力パスをLaTeXに知らせるためにtexmf.cnfファイルを作成
            $texmfCnfDir = Join-Path $vscodeRoot "texmf\web2c"
            if (-not (Test-Path $texmfCnfDir)) {
                New-Item -ItemType Directory -Path $texmfCnfDir -Force | Out-Null
            }
            
            $texmfCnfFile = Join-Path $texmfCnfDir "texmf.cnf"
            $texmfCnfContent = @"
% ローカルのスタイルファイルディレクトリを追加
TEXINPUTS.latex = .;$latexRoot//;
TEXINPUTS.uplatex = .;$latexRoot//;
"@
            Set-Content -Path $texmfCnfFile -Value $texmfCnfContent
            Write-Host "✓ LaTeXの入力パス設定ファイルを作成しました: $texmfCnfFile" -ForegroundColor Green
            
            # 環境変数TEXMFCNFを設定
            [Environment]::SetEnvironmentVariable("TEXMFCNF", $texmfCnfDir, [EnvironmentVariableTarget]::User)
            Write-Host "✓ 環境変数TEXMFCNFを設定しました: $texmfCnfDir" -ForegroundColor Green
            
            # プロジェクトディレクトリにもスタイルファイルのコピーを配置(保険として)
            Copy-Item (Join-Path $currentDir $styFile) $workspacePath
            Copy-Item (Join-Path $currentDir $texFile) $workspacePath
            Write-Host "✓ スタイルファイルのコピーをプロジェクトディレクトリにも配置しました" -ForegroundColor Green
        } else {
            Write-Host "! スタイルファイルが生成されませんでした。手動で設定が必要かもしれません。" -ForegroundColor Yellow
            
            # 手動設定の指示
            Write-Host "  注意: GnuPlotコンソールで 'set term tikz createstyle' を実行し、" -ForegroundColor Yellow
            Write-Host "  生成されたファイルを $vscodeStylesDir$workspacePath に配置してください。" -ForegroundColor Yellow
        }
    } catch {
        Write-Host "! gnuplot-lua-tikzファイルの生成に失敗しました。" -ForegroundColor Red
        Write-Host "  エラー: $_" -ForegroundColor Red
    }
} else {
    Write-Host "✓ gnuplot-lua-tikzファイルがC:\VSCode\latexに既に存在します:" -ForegroundColor Green
    Write-Host "  $styFile: $styFilePath" -ForegroundColor Green
    Write-Host "  $texFile: $texFilePath" -ForegroundColor Green
}

# gnuplot-tikz.luaファイルの修正
Write-Host ""
Write-Host "【ステップ5】gnuplot-tikz.luaファイルの修正..." -ForegroundColor Green

$gnuplotLuaPath = "${env:ProgramFiles}\gnuplot\share\lua\gnuplot-tikz.lua"
if (Test-Path $gnuplotLuaPath) {
    $content = Get-Content $gnuplotLuaPath -Raw
    
    # notimestamp設定を変更
    if ($content -match "notimestamp\s*=\s*false") {
        $newContent = $content -replace "notimestamp\s*=\s*false", "notimestamp = true"
        
        try {
            Set-Content -Path $gnuplotLuaPath -Value $newContent
            Write-Host "✓ gnuplot-tikz.luaファイルを修正しました: $gnuplotLuaPath" -ForegroundColor Green
            Write-Host "  'notimestamp = false' → 'notimestamp = true' に変更しました" -ForegroundColor Green
        } catch {
            Write-Host "! gnuplot-tikz.luaファイルの修正に失敗しました。手動で修正が必要かもしれません。" -ForegroundColor Red
            Write-Host "  エラー: $_" -ForegroundColor Red
            Write-Host "  以下のファイルを管理者権限で開き、'notimestamp = false' を 'notimestamp = true' に変更してください:" -ForegroundColor Yellow
            Write-Host "  $gnuplotLuaPath" -ForegroundColor Yellow
        }
    } else {
        Write-Host "! gnuplot-tikz.luaファイル内に 'notimestamp = false' の設定が見つかりませんでした。" -ForegroundColor Yellow
        Write-Host "  ファイル構造が異なる可能性があります。手動で確認してください: $gnuplotLuaPath" -ForegroundColor Yellow
    }
} else {
    Write-Host "! gnuplot-tikz.luaファイルが見つかりません: $gnuplotLuaPath" -ForegroundColor Red
    Write-Host "  GnuPlotのインストールディレクトリ内の以下のパスにあるはずです:" -ForegroundColor Yellow
    Write-Host "  C:\Program Files\gnuplot\share\lua\gnuplot-tikz.lua" -ForegroundColor Yellow
    Write-Host "  このファイルを手動で探して、'notimestamp = false' を 'notimestamp = true' に変更してください" -ForegroundColor Yellow
}

# VSCode拡張機能のインストール推奨
Write-Host ""
Write-Host "【ステップ6】VSCode拡張機能の推奨..." -ForegroundColor Green
Write-Host "以下のVSCode拡張機能をインストールすることをお勧めします:" -ForegroundColor Yellow
Write-Host "1. LaTeX Workshop - LaTeXのサポート" -ForegroundColor Yellow
Write-Host "2. Code Runner - GnuPlotスクリプトの実行" -ForegroundColor Yellow
Write-Host ""
Write-Host "コマンドでインストールする場合は次のコマンドを実行してください:" -ForegroundColor Yellow
Write-Host "code --install-extension James-Yu.latex-workshop" -ForegroundColor Cyan
Write-Host "code --install-extension formulahendry.code-runner" -ForegroundColor Cyan

# セットアップの完了
Write-Host ""
Write-Host "========================================================" -ForegroundColor Cyan
Write-Host "     環境構築が完了しました!" -ForegroundColor Green
Write-Host "========================================================" -ForegroundColor Cyan
Write-Host ""
Write-Host "作成されたディレクトリ構造:" -ForegroundColor Yellow
Write-Host "C:\VSCode - メインディレクトリ" -ForegroundColor Yellow
Write-Host "└── latex - LaTeXプロジェクト用フォルダ" -ForegroundColor Yellow
Write-Host "    ├── gnuplot-lua-tikz.sty, gnuplot-lua-tikz-common.tex - スタイルファイル" -ForegroundColor Yellow
Write-Host "    └── $projectName - 作成したプロジェクト" -ForegroundColor Yellow
Write-Host ""
Write-Host "次のステップ:" -ForegroundColor Yellow
Write-Host "1. VSCodeで $workspacePath フォルダを開く" -ForegroundColor Yellow
Write-Host "2. main.tex を編集して LaTeX ドキュメントを作成" -ForegroundColor Yellow
Write-Host "3. GnuPlot スクリプトを編集して実行" -ForegroundColor Yellow
Write-Host ""
Write-Host "今すぐVSCodeでプロジェクトを開きますか? (Y/N)" -ForegroundColor Green

$openVSCode = Read-Host
if ($openVSCode -eq "Y" -or $openVSCode -eq "y") {
    Start-Process "code" -ArgumentList $workspacePath
    Write-Host "VSCodeでプロジェクトを開きました。" -ForegroundColor Green
}

Write-Host ""
Write-Host "環境変数の変更を適用するには、新しいコマンドプロンプトを開く必要があります。" -ForegroundColor Yellow
Write-Host "お疲れ様でした!LaTeX+GnuPlot環境の構築が完了しました。" -ForegroundColor Green
Write-Host "このウィンドウは閉じても大丈夫です。" -ForegroundColor Green

# スクリプト終了を待機
Write-Host ""
Write-Host "Enterキーを押して終了..." -ForegroundColor DarkGray
Read-Host

スクリプト使用上の注意点

  1. スクリプトの実行には管理者権限が必要です。PowerShellを「管理者として実行」してスクリプトを実行してください。
  2. 環境変数を変更した場合は、コマンドプロンプトやPowerShellを再起動すると変更が反映されます。
  3. TeX Live、VSCode、GnuPlotがインストール済みであることを前提としています。まだインストールしていない場合は、スクリプトが提供するリンクからインストールしてください。
  4. スクリプト実行後、VSCodeからLaTeX Workshopとの連携が正常に動作しない場合は、VSCodeを再起動してください。
  5. gnuplot-tikz.luaファイルの修正には管理者権限が必要です。自動修正に失敗した場合は、指示に従って手動で修正してください。
  6. Windows環境で特に重要な、touchやrmコマンドの代替設定も.latexmkrcに含まれているため、より安定したビルドが可能です。

まとめ

本記事では、Windows環境でのUpLaTeXとGnuPlotを用いた学術論文執筆環境の構築方法を解説しました。この環境を利用することで、高品質な図表を含む論文やレポートを効率的に作成できます。

特に重要なポイントは以下の通りです:

  1. VSCodeとLaTeX Workshop拡張機能を活用した効率的な編集環境の構築
  2. GnuPlotとLaTeXの連携によるグラフ作成の自動化
  3. gnuplot-tikz.luaファイルの設定修正によるコンパイルの無限ループ問題の解決
  4. latexmkを用いた効率的なビルドプロセスの設定
  5. Windows環境でのtouch/rmコマンド代替設定による安定した動作
  6. 自動セットアップスクリプトによる環境構築の簡素化

この記事で紹介した方法を活用して、ぜひ魅力的で説得力のある学術文書を作成してください。質問や改善点があれば、コメント欄でお知らせください。


参考リンク

Discussion

ログインするとコメントできます