VScode住人の探検記

Visual Studio Codeでなんでもこなすのがポリシー。LaTeX(2020/7/19~), C(2021/1/25~), C#(2/4~), HTML&CSS(2/14~), Python(2/16~), JavaScript(2/28~), jQuery(3/18~), Sass(Scss)(3/20~),シェルスクリプト(3/21~), jCanvas(5/21~), WordPress(5/23~), PHP(5/31~)

LaTeXで色付きニューマン投影式を描く【LaTeXのnewcommand】

\usepackage{chemmacros}と入力するとbegin{document}に対してundefined control sequenceエラーが出るという謎の現象が発生しており、2日間いろいろな策を試みたものの一向に解決の兆しが見えないため、いよいよ最終手段に出ることにした。

その最終手段とは…結局chemmacrosの使用は諦め、
『他のパッケージで代用できない機能は自分で作る』

というわけで、まずはchemmacros独自の機能であるニューマン投影式の描画コマンドの代わりとなるものを自作しよう。
chemmacrosのプログラムはexpl3とxparseによって記述されている。しかし、expl3はまったく分からない上、それ自体がエラーの原因になっている可能性も否定できないため、ここは無難にtikzとLaTeXのnewcommand機能を用いて作成することとする。

そして完成品がこちら。

  • ねじり型ニューマン投影式…\nejinewm
  • なり型ニューマン投影式…\kasanewm
  • 色分けバージョン…語尾にcl
\nejinewm{H}{CH}{F}{Cl}{N}{O}%下図の左から1番目を出力する
\nejinewmcl{H}{CH}{F}{Cl}{N}{O}%下図の左から2番目を出力する
\kasanewm{H}{CH}{F}{Cl}{N}{O}%下図の右から2番目を出力する
\kasanewmcl{H}{CH}{F}{Cl}{N}{O}%下図の右から1番目を出力する

…と入力すると、下図が簡単に描ける。{ }内は分かりやすいようにすべて違う原子団にしている。もちろん{ }内に好きな原子団を放り込めばよい。
f:id:nix_campane:20200829011832p:plain

ソースコードはこちら。
プリアンブルに記述するには長すぎるので、コピペして適当な名前のstyファイルとして保存し、usepackageで呼び出して使うのがオススメ。

%アルファベットや数式をちょっと可愛くするフォントパッケージ(お好みで。使わなくてもよし)
\usepackage[math]{anttor}
%必須
\usepackage{xcolor}
\usepackage{tikz}
\usetikzlibrary{calc,intersections}

%手前の炭素につく基の色の定義(RGB以降は好きな色に書き換えてもよし)
\definecolor{plmomo}{RGB}{248,22,147}
%後ろの炭素とその基の色(RGB以降は好きな色に書き換えてもよし)
\definecolor{plmizu}{RGB}{2,181,238}

%ねじり型ニューマン投影式描画コマンドnejinewm
\newcommand{\nejinewm}[6]{
\begin{tikzpicture}
  \coordinate (C) at (0,0) ;
  \foreach \angle in {90,210,330}
   {
     \draw (C) -- ++(\angle:1.5) coordinate (C-\angle) ;
   }
  \draw
    (C) circle (.75);
  \foreach \angle in {30,150,270}
    {
      \draw (C) ++(\angle:.75)--++(\angle:.75) coordinate (C-\angle) ;
    }
  \foreach \angle in {30}
    { \node[inner sep=0,anchor=180+\angle] at (C-\angle) {#1} ; }
  \foreach \angle in {90}
    { \node[inner sep=0,anchor=180+\angle] at (C-\angle) {#2} ; }
  \foreach \angle in {150}
    { \node[inner sep=0,anchor=180+\angle] at (C-\angle) {#3} ; }
  \foreach \angle in {210}
    { \node[inner sep=0,anchor=180+\angle] at (C-\angle) {#4} ; }
  \foreach \angle in {270}
    { \node[inner sep=0,anchor=180+\angle] at (C-\angle) {#5} ; }
  \foreach \angle in {330}
    { \node[inner sep=0,anchor=180+\angle] at (C-\angle) {#6} ; }
\end{tikzpicture}
}

%色付きのねじり型ニューマン投影式描画コマンドnejinewmcl
\newcommand{\nejinewmcl}[6]{
\begin{tikzpicture}
  \coordinate (C) at (0,0) ;/
  \foreach \angle in {90,210,330}
   {
     \draw[very thick,plmomo](C) -- ++(\angle:1.5) coordinate (C-\angle) ;
   }
  \draw[plmizu](C) circle (.75);
  \foreach \angle in {30,150,270}
    {
      \draw[very thick,plmizu](C) ++(\angle:.75)--++(\angle:.75) coordinate (C-\angle) ;
    }
  \foreach \angle in {30}
    { \node[very thick,plmizu,inner sep=0,anchor=180+\angle] at (C-\angle) {#1} ; }
  \foreach \angle in {90}
    { \node[very thick,plmomo,inner sep=0,anchor=180+\angle] at (C-\angle) {#2} ; }
  \foreach \angle in {150}
    { \node[very thick,plmizu,inner sep=0,anchor=180+\angle] at (C-\angle) {#3} ; }
  \foreach \angle in {210}
    { \node[very thick,plmomo,inner sep=0,anchor=180+\angle] at (C-\angle) {#4} ; }
  \foreach \angle in {270}
    { \node[very thick,plmizu,inner sep=0,anchor=180+\angle] at (C-\angle) {#5} ; }
  \foreach \angle in {330}
    { \node[very thick,plmomo,inner sep=0,anchor=180+\angle] at (C-\angle) {#6} ; }
\end{tikzpicture}
}

%重なり型ニューマン投影式描画コマンドkasanewm
\newcommand{\kasanewm}[6]{
\begin{tikzpicture}
  \coordinate (C) at (0,0) ;
  \foreach \angle in {90,210,330}
   {
     \draw (C) -- ++(\angle:1.5) coordinate (C-\angle) ;
   }
  \draw
    (C) circle (.75);
  \foreach \angle in {75,195,315}
    {
      \draw (C) ++(\angle:.75)--++(\angle:.75) coordinate (C-\angle) ;
    }
  \foreach \angle in {75}
    { \node[inner sep=0,anchor=180+\angle] at (C-\angle) {#1} ; }
  \foreach \angle in {90}
    { \node[inner sep=0,anchor=180+\angle] at (C-\angle) {#2} ; }
  \foreach \angle in {195}
    { \node[inner sep=0,anchor=180+\angle] at (C-\angle) {#3} ; }
  \foreach \angle in {210}
    { \node[inner sep=0,anchor=180+\angle] at (C-\angle) {#4} ; }
  \foreach \angle in {315}
    { \node[inner sep=0,anchor=180+\angle] at (C-\angle) {#5} ; }
  \foreach \angle in {330}
    { \node[inner sep=0,anchor=180+\angle] at (C-\angle) {#6} ; }
\end{tikzpicture}
}


%色付きの重なり型ニューマン投影式描画コマンドkasanewmcl
\newcommand{\kasanewmcl}[6]{
\begin{tikzpicture}
  \coordinate (C) at (0,0) ;/
  \foreach \angle in {90,210,330}
   {
     \draw[very thick,plmomo](C) -- ++(\angle:1.5) coordinate (C-\angle) ;
   }
  \draw[plmizu](C) circle (.75);
  \foreach \angle in {75,195,315}
    {
      \draw[very thick,plmizu](C) ++(\angle:.75)--++(\angle:.75) coordinate (C-\angle) ;
    }
  \foreach \angle in {75}
    { \node[very thick,plmizu,inner sep=0,anchor=180+\angle] at (C-\angle) {#1} ; }
  \foreach \angle in {90}
    { \node[very thick,plmomo,inner sep=0,anchor=180+\angle] at (C-\angle) {#2} ; }
  \foreach \angle in {195}
    { \node[very thick,plmizu,inner sep=0,anchor=180+\angle] at (C-\angle) {#3} ; }
  \foreach \angle in {210}
    { \node[very thick,plmomo,inner sep=0,anchor=180+\angle] at (C-\angle) {#4} ; }
  \foreach \angle in {315}
    { \node[very thick,plmizu,inner sep=0,anchor=180+\angle] at (C-\angle) {#5} ; }
  \foreach \angle in {330}
    { \node[very thick,plmomo,inner sep=0,anchor=180+\angle] at (C-\angle) {#6} ; }
\end{tikzpicture}
}

…白状しよう。
実はゼロから自分で作ったわけではない。(そもそもtikzの使用自体が今回が初体験なので何一つわからなかった)下記リンクにあるコードをベースにいろいろいじったのである。

Newman-Projektion mit chemmacros - TeXwelt