0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

TeX 文書を名前で選んで編集・ビルドするシェルスクリプト (複数文書の並行作業に便利)

0
Last updated at Posted at 2026-03-12

報告資料や発表資料など、並行して多くの TeX 文書を作成することもあると思います。そのようなケースでは、「来週の発表資料はどれだっけ」となったり、閲覧やアップロードのためにファイルエクスプローラからファイルを探すのが手間だったりすると思います。

なので、TeX 文書にわかりやすい名前を付けて、名前で選択して編集/ビルド/閲覧/アップロードするスクリプトを使っているので以下に示します。実行すると以下のように文書及び操作を選択できます。文書 (番号または名前) と操作を引数で渡すこともできます。

$ ./run.sh
1. 原稿B
2. 発表資料C
3. 発表資料D
番号を選んでください: 2
選択: 発表資料C (docs/c/slide.tex, -xelatex)
操作を選んでください (e:編集, b:ビルド, u:アップロード, v:閲覧): e
エディタを開きます: 発表資料C

シェルスクリプトと使い方

  • まずはお手元の文書に適当な名前を付けて「設定記入欄」に登録してください。
    • 各文書が latexmk -lualatex main.texlatexmk -xelatex slide.tex のようにビルドできることを想定しています (ビルドコマンドが異なる場合は、適宜必要なパラメータを追加して「ビルドします」以下を修正ください)。
    • 文書パスは絶対パスまたはこのシェルスクリプトからの相対パスにしてください。このシェルスクリプト自体はどこからでも実行できます (自身の場所に pushd します)。
    • 「現在作業中の文書」に記述した文書は、選択肢として番号を振ってします。最初から引数に番号を渡すこともできます。現在作業中でない文書も含めて、引数に名前を渡すこともできます。
      • なので文書の名前は、現在作業中の文書数以下の数字にはしないでください (現在作業中の文書番号なのか文書名なのか識別できないため)。
  • 編集/ビルド/閲覧/アップロード実行箇所もご利用のソフトを呼び出すように修正ください (本記事のシェルスクリプトでは、編集環境は Windows + サクラエディタ、閲覧環境は Windows + Obsidian、アップロードは rclone を前提にしています)。
  • それらが準備できたら、シェルスクリプト冒頭の例のように実行ください。
run.sh
#!/usr/bin/bash
# 手元の TeX 文書を選んで編集/ビルド/閲覧/アップロードをするスクリプトです
# 手元の TeX 文書に適当な名前を付けて「設定記入欄」に登録しておいてください
# 使い方:
#   引数を何も渡さなければ、文書とその文書への操作を対話で訊いてきます
#   1つ目の引数に文書 (名前か番号)、2つ目の引数に操作 (e/b/v/u) を指定もできます
#   例: ./run.sh  # 対話で入力
#   例: ./run.sh 1 e  # 現在作業中の1番目の文書を編集
#   例: ./run.sh 発表資料D v  # 発表資料Dを閲覧
pushd "$(cd "$(dirname "$0")" && pwd)" > /dev/null

# =============== 設定記入欄 ===============
# 各文書の設定を書きます (ファイルパスやビルドエンジン)
get_config() {
  case "$1" in
    "原稿A") printf '%s|%s' "docs/a/main.tex" "-lualatex" ;;
    "原稿B") printf '%s|%s' "docs/b/main.tex" "-lualatex" ;;
    "発表資料C") printf '%s|%s' "docs/c/slide.tex" "-xelatex" ;;
    "発表資料D") printf '%s|%s' "docs/d/slide.tex" "-xelatex" ;;
  esac
}

# 現在作業中の文書のリストを書きます (番号を振る文書を絞る用)
targets=(
  "原稿B"
  "発表資料C"
  "発表資料D"
)

# =============== メイン処理 ===============
key="${1:-0}"
action="${2:-NOT_SPECIFIED}"
selected=""

# key がいずれかの文書名か判定します (設定が取得できるかどうかで判定)
if [ -n "$(get_config "$key")" ]; then
  selected="$key"
fi

# key が文書名でないなら有効な番号か判定し有効でなければ入力を促します
if [ -z "$selected" ]; then
  if ! ( [ "$key" -ge 1 ] 2>/dev/null && [ "$key" -le "${#targets[@]}" ] ); then
    i=1
    for target in "${targets[@]}"; do
      printf '%d. %s\n' "$i" "$target"
      i=$((i+1))
    done
    printf '番号を選んでください: '
    read -r key
  fi
  if [ "$key" -ge 1 ] 2>/dev/null && [ "$key" -le "${#targets[@]}" ]; then
    selected="${targets[$((key-1))]}"
  fi
fi

# action を引数または入力から受け取って実行します
if [ -n "$selected" ]; then
  IFS='|' read -r path engine < <(get_config "$selected")
  printf '選択: %s\n' "${selected} (${path}, ${engine})"
  if [ "$action" = "NOT_SPECIFIED" ]; then
    printf '操作を選んでください (e:編集, b:ビルド, u:アップロード, v:閲覧): '
    read -r action
  fi
  case "$action" in
    e)
      printf 'エディタを開きます: %s\n' "$selected"
      po=(powershell.exe -NoProfile -Command)
      sakura="C:\Program Files (x86)\sakura\sakura.exe"
      "${po[@]}" "Start-Process -FilePath '${sakura}' -ArgumentList @('$path')" ;;
    b)
      printf 'ビルドします: %s\n' "$selected"
      pushd "$(dirname "$path")"
      latexmk "$2" "$(basename "$path")"
      popd ;&
    v)
      printf '閲覧します: %s\n' "$selected"
      po=(powershell.exe -NoProfile -Command)
      pdf="${path%.tex}.pdf"
      "${po[@]}" "Start-Process 'obsidian://open?vault=hoge&file=${pdf}'" ;;
    u)
      printf 'アップロードします: %s\n' "$selected"
      remote="gdrive:/Hoge/Docs/"
      pdf="${path%.tex}.pdf"
      rclone copy "$pdf" "$remote" ;;
    *)
      printf '操作が特定できませんでした\n' ;;
  esac
else
  printf '対象の文書が特定できませんでした\n'
fi

popd > /dev/null

備考

  • 手元ではビルド後に別の場所にコピーしたり、ビルドコマンドに引数がもっとあったりして (英語原稿のビルド時に日本語下書きを含めるかどうかなど) ビルド処理が長くなっているため、ビルド処理は別シェルスクリプトに書いて bash build.sh 引数 としています。
  • 手元では Google ドライブにアップロード後にブラウザを開いています (下記)。
  • Windows 限定ですが、別記事に書いた音声ランチャーとも連携できます (下記)。連携すると声だけで (手をマウスに移さずに) 必要なウィンドウを最前面にできて便利です。
    • ちなみに「アップロード」は発話すると長いし、別の資料のアップロードと誤分類されやすいので言い換えるのがおすすめです。
ブラウズする例
browse() {
  local po=(powershell.exe -NoProfile -Command)
  local chrome="C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"
  local profile='--profile-directory="Profile 1"'
  local url='https://drive.google.com/drive/folders/xxxxxxxxx'
  "${po[@]}" "Start-Process -FilePath '${chrome}' -ArgumentList '${profile}','${url}'"
}
音声ランチャー用の .vui.json との連携例
{
    "コマンド一覧": "cat .vui.json",
    "打合せ資料を編集": "bash path/to/run.sh 打合せ資料 e",
    "打合せ資料をビルド": "bash path/to/run.sh 打合せ資料 b",
    "打合せ資料を閲覧": "bash path/to/run.sh 打合せ資料 v",
    "打合せ資料を共有": "bash path/to/run.sh 打合せ資料 u",
    "ポスターを編集": "bash path/to/run.sh ポスター e",
    "ポスターをビルド": "bash path/to/run.sh ポスター b",
    "ポスターを閲覧": "bash path/to/run.sh ポスター v",
    "ポスターを共有": "bash path/to/run.sh ポスター u"
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?