1
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?

LaTeXにChemDrawで描画した化学構造式をシームレスに挿入する

1
Posted at

この記事でできること

  • ChemDrawで描画した化学構造式をSVG形式で出力する操作をアドインにより自動化
  • Inkscapeをバックエンドとして、$\mathrm{\LaTeX}$でSVGを挿入
  • PowerShellスクリプトを用いて一連の操作を自動化

LaTeXと化学

 $\mathrm{\LaTeX}$と言えば、数式を美しく記述することのできる組版ソフトで、長らく数学や物理学の分野で使われてきました。しかし、数学や物理学の分野でしか活用できないかと言われればそうでもありません。$\mathrm{\LaTeX}$には、数式を記述できるだけではなく、美しい文書を作成するうえで非常に強力なツールとなり得ます。
 ただ、その他の分野では$\mathrm{\LaTeX}$はほとんど活用されていないのが現状です。分野ごとに活用されていない原因はそれぞれあると思いますが、今回は特に化学の分野で考えてみたいと思います。

 化学の分野で$\mathrm{\LaTeX}$が浸透していない原因として、以下のような理由が挙げられます。

  • 他の代替ツールがすでに浸透している
    単純な化学反応式であればMS Wordの数式モードで十分ですし、化学構造式はChemDrawなどの専用描画ソフトが存在しています。ChemDrawに関してはWordとの連携がシームレスなので、特に不便を感じることはありません。
  • 新たなツールの使用方法を習得するコストが大きい
    特に$\mathrm{\LaTeX}$はコマンドベースの組版のため、操作もあまり直感的ではなく、新たに習得するコマンドの数も多いです。一応chemfigなど化学構造式を描画するパッケージも存在していますが、日常使いを考えたとき、わざわざコマンドを記述するのは実用性に欠けると言えるでしょう。

 化学構造式を$\mathrm{\LaTeX}$で扱う方法はWeb上に多く公開されていますが、そのどれもが専用のパッケージを用いたコマンドで描画する方法ばかりです。あえて化学の文書を$\mathrm{\LaTeX}$で書くとなったとき、最も大きいハードルになるのは化学構造式の描画でしょう。そこで、何とか化学構造式はChemDrawで描画しつつも、それをシームレスに$\mathrm{\LaTeX}$で扱えるようにする方法はないか考えました。

方針: ChemDrawで描画 → SVGで出力 → \includesvg で挿入

 結局、専用の描画ソフトで書くのが一番なのです。しかし、ChemDrawで描画した構造式を画像形式で出力して$\mathrm{\LaTeX}$に挿入するのでは、$\mathrm{\LaTeX}$を使う意味がありません(PDFやSVGなど、ベクター形式のファイルを簡単に扱えるのが$\mathrm{\LaTeX}$の強みです)。
 そこで、出力形式にSVGを使用します。$\mathrm{\LaTeX}$では、svg パッケージを用いれば \includesvg でSVG形式の画像を挿入できます。通常であれば、名前をつけて保存 -> .svg を選択し特定のフォルダへ保存 -> \includesvg で挿入という操作を行うところですが、毎回行うのは面倒なので、自動化を試みます。ChemDrawを開発しているRevvity社はアドイン開発が可能なJavascript APIを公開しているので、これを利用して作成したアドインを使用します。

導入方法

0. 環境

  • Windows 11 Pro 25H2
  • ChemDraw 25.5.0 64-bit
  • PowerShell 7.5.4
  • LuaTeX 1.22.0 (TeX Live 2025)

ChemDrawのAPIを使用するには17.1以上のバージョンが必要です。

1. ChemDrawにアドインを追加

1. アドインファイルをダウンロード
以下のリンクから structure-exporter.chemdrawaddin をダウンロードします。

2. アドインをインストール
ChemDrawを開き、Add-ins -> Add-in Manager -> Addから structure-exporter.chemdrawaddin を選択しアドインを追加します。

2. Inkscapeのインストール

画像を挿入する graphicx パッケージは .svg ファイルの挿入に対応していません。svg パッケージは、Inkscapeをバックエンドとして利用することで、.svg ファイルの挿入が可能になります。

1. Inkscapeをインストール
公式サイトの Download Now! からInkscapeをダウンロードし、インストールします。

2. Inkscapeのパスを環境変数に追加
ターミナルを開き、以下のコマンドを実行します。もしエラーメッセージが表示されたら、環境変数にInkscapeのパスを通してください。Inkscapeのバージョン情報が表示されたら成功です。

inkscape --version

3. プリアンブルの設定
$\mathrm{\LaTeX}$のプリアンブルは以下のように記述します。

preamble.tex
   \usepackage{svg}
   \svgsetup{inkscapelatex=false} %svg内のテキストをLaTeXで処理しない
   \svgpath{C:/Users/Username/Downloads/} %svgファイルの格納場所の指定 (自分の環境に合わせて変更)

使い方

1. ChemDrawで挿入したい構造式を範囲選択し、Add-ins -> Structure Exporterを選択します。

2. ファイル名を入力し、svg形式でダウンロードします。

Structure Exporter

3. $\mathrm{\LaTeX}$にsvgを挿入します。
通常の figure 環境で、\includesvg{<filename>} で挿入します。

sample.tex
\begin{figure}[htbp]
  \centering
  \includesvg{01_benzene.svg}
  \caption{ベンゼンの構造式}
  \label{fig:benzene}
\end{figure}

すると、以下のようにChemDrawで描画した形を保ったまま、拡大しても劣化しない画像形式で$\mathrm{\LaTeX}$文書に挿入することができました。

LaTeXへsvgを挿入

もう少し便利にしたい

 ChemDrawのアドインでダウンロードしたファイルの保存先は、デフォルトのダウンロードフォルダからはどうしても変えられないようです。このまま運用していけば、大量のsvgファイルが無造作にダウンロードフォルダに転がってしまいます。
 そこで、正規表現を使って特定の .svg ファイルを検出し、自動で特定のフォルダへ移動させるスクリプトを作成します。

1. PowerShellスクリプトを作成し、move_svg.ps1 として適当な場所に保存する
$sourcePath はダウンロードフォルダ、$destPath は自分で設定した移動先のフォルダに書き換えてください。また、保存する際は文字コードに UTF-8 with BOM を指定してください。

move_svg.ps1
# 監視元と移動先
$sourcePath = "C:\Users\Username\Downloads" 
$destPath   = "C:\Users\Username\OneDrive\Documents\svg" # 自分の環境に合わせて変更

# 通知機能
Add-Type -AssemblyName System.Windows.Forms
$notify = New-Object System.Windows.Forms.NotifyIcon
$notify.Icon = [System.Drawing.Icon]::ExtractAssociatedIcon((Get-Process -Id $pid).Path)
$notify.Visible = $true

function Show-Notification ($title, $message) {
    $notify.BalloonTipTitle = $title
    $notify.BalloonTipText  = $message
    $notify.BalloonTipIcon  = "Info"
    $notify.ShowBalloonTip(3000)
}

Show-Notification "Monitoring SVG Files" "監視を開始しました"

# 停止用ファイル
$stopTriggerPath = Join-Path -Path $sourcePath -ChildPath "STOP.txt"

# 監視ループ
while ($true) {
    if (Test-Path $stopTriggerPath) {
        Remove-Item -Path $stopTriggerPath -Force
        Show-Notification "Monitoring SVG Files" "停止ファイルを検知しました。終了します。"
        Start-Sleep -Seconds 2
        $notify.Dispose()
        break 
    }

    Get-ChildItem -Path $sourcePath -Filter "*.svg" | Where-Object { $_.Name -match "^\d{2}_" } | ForEach-Object {
        try {
            Move-Item -Path $_.FullName -Destination $destPath -Force -ErrorAction Stop
            Show-Notification "Monitoring SVG Files" "$($_.Name) を移動しました"            
        } catch {
        }
    }
    
    Start-Sleep -Seconds 5
}

2. PowerShellスクリプトを実行するショートカットを作成する
適当な場所で右クリックし、新規作成 -> ショートカットを選択します。ショートカットの場所は、以下のように記述します。

"C:\Program Files\PowerShell\7\pwsh.exe" -WindowStyle Hidden -ExecutionPolicy Bypass -File "<.ps1ファイルの絶対パス>"

私はPowerShell 7を使用しているのでその実行ファイルを用いていますが、Windowsに標準搭載のPowerShellでも動作するはずなので、"C:\Program Files\PowerShell\7\pwsh.exe" の部分は powershell.exe でも大丈夫です。

3. 作成したショートカットを実行し、ChemDrawで .svg ファイルをダウンロードする
.svg ファイルをダウンロードするときは、必ず 00_filename.svg という書式にしてください(アドインもそれに合わせて入力欄が用意されています)。00_ の部分は、プロジェクトごとに変えるとよいでしょう。

もしエラーなどでスクリプトが実行できない場合は、ファイルのプロパティからセキュリティ設定を変更してみてください。

4. スクリプトがダウンロードされたファイルを検知し、指定されたフォルダへ移動させる
スクリプトを起動させたときもそうですが、ファイルを移動させたときは画像のように通知が届きます。

PowerShellスクリプトの通知

5. 画像を$\mathrm{\LaTeX}$に挿入する
.svg ファイルの保存先はさきほど指定したフォルダに統一するので、プリアンブルは以下のように書き換えます。

preamble2.tex
   \usepackage{svg}
   \svgsetup{inkscapelatex=false} %svg内のテキストをLaTeXで処理しない
   \svgpath{C:/Users/Username/Documents/svg/} 
   % ダウンロードフォルダ以外で指定したsvgファイルの格納場所 (自分の環境に合わせて変更)

6. スクリプトを停止する
ダウンロードフォルダに STOP.txt を作成することで、スクリプトが停止するようにしているので、手動でファイルを作成しスクリプトを停止してください。自動で STOP.txt を作成するバッチファイルを作成してもいいかもしれません。

参考リンク

1
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
1
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?