アイディア倉庫

Clear認定ノート作家のtomixyです。解析学と有機化学の鬼筆記量が辛いのでLaTeXでのノート作成を画策中。

LaTeXで使える付箋風の枠【tcolorboxの可能性】

tcolorboxのマニュアルの8.3節にある作例にちょっとだけ手を加えたら、思いがけず可愛らしい付箋のような枠が生まれたので記録しておく。

コード全文

\usepackage[dvipdfmx]{graphicx,color}%オプションは一例
\usepackage{xcolor}

\usepackage{tikz}
\usetikzlibrary{calc}%座標を使って図形を描くために必要

\usepackage{xparse}%オプション(省略可能引数)をもつコマンド作成

\usepackage{tcolorbox}
\tcbuselibrary{listings,breakable,xparse,skins,hooks}
 %listings…私の環境ではbreakableを使う際に必要
 %breakable…ページまたぎ可能な枠を作成できる
 %xparse…オプションをもつ枠を作成できる
 %skins…TikZで枠のデザインを描き足せる
 %hooks…多種多様な機能が含まれるため、とりあえず読み込んでおくと安全
 %           たとえばunderlay unbrokenに必要
 
%付箋環境~水色バージョン~の定義
\DeclareTColorBox{fusenmz}{m O{} }%
{enhanced,
 colframe=white,
 colback=yellow!10!white,
 coltitle=cyan!40!black, 
 fonttitle=\bfseries,breakable,
 underlay unbroken={\begin{tcbclipinterior}
                             \shade[inner color=cyan!80!yellow,outer color=yellow!10!white] (interior.north east) circle (2cm);
                             \draw[help lines,step=5mm,yellow!80!black,shift={(interior.north west)}] (interior.south west) grid (interior.north east);
                           \end{tcbclipinterior}}, 
 underlay first={\begin{tcbclipinterior}
                       \shade[inner color=cyan!80!yellow,outer color=yellow!10!white] (interior.north west) circle (2.5cm);
                       \draw[help lines,step=5mm,yellow!80!black,shift={(interior.north west)}] (interior.south west) grid (interior.north east);
                    \end{tcbclipinterior}}, 
 underlay last={\begin{tcbclipinterior}
                       \draw[help lines,step=5mm,yellow!80!black,shift={(interior.north west)}] (interior.south west) grid (interior.north east);
                    \end{tcbclipinterior}}, 
 title={#1},
 attach title to upper=\quad, #2
}

%付箋環境~桃色バージョン~の定義
\DeclareTColorBox{fusenmm}{m O{} }%
{enhanced,
 colframe=white,
 colback=yellow!10!white,
 coltitle=magenta!40!black, 
 fonttitle=\bfseries,
 breakable,
 underlay unbroken={\begin{tcbclipinterior}
                             \shade[inner color=magenta!80!yellow,outer color=yellow!10!white] (interior.north east) circle (2cm);
                             \draw[help lines,step=5mm,yellow!80!black,shift={(interior.north west)}] (interior.south west) grid (interior.north east);
                          \end{tcbclipinterior}}, 
 underlay first={\begin{tcbclipinterior}
                       \shade[inner color=magenta!80!yellow,outer color=yellow!10!white] (interior.north west) circle (2.5cm);
                       \draw[help lines,step=5mm,yellow!80!black,shift={(interior.north west)}] (interior.south west) grid (interior.north east);
                    \end{tcbclipinterior}}, 
 underlay last={\begin{tcbclipinterior}
                       \draw[help lines,step=5mm,yellow!80!black,shift={(interior.north west)}] (interior.south west) grid (interior.north east);
                    \end{tcbclipinterior}}, 
 title={#1},
 attach title to upper=\quad, 
 #2
}

使用法

%fusenmzの場合も同様
\begin{fusenmm}{タイトル}[さらなるtcolorboxのオプション]
テキスト
\end{fusenmm}

使用例ギャラリー

%プリアンブルに追加
\usepackage[math]{anttor}%オシャレな数式・英文フォント
\usepackage{enumerate}

%この下は\begin{document}以降

\begin{fusenmm}{My Title}
\begin{enumerate}[(1)]
\item A,A,B,C,Dを1列に並べる並べ方は何通りあるか。
\item A,A,B,B,C,Dを1列に並べる並べ方は何通りあるか。
\end{enumerate}
\end{fusenmm}

\begin{fusenmz}{My Title}
\begin{enumerate}[(1)]
\item A,A,B,C,Dを1列に並べる並べ方は何通りあるか。
\item A,A,B,B,C,Dを1列に並べる並べ方は何通りあるか。
\end{enumerate}
\end{fusenmz}

f:id:nix_campane:20210110144154j:plain

前回紹介したリングノート枠の中で使えば、付箋ノート風になってますます可愛いのでは…?

なお、付箋らしさは損なわれるが、一応ページまたぎも可能である。

ページまたぎ可能なリングノート枠【tcolorboxの可能性】

f:id:nix_campane:20210110131300j:plain

ありそうでなかなかない、LaTeXで使えるリングノート枠。
下のブログを見つけてfancyparに惚れこんだものの、ページまたぎができないと察して頭を抱えていた。

konoyonohana.blog.fc2.com

ならば自分で作ればいいじゃないか!という持ち前の勢いの良さで、tcolorboxのマニュアル(※530ページ、全文英語)を読み始める。
その他にも海外ブログやら類似パッケージのstyファイルやらいろいろなものを読み漁って、なんとか丸1日で実装にこぎ着けたので、コード全文とその解説をまとめておく。

なお、以下ではすべてpLaTeX(ptex2pdf)でコンパイルしている。

手順0,制作の方向性

fancyparは『個々の段落を装飾する』マクロ集であり、複数の段落をまとめて囲むことは想定されていない。実際、fancyparパッケージで定義されているものはコマンドであり、環境ではないので、(\parboxで囲んで無理やり1行と認識させない限り)内部で改行などをすればエラーが吐き出されるはずである。

そこで今回実装したいのは、fancyparの\NotebookParというコマンドで出力されるリングノート枠の改良版だ。
具体的には、次のような機能をもつものを作りたい。

  • 枠内で改行可能
  • ページまたぎ可能
  • 枠内であらゆるコマンドや環境が使える

なお、個人的に罫線は無い方が読みやすい気がするので、本家のような罫線はつけない方向で行く。

手順1,fancyparのstyファイルからリング部分のコードを抜き出す

結論から言うと、fancypar.styの116~124行目がリング部分を記述するコードである。

    \tikz{%
      \draw[draw=black,fill=white] (-1,-0.3) circle (3pt);%リング穴を描画
      \ifFP@fancypar@spiral%spiral=trueというオプションをつけた場合は以下の処理(リングを描画)
        \draw[very thin,rotate=4,double=\FancyNSColor,%
          double distance=1.5pt]%
          (-1,-0.2) arc (40:-250:10pt and 2pt);%
      \else\relax%spiral=falseというオプションをつけた場合は何もしない
      \fi
    }

今回はspiral=trueとしてリングノート風の出力を得たいので、リング穴とリングを描画するコードだけ抜き出す。

 \tikz{%
      \draw[draw=black,fill=white] (-1,-0.3) circle (3pt);%リング穴を描画
      \draw[very thin,rotate=4,double=\FancyNSColor,%この行以下でリングを描画
          double distance=1.5pt]%
          (-1,-0.2) arc (40:-250:10pt and 2pt);%
 }

\FancyNSColorという色は、43行目で次のように定義されている。

\DeclareOptionX[FP]<fancypar>{spiralcolor}{\def\FancyNSColor{#1}}

これは、spiralcolor=…というオプションで指定した色が\FancyNSColorであるという意味だが、今回はそのようなオプションはつけずにデフォルトの色を指定することにする。
fancyparパッケージのドキュメント(fancypar.pdf)の6ページを見ると、デフォルトの色はLightYellow3であるらしい。
インターネットでRGB値を調べ、次のように定義しておく。

\definecolor{lightyellowiii}{RGB}{205,205,180}

先ほどの\FancyNSColorをlightyellowiiiに置き換えて、次のようにするとコンパイルが可能になる。

\documentclass[a4paper,12pt,dvipdfmx]{jsarticle}
\usepackage[dvipdfmx]{graphicx,color}
\usepackage{xcolor}
\usepackage{tikz}
\usetikzlibrary{calc}
\definecolor{lightyellowiii}{RGB}{205,205,180}

\begin{document}

 \tikz{%
      \draw[draw=black,fill=white] (-1,-0.3) circle (3pt);%リング穴を描画
      \draw[very thin,rotate=4,double=lightyellowiii,%この行以下でリングを描画
          double distance=1.5pt]%
          (-1,-0.2) arc (40:-250:10pt and 2pt);%
 }
 
\end{document}

コンパイル結果は、次のようになる。

f:id:nix_campane:20210110131158j:plain

手順2,リングを新たなデコレーション単位として定義する

さて、問題はこのリングをどうやって枠の左上から左下までに渡って等間隔に配置するか?なのだが、散々ネットを徘徊した末に、次の方法で実装できそうな予感がしてきた。

TikZにはdecoration.shapesというライブラリがある。
このライブラリを読み込むと、予め定義した図形(猫の足跡とか)を何度もスタンプを押すように並べることができるようになる。
そこで、先ほど描画したリング1つを新たなスタンプとして定義して、枠の左上から左下まで並べていけば、目的のレイアウトは実現できそうだ。

その前に、先ほど描いたリングを90°回転させておく。

\documentclass[a4paper,12pt,dvipdfmx]{jsarticle}
\usepackage[dvipdfmx]{graphicx,color}
\usepackage{xcolor}
\usepackage{tikz}
\usetikzlibrary{calc}
\definecolor{lightyellowiii}{RGB}{205,205,180}

\begin{document}

 \tikz{%
      \draw[draw=black,fill=white,rotate=90] (-1,-0.2) circle (3pt);%rotate=90で90°回転、回転させるとリングと穴がズレるので、穴となる円の中心をちょっとずらした
      \draw[very thin,rotate=90,double=lightyellowiii,%rotate=90で90°回転
          double distance=1.5pt]
          (-1,-0.2) arc (40:-250:10pt and 2pt);
 }
 
\end{document}

コンパイル結果は

f:id:nix_campane:20210110131214j:plain

どうやらスタンプとして並べられるときに図形が-90°回転されるようなので、予め90°回転させておかないと目的の出力が得られない。

自分で新たなスタンプを定義するには、\pgfdeclaredecorationコマンドを用いるらしい。
上の画像のリングをspiralスタンプとして、次のように定義する。

\pgfdeclaredecoration{spiral}{initial}
{
 \state{initial}
[width=\pgfdecoratedpathlength/floor(\pgfdecoratedpathlength/13pt] %13がリングの間隔を決める
  {
      \draw[draw=black,fill=white,rotate=90] (-1,-0.2) circle (3pt);%ここからがさっきのコード
      \draw[very thin,rotate=90,double=lightyellowiii,%
          double distance=1.5pt]%
          (-1,-0.2) arc (40:-250:10pt and 2pt);%ここまでがさっきのコード
  }
  \state{final}
  {
    \pgfpathmoveto{\pgfpointdecoratedpathlast}
  }
}

コードの意味についてはとりあえず省略(実はまだあんまりよくわかっていない)
とりあえず、
13より大きな値にするとリングの間隔はより広くなる。小さな値にするとより狭くなる。ここは好みで調整

実際にこのスタンプを使ってみよう。

 \tikz{
         \draw[decorate,decoration={spiral}]  %spiralスタンプを使う宣言
          (0,0)--(0,-10);% (0,0)と(0,-10)を結ぶ直線状にスタンプを並べる
 }

のようにしてスタンプを並べることができる。
コンパイル用の完全版は、

\documentclass[a4paper,12pt,dvipdfmx]{jsarticle}
\usepackage[dvipdfmx]{graphicx,color}
\usepackage{xcolor}
\usepackage{tikz}
\usetikzlibrary{calc,%座標を使って図形を描くために必要
                   decorations.shapes}%スタンプを並べるために必要
\definecolor{lightyellowiii}{RGB}{205,205,180}

\pgfdeclaredecoration{spiral}{initial}%ここからがさっきのspiralスタンプの定義
{
 \state{initial}[width=\pgfdecoratedpathlength/floor(\pgfdecoratedpathlength/13pt)] 
  {
      \draw[draw=black,fill=white,rotate=90] (-1,-0.2) circle (3pt);%
      \draw[very thin,rotate=90,double=lightyellowiii,%
          double distance=1.5pt]%
          (-1,-0.2) arc (40:-250:10pt and 2pt);
  }
  \state{final}
  {
    \pgfpathmoveto{\pgfpointdecoratedpathlast}
  }
}%ここまでがさっきのspiralスタンプの定義

\begin{document}

 \tikz{
         \draw[decorate,decoration={spiral}]  %spiralスタンプを使う宣言
          (0,0)--(0,-10);% (0,0)と(0,-10)を結ぶ直線状にスタンプを並べる
 }

\end{document}

コンパイル結果は、

f:id:nix_campane:20210110131234j:plain

手順3,デコレーション機能をtcolorboxのデザインで使う

tcolorboxでは、『左上』などの位置情報を方角で表現する。

  • 枠の左上の角…frame.north west
  • 枠内部の左上端…interior.north west

よって、枠の左上から左下にわたってspiralスタンプを並べる命令は次のようにかける。

\draw[decorate,decoration={spiral}]  ($(interior.north west)+(1.375,0)$)--($(interior.south west)+(1.375,0)$);

(※いい感じにリングノートに見えるように、左端から少しずらしている)

ringnote環境のコード全文

\documentclass[a4paper,12pt,dvipdfmx]{jsarticle}%オプションは一例
\usepackage[dvipdfmx]{graphicx,color}%オプションは一例
\usepackage{xcolor}

\usepackage{tikz}
\usetikzlibrary{calc,%座標を使って図形を描くために必要
                   decorations.shapes}%スタンプを並べるために必要

\usepackage{xparse}%オプション(省略可能引数)をもつコマンド作成

\usepackage{tcolorbox}
\tcbuselibrary{listings,breakable,xparse,skins,hooks}
 %listings…私の環境ではbreakableを使う際に必要
 %breakable…ページまたぎ可能な枠を作成できる
 %xparse…オプションをもつ枠を作成できる
 %skins…TikZで枠のデザインを描き足せる
 %hooks…多種多様な機能が含まれるため、とりあえず読み込んでおくと安全
 %           たとえばunderlay unbrokenに必要
 
%リング色の定義
\definecolor{lightyellowiii}{RGB}{205,205,180}

%spiralスタンプの定義
\pgfdeclaredecoration{spiral}{initial}
{
 \state{initial}[width=\pgfdecoratedpathlength/floor(\pgfdecoratedpathlength/13pt)] 
  {
      \draw[draw=black,fill=white,rotate=90] (-1,-0.2) circle (3pt);%
      \draw[very thin,rotate=90,double=lightyellowiii,%
          double distance=1.5pt]%
          (-1,-0.2) arc (40:-250:10pt and 2pt);
  }
  \state{final}
  {
    \pgfpathmoveto{\pgfpointdecoratedpathlast}
  }
}

%リングノート枠の定義(tcolorbox)
\DeclareTColorBox{ringnote} 
                                    { O{} O{white} O{} }%Oはオプション引数(省略可能)であることを表す。#1,#3は省略したら何もしない、#2は省略したらwhiteになる
{ enhanced,%必須
  colback=#2,%枠内の背景色を#2にする
  breakable,%ページまたぎ可能にする
  sharp corners,%枠の角を尖らせる
  left*=10mm,%枠の左辺から枠内のテキストまでの余白を調整
  boxrule=0.4pt,%枠の囲み線の太さを0.4ptにする
  %ここまでで枠を描く↑↑↑
  %ここから枠にリングを書き足す↓↓↓(underlay…枠の上にTikZで描画する)
  underlay unbroken={\draw[decorate,decoration={spiral}]  ($(interior.north west)+(1.375,0)$)--($(interior.south west)+(1.375,0)$);},%ページをまたがないときの枠のデザイン
  underlay first={\draw[decorate,decoration={spiral}]  ($(interior.north west)+(1.375,0)$)--($(interior.south west)+(1.375,0)$);},%ページをまたぐときの最初のページの枠のデザイン
  underlay middle={\draw[decorate,decoration={spiral}]  ($(interior.north west)+(1.375,0)$)--($(interior.south west)+(1.375,0)$);},%ページをまたぐときの途中のページの枠のデザイン
  underlay last={\draw[decorate,decoration={spiral}]  ($(interior.north west)+(1.375,0)$)--($(interior.south west)+(1.375,0)$);},%ページをまたぐときの最後のページの枠のデザイン
  %ここからはオプションの定義↓↓↓
  IfValueTF={#1}%#1があるかないかによって次のように処理が異なる
                {title=#1}%#1があるときは、#1をtitleとする(title枠が描かれる)
                {},%#1がないときは、title枠なし
  #3%#3があるときは、#3を枠のデザインとして追加する
}

ringnote環境の使い方

\begin{ringnote}[タイトル][テキスト背景色][さらなるtcolorboxオプション]
テキスト
\end{ringnote} 

使用例ギャラリー(ページをまたがない例)

\usepackage{lipsum}%ダミーテキスト
%ここまでをプリアンブルに追加↑↑↑
%ここからは\begin{document}以降

\begin{ringnote}%タイトル枠なし
\lipsum[1]
\end{ringnote}

f:id:nix_campane:20210110131300j:plain

\usepackage{lipsum}%ダミーテキスト
%ここまでをプリアンブルに追加↑↑↑
%ここからは\begin{document}以降

\begin{ringnote}[title]%タイトル枠あり
\lipsum[1]
\end{ringnote}

f:id:nix_campane:20210110131310j:plain

\usepackage{lipsum}%ダミーテキスト
%ここまでをプリアンブルに追加↑↑↑
%ここからは\begin{document}以降

\begin{ringnote}[title][green!7]%タイトル枠あり、枠内テキスト背景色green!7
\lipsum[1]
\end{ringnote}

f:id:nix_campane:20210110131330j:plain

\usepackage{lipsum}%ダミーテキスト
%ここまでをプリアンブルに追加↑↑↑
%ここからは\begin{document}以降

\begin{ringnote}[][green!7]%タイトル枠なし、枠内テキスト背景色green!7
\lipsum[1]
\end{ringnote}

f:id:nix_campane:20210110131343j:plain

\usepackage{lipsum}%ダミーテキスト
%ここまでをプリアンブルに追加↑↑↑
%ここからは\begin{document}以降

\begin{ringnote}[title][green!7][colbacktitle=blue!5,%タイトル枠背景色blue!5
                                       colframe=white,%枠の色white
                                       coltitle=blue!50!black]%タイトルの文字色blue!50!black
\lipsum[1]
\end{ringnote}

f:id:nix_campane:20210110131352j:plain

\usepackage{lipsum}%ダミーテキスト
\definecolor{powderblue}{RGB}{230,230,255}%色パウダーブルーの定義
\usepackage{frcursive}%フランス語筆記体フォント(タイトルに使用)
%ここまでをプリアンブルに追加↑↑↑
%ここからは\begin{document}以降

\begin{ringnote}[\bfseries\textcursive{title}][powderblue!50!white][colframe=white,%枠の色white
                                                                    title style={fill,left color=red!20!white,right color=blue!20!white},%タイトル枠背景を左側red!20!white・右側blue!20!whiteのグラデーションに
                                                                    coltitle=cyan!50!white]%タイトルの文字色cyan!50!white
\lipsum[1]
\end{ringnote}

f:id:nix_campane:20210110131403j:plain

使用例ギャラリー(ページをまたぐ例)

\usepackage{lipsum}%ダミーテキスト
%ここまでをプリアンブルに追加↑↑↑
%ここからは\begin{document}以降

\begin{ringnote}[title]
\lipsum[1-9]
\end{ringnote}


f:id:nix_campane:20210110131426j:plain
f:id:nix_campane:20210110131430j:plain
f:id:nix_campane:20210110131422j:plain

Dimention too large対策【minipage環境でTeXを騙せ】

xymatrixを使用していると、しょっちゅうdimention too largeエラー地獄に陥る。
最終的なエラーメッセージの少し上には、
Overfull \vbox (数字pt too high) has occurred while \output is active
という記述がある。
数字の部分は場合によって異なるらしく、10未満であれば

\setlength\headheight{10pt}

をプリアンブルに加えることで改善するらしい。
私が直面したエラーでは約15000だったため、ダメもとで\setlength\headheight{16000pt}と書き加えてみたが、まあそりゃ無理である。
ちなみに\setlength\headheight{16000pt}と加えてタイプセットしたときに出たエラーは
! Huge page cannot be shipped out.(直訳:巨大なページは出荷できません。)
…そりゃそうよね。
そんなわけで別な解決策を探した結果、次のようにしたらうまくいった。

❂ ❃ ❅ ❆ ❈ ❉ ❊ ❋ ❂ ❃ ❅ ❆ ❈ ❉ ❊ ❋
まず、\end{document}を少し上の行に移動させて、\end{document}より下にテキストがある状態でタイプセットしてみる。
正常にコンパイルされるまで、\end{document}を少し上に移動→タイプセットを繰り返す。(dimension too large以外のエラーは無視して続行)
正常にコンパイルされるときが来たら、そのときの\end{document}の直後にある部分がエラーの原因である。

エラー箇所を特定できたら、

\begin{minipage}[t]{40zw}
エラー部分(とその前後、1ページに収まる長さで)
\end{minipage}

とエラー部分を囲んで、\end{document}を一番下の行に戻してタイプセットする。

❂ ❃ ❅ ❆ ❈ ❉ ❊ ❋ ❂ ❃ ❅ ❆ ❈ ❉ ❊ ❋

難しい話はよくわからないが、この方法はエラー部分を含む段落を巨大な1文字と認識させることで、エラー部分に気づかせないようにする手法らしいな(素人の信用ならない意訳)
40zwは、その巨大な1文字の横幅である。1zwは平仮名1文字の横幅で、デフォルトでは1行に40文字並ぶため、40zwと設定した。この値を小さくすれば、ページの右端に着く前に改行されることになる。
tはtopの略で、この巨大な1文字を\begin{minipage}の直前の行のすぐ次の行に配置することを意味する。cにすれば余白の真ん中の行、bにすればページの一番下の行に沿って配置されることになるのだろう。つまり、cやbにすれば直前の行との余白が空く。普通に横書きで上の行から順に書いている状態なら、tにしておけば自然な見栄えになるはずだ。

参考にしたウェブサイトはこちら。このブログは精一杯意訳した結果なので、説明不足・解釈違いは本家を見て補ってほしい。
7.6 ボックス

古いtexliveでchemfigを使うには【setchemfigとchargeの落とし穴】

chemfigは化学マクロの中では最も解説ブログが豊富だが、そこに書かれている通りにやろうとしても2017以前のtexliveユーザーは頓挫することがある。

texliveを最新版にアップデートすればそれらの問題は解決するが、アップデートがうまくいかず、当分は今のバージョンのtexliveを使い続けなければならない人向けの解決策を紹介する。

なお、2017年以前のtexliveといちいち書くのは面倒なので、以降、『2017年以前のtexlive』を『texlive~2017』と表記する。
同様に『2019年以前のtexlive』を『texlive~2019』と表記する。

問題1…texlive~2017搭載のchemfigでは\setchemfigは使えない

\setchemfigが使えるのは、2018/3/8に公開されたv1.3以降のchemfigらしい。
CTANのchemfigのページではアップデートの履歴を閲覧できるが、v1.3公開のお知らせに\setchemfig新登場の記載がある。

CTAN: CTAN-ann - CTAN Update: chemfig

texlive~2017には、当然のことながらそれ以前のバージョンのchemfigが搭載されているため、\setchemfigは使えない。その場合、以前存在した\setchemfigの代わりとなるコマンドを使用する必要がある。

atom sepの設定についての一例を示す。

%texlive2018以降搭載のchemfigでの表現
\setchemfig{atom sep=3em}
\chemfig[atom sep=3em]{}

%texlive~2017搭載のchemfigでの表現
\setatomsep{3em}

問題2…texlive~2019搭載のchemfigでは\chargeは使えない

CTANから入手できる最新のマニュアル(パッケージドキュメント)

https://ftp.kddilabs.jp/CTAN/macros/generic/chemfig/chemfig-en.pdf

には、『v1.5以降、\Lewisコマンドや\lewisコマンドが\chargeコマンドに置き換わりました』という趣旨の記述がある。
v1.5の公開が20203/5なので、それ以前のchemfigが搭載されているtexlive~2019では旧バージョンのコマンドである\lewisを使うしかない。

\lewisの使い方を知るには旧バージョンのchemfigのマニュアルを参照する必要があるが、現在CTANで閲覧できるのは最新バージョンのマニュアルのみだ。
windows10にLaTeX2e美文書作成入門改訂第7版のDVD-ROMでtexliveをインストールした場合のchemfigマニュアルの在り処を参考までに載せておく。

f:id:nix_campane:20201122190003j:plain

  1. TeX Live command-lineを開いて『kpsewhich chemfig.tex』と入力し、enter
  2. 返ってきた答えがc:/texlive/2017/texmf-dist/tex/generic/chemfig/chemfig.texなら、c:/texlive/2017/texmf-dist/doc/generic/chemfigにマニュアルchemfig-en.pdfが存在する

問題3…texlive~2017ではv1.54以降のchemfigは動作しない

以上のように、ブログなどの情報を頼りに古いchemfigを使うのには様々な問題が伴う。
ならば、
CTANから最新のchemfigをインストールすればいいのでは?
…という考えに至るのも自然なことだが、実はそれもうまくいかない。

その理由は、CTANから入手できる最新のマニュアル(パッケージドキュメント)の1.1節に記載されている。
難しい話はよくわからないが平たくいえば、『v1.54以降のchemfigは古いtexlive等では動作しませんよ』と書かれてあるのだ。

古いバージョンのchemfigを入手するのもおそらく不可能なので、texlive自体の更新が困難ならば、やはりchemfigの旧ルールに従い続けるしかない。

数学・物理・化学のノートづくりに役立つLaTeXマクロ一覧

CTANにある数多のマクロ達。それらを隅々まで把握している者はおそらく存在しないだろう。知れば知るほどLaTeXの無限の可能性を実感できるのに、誰もが使う一部のマクロしか知られていないのはもったいない…
『こんなものをつくりたい!』と思ったときにどんなマクロを使えば効率が良いのか、迷える未来の自分と誰かのためにメモしておく。
随時更新。マクロの説明は超主観的なので、気になったものはぜひ検索してマニュアルを開いてみてほしい。

witharrows
…式変形に補足説明を加える

bchart
…棒グラフをかく

tikznetwork
グラフ理論の図解、様々な模様を描いた平面を描画、2平面間に矢印を描画
複素関数や多変数関数、線形代数などの図解に使えそう)

tkz-linknodes
…樹形図、式変形に補足説明を加える

tkz-euclide
…平面幾何、コンパス跡、分度器

tkz-graph
グラフ理論

tkz-berge
…樹形図、項などを表す球(力学ノートで質点として使えそう、特に多質点系の力学で大活躍しそう)

thmtools
…定理を記述する環境を整えてくれる

rulercompass
…コンパスによる作図跡

pas-cours
…メタリック調のテカテカした枠組み、テカテカした立体、立体幾何、展開図、漸化式の図示

luamesh
…平面幾何、グラフ理論

drawmatrix
…行列の中身を表す箱

venndiagram
…ベン図

rank 2 roots
群論の図

nicematrix
…行列中に列や行を区切る線引き、表、行列の成分を色分け、行列の横や上下に行や列の名前を表すメモ書き、一般の大きさの行列、行列の横や上に行や列の本数を表すメモ書き、掃出法の変形の補足説明、行列間の関係を表す矢印

karnaugh-map
カルノー

scratch3
…一行メモをパズルのように羅列

tikzorbital
分子軌道法ダイアグラム、混成軌道のイメージ図

modiagram
分子軌道法ダイアグラム

bohr
…ボーア模型風電子配置図

pgf-spectra
…光のスペクトル

pst-sigsys
…様々な物理の図を描く

pst-optic
…レンズの図ならなんでもかける

tikz-optics
…光の実験の装置図、物体の長さを表す矢印

pst-magneticfield
…磁場を描く

chemschemex
…反応機構を組み立てる矢印(生化学などの円形反応機構にも対応)

tikz-planets
…惑星

circuitikz
…回路図

tikz-qtree
…樹形図

forest
…樹形図(tikz-qtreeよりバリエーション豊富)

istgame
…樹形図、グラフ理論

mptrees
…樹形図

fast-diagram
…樹形図、家系図、分類表

ribbonproofs
…証明の流れや他の定理との関係を表す表

tikz-dependency
…単語と単語の間を矢印で結んで関係を表す(数列の項どうしの関係をメモするのに役立ちそう)

smartdiagram
…円形の関係図(生化学反応の概要を表すのに役立ちそう)
…横並びの関係図(作業の手順をメモするのに役立ちそう)
…縦並びの関係図
言葉で表せないが、ノート制作において本当にいろいろ使えそう

bodewgraph
…対数グラフ

tikz-3dplot
…3次元座標、3次元グラフ

pgfplots
…あらゆるグラフを描画(多変数関数の微分積分学統計学などのノートづくりに必須)

bclogo
…可愛い枠

tikiz-page
…ページ端に装飾を施す(便箋とか作れそう)

callouts
…画像にメモを書き込む

matrix.skeleton's
…行列などを表す色分けされた表

tikzmark
…文章中に矢印メモを書き加える

DPcircling
…文章中の一部分を特殊な枠で囲んで強調する

xypic
圏論、編み物の編み図

commutative diagram
圏論

xlop
…筆算

underoverlap
…数式の上下に括弧で注釈、数式の一部を箱で囲んで注釈

onbraces
…数式の上下に括弧で注釈

tkz-tab
微分でグラフをかくときの増減表、数列の増減を表す表

tabvar
…増減表

systeme
連立方程式の記述

statistics
…グラデーション表(pH表とかに使えそう)、統計学のグラフ

spalign
…行列やベクトルの記述

short math
…複雑な数式の記述

shapes
…分数を表す円

schulmathematik
…複雑な数式、座標平面、化学定数、回路図、同位体、問題集のような空欄、計算問題集のように数式を並べる、列ベクトルを簡単に出力

rec-thy
…抽象数学で使う様々な記号

pst-vehicle
…円の幾何学(2円の関係、曲率)、坂を走る車や自転車

pst-poly
…多角形

pst-platon
…多面体

pst-ode
…3次元グラフ

pst-math
…2次元グラフ

pst-geometrictools
…三角定規、分度器、コンパス、定規などのイラスト

pst-func
…グラフと棒グラフの融合

pst-eucl
…平面幾何

polynomial
多項式を超絶簡単にかく

polynom
多項式の割り算の筆算、組立除法、因数分解した式を計算して出してくれる

longdivision
…数の割り算の筆算

phfthm
…定理を記述する環境を整えてくれる

perfectcut
…様々な括弧を出力(多重になったときの大きさ調整も可能)

musikui
…数字の代わりに四角を用いて筆算の手順を説明

mfpic4ode
…ベクトル場を図示

mathtools
…シグマやlimの下に数式、複数行に渡る数式を見やすく配置、連立方程式のような形式で答えを場合分けして表示

mathfont
…あらゆる数学記号を出力、手書きボールド体アルファベットの出力

mathexam
…数学試験問題プリントの作成を補助

mathdots
…記号の上にドット(微分の表示など)

mathalpha
…数学で用いる様々なフォントのアルファベット

letterswitharrows
…記号の上に矢印(ベクトルの表示)

jkmath
整数論や組合せ論の記号、ボールド体アルファベットを簡単に出力

hf-tikz
…数式を色付き枠で囲む

halloweenmath
…数式を超絶可愛く飾る

gn-logic
…論理式

gauss
…掃出し法の手順注釈

derivative
微分記号を簡単に出力

diffcoeff
微分記号を簡単に出力(特に熱力学で使う固定変数を明示した偏微分記号)

content
…あらゆる関数を簡単に出力、微分積分記号を簡単に出力、単位行列を簡単に出力、複素平面の記号を簡単に出力、組合せ論の記号を簡単に出力、整数論の記号を簡単に出力、テンソル、etc.
とにかく万能だから物理や数学のノートづくりには必須

commath
…様々な括弧つきの文字、微分記号、ノルムなどを簡単に出力

bropd
…括弧つきの文字、微分記号を簡単に出力

braket
…括弧つきの文字を簡単に出力

bigints
…ベクトルの積分記号を出力

autoaligne
…項を縦に揃えて数式をかく(式変形が分かりやすくて便利)

susy
…物理でよく使う文字を簡単に出力

physics
…あらゆる物理記号を簡単に出力
物理のノートづくりには必須

mandi
…様々な単位、ベクトル解析の定理式、熱力学の式、マクスウェル方程式を簡単に出力
物理のノートづくりには必須

simplewick
…同類項などを結ぶ線

chemfigで色つき構造式を描く【LaTeXで化学ノートをつくりたい】

xymtexで色つき構造式を描くのは比較的簡単だが、chemfigで色つき構造式を描こうとすると様々な困難が立ち塞がる。

しかし、xymtexは環式化合物の描画に特化しているため、鎖式化合物の色つき構造式を描くにはどうしてもchemfigを使わなくてはならない。

chemfigマニュアル(英語)にもほとんど明記されておらず、解説ブログも現時点では存在しないchemfig構造式のカラー化手法…
そんな道無き道だが、試行錯誤の末に方法を確立した(気がする)ので、ここに記しておく。

構造式全体に色をつける

これは簡単である。

\textcolor{色名}{\chemfig{構造式を出力する文字列}}

とすればよい。

結合線に色をつける

chemfigで結合線を描くには、\chemfig{}内で

  • 単結合なら -[結合線の情報]

  • 二重結合なら =[結合線の情報]
  • 三重結合なら ~[結合線の情報]

という書式で入力することになり、結合線の情報の中身は

[角度,長さの倍率,結合元原子の番号,結合先原子の番号,TikZのオプション]

のように記述する。
具体的な書き方については、私自身も大変お世話になったブログ↓
chemfigパッケージによる構造式描画 - TeX Alchemist Online
を参照していただくとして、とりあえず結合線に色をつけるにはtikzのオプションの部分を色名に変更すればよい。

離れている原子にそれぞれ色をつける

これも直感が通用し、\chemfig{}内で

\textcolor{色名}{原子}

とすればうまくいく。

主鎖の一部や置換基に色をつける(ここからが本題)

ここが厄介なところで、単純に\textcolor{色名}{基を出力する文字列}としてしまうと次のような問題が発生する。

基が主鎖の一部分の場合
…色をつけた基が主鎖の他の部分に重なる

基が主鎖に直接結合している置換基の場合
…結合線の位置が色をつけた基の中央になってしまい、CとCとの結合に見えない

f:id:nix_campane:20200905015315p:plain

試行錯誤の結果、これらの問題を回避するには次のように記述すればよいことがわかった。
鎖の骨格となる原子そこにくっついている諸々を分けて、別々に色づけしてあげるというニュアンスである。

枝分かれとなるメチル基-CH3に色をつける場合

-[,,,,色名]\textcolor{色名}{C}|{\color{色名}H_3}

プロパンCH3-CH2-CH3のCH2部分に色をつけたい場合

枝分かれがない鎖状化合物の一部分に色をつけるなら、chemfigを使わずにchemformulaパッケージの\chコマンドで全体を描画するほうが早い。
\chコマンドではchemfigのような厄介な問題は起こらないからだ。

プリアンブル↓
\usepackage{chemformula}

begin{document}以降↓
\ch{CH3-\textcolor{色名}{CH2}-CH3}

イソブタンの主鎖の一部に色をつける場合

枝分かれがある化合物はchemfigで描くしかないので、上記のメチル基の場合と同じように、骨格をつくるCは独立で色付けしなければならない。

プロパノールのOH基に色をつける場合

Oは骨格をつくる原子とみなし、これまでに挙げた例のCと同じ扱いをする。

鬼畜な例

以上の教訓を胸に、次のような鬼畜な構造式を描画してみよう。

f:id:nix_campane:20200905015220p:plain

水色とピンクはお気に入りの色味に設定。
(このRGB値はアナログ時代愛用していたプレイカラーというペンの桃色、水色をスポイトでデータ化したもの)

\definecolor{plmomo}{RGB}{248,22,147}
\definecolor{plmizu}{RGB}{2,181,238}

また、\textcolor{plmomo}{}や\textcolor{plmizu}{}といちいち書いていると鬼畜な長さのコードになってしまい、エラーが起きたときに原因を見つけ出しづらくなってしまうため、

\newcommand{\mm}[1]{\textcolor{plmomo}{#1}}
\newcommand{\mz}[1]{\textcolor{plmizu}{#1}}

のようなコマンドを定義して、\mm{}または\mz{}と書けば済むように工夫しよう。
つまり、ここから先は、

  • \textcolor{plmomo}{}を\mm{}で表す
  • \textcolor{plmizu}{}を\mz{}で表す

するとコードは…

\chemfig{\mm{C}|{\color{plmomo}H_3}\mm{C}|{\color{plmomo}H}=[,,,,plmomo]\mm{C}|{\color{plmomo}H}-[,,,,plmomo]\mm{C}|{\color{plmomo}H}(-[2,,,,plmizu]\mz{C}|{\color{plmizu}H_2}-[,,,,plmizu]\mz{C}|{\color{plmizu}H}=[,,,,plmizu]\mz{C}|{\color{plmizu}H_2})-[,,,,plmomo]\mm{C}|{\color{plmomo}H_2}\mm{C}|{\color{plmomo}H_2}\mm{C}|{\color{plmomo}H}=[,,,,plmomo]\mm{C}|{\color{plmomo}H_2}}

…こうなる。エグい

\chemfig{}内の各部分が何を表すのか分解してみると、

%主鎖のCH3(左端)
\mm{C}|{\color{plmomo}H_3}

%主鎖のCH
\mm{C}|{\color{plmomo}H}

%主鎖の=
=[,,,,plmomo]

%主鎖のCH
\mm{C}|{\color{plmomo}H}

%主鎖のー
-[,,,,plmomo]

%主鎖のCH
\mm{C}|{\color{plmomo}H}

%枝分かれ
(
 -[2,,,,plmizu]\mz{C}|{\color{plmizu}H_2}%ーCH2
 -[,,,,plmizu]\mz{C}|{\color{plmizu}H}%ーCH
 =[,,,,plmizu]\mz{C}|{\color{plmizu}H_2}%=CH2
)

%主鎖のー
-[,,,,plmomo]

%主鎖のCH2
\mm{C}|{\color{plmomo}H_2}

%主鎖のCH2
\mm{C}|{\color{plmomo}H_2}

%主鎖のCH
\mm{C}|{\color{plmomo}H}

%主鎖の=
=[,,,,plmomo]

%主鎖のCH2(右端)
\mm{C}|{\color{plmomo}H_2}

…本当に大変だが、アナログで色ペンを何度も持ち替えながら書くよりはよっぽど楽である。

位置番号つきの炭素を出力する【LaTeXのnewcommand】

LaTeXのword的な使い方はだいぶ身についたため、もう少し(というかいきなり)レベルを上げて、
現在はIUPAC有機化合物命名法の要点&問題集を制作中。

命名法の勉強は数ヶ月前からちまちまと進めてはいたが、手書きのメモはゴミのように汚かった。
それらがLaTeXによってどんどん綺麗な形に生まれ変わっていくことにとてつもない幸福感を感じている。今もニヤニヤと一人で笑いながらこの文章を打っている。

そんなわけで今は化学組版に夢中なので、化学系便利グッズもどんどん生み出していくことになるだろう。誰でもつくれるレベルのことしかできないが、小さな小さな工夫を続けていく。

さて、今日つくったのは…

f:id:nix_campane:20200901235108p:plain

ほらほら、Cの上に紫色の位置番号が乗っかっているでしょう?
この位置番号つき炭素を簡単に出力するコマンドが今日の産物。

たとえば、

\iC{6} 

と入力すれば、上に小さい6が乗っかった炭素Cが出力される。
そしてこのコマンドは\ch{ }内でも問題なく使用可能。

ソースコードはこちら。

\usepackage{amsmath}
%位置番号の色の定義(お好みで変えてね)
\definecolor{plsumire}{RGB}{128,7,172}
%位置番号つき炭素コマンドiC
\newcommand{\iC}[1]{$\overset{\textcolor{plsumire}{#1}}{\mbox{C}}$}