chemfig で重合体を描いてみましょう。
まずは chemfig のマニュアル通りに描いてみます。
% 使用する括弧を定義
\newcommand\setpolymerdelim[2]{\def\delimleft{#1}\def\delimright{#2}}
% 実際に括弧を描くコマンドの定義
\def\makebraces[#1,#2]#3#4#5{%
\edef\delimhalfdim{\the\dimexpr(#1+#2)/2}%
\edef\delimvshift{\the\dimexpr(#1-#2)/2}%
\chemmove{%
\node[at=(#4),yshift=(\delimvshift)]
{$\left\delimleft\vrule height\delimhalfdim depth\delimhalfdim
width0pt\right.$};%
\node[at=(#5),yshift=(\delimvshift)]
{$\left.\vrule height\delimhalfdim depth\delimhalfdim
width0pt\right\delimright_{\rlap{$\scriptstyle#3$}}$};}}
\setpolymerdelim()
\chemfig{\vphantom{CH_2}-[@{op,.75}]CH_2-CH_2-[@{cl,.25}]}
\makebraces[5pt,5pt]{\!\!n}{op}{cl}
このようにすると、
と描けます。
-[@{op,.75}]
の部分は 単結合 -
の 0.75 の位置 (始点 を 0、終点 を 1 とする) に op
という名前 (ラベル) を付ける、の意味です。\makebraces[5pt,5pt]{\!\!n}{op}{cl}
は 高さ 5pt、深さ 5pt で、添字に n を付け、開き括弧・閉じ括弧をそれぞれ (すでに \chemfig{}
内で定義した) op
, cl
の位置に描く、といった意味です。\!
は負のスペースです。
しかしこの方法では、直線的なもの以外だとなかなかうまくいきません。例えば、
\setpolymerdelim()
\chemfig{-[@{op,.75}:30]-[:-30]-[@{cl,.25}:30]}
\makebraces[5pt,5pt]{\!\!n}{op}{cl}
とすると
となって括弧の縦方向の位置が不揃いになってしまいます。この場合、
\setpolymerdelim()
\chemfig{-[@{op,.5}:30]-[:-30]-[@{cl,.5}:30]}
\makebraces[5pt,5pt]{\!\!n}{op}{cl}
として、括弧を描く位置(アンカー)として、高さが同じ位置を選べば、
のようにうまくいきます。
が、もう少し複雑になると、そういう位置を (簡単には) 指定できず困ってしまいます。例えば、PET (ポリエチレンテレフタラート) の場合、上の方法ではかなり難しいと思います。
ので、\makebraces
の定義を変更して、強制的に高さを揃えるようにすると良いでしょう。\usetikzlibrary{calc}
が必要になる点に注意して下さい。
\usetikzlibrary{calc}
\newcommand\setpolymerdelim[2]{\def\delimleft{#1}\def\delimright{#2}}
\def\makebraces[#1,#2]#3#4#5{%
\edef\delimhalfdim{\the\dimexpr(#1+#2)/2}%
\edef\delimvshift{\the\dimexpr(#1-#2)/2}%
\chemmove{%
\draw let \p1 = (#4) in node [at=(\p1),yshift=-\y1+\delimvshift]%
{$\left\delimleft\vrule height\delimhalfdim depth\delimhalfdim width0pt\right.$};
\draw let \p2 = (#5) in node [at=(\p2),yshift=-\y2+\delimvshift]%
{$\left.\vrule height\delimhalfdim depth\delimhalfdim width0pt\right\delimright_{\rlap{$\scriptstyle#3$}}$};
}}
(もう少しうまく書けるかもしれません。改善案/コメント歓迎)
このようにすれば、
\setpolymerdelim()
\chemfig{-[@{op,.75}:30]-[:-30]-[@{cl,.25}:30]}
\makebraces[15pt,5pt]{\!\!n}{op}{cl}
とすることで、問題なく高さの揃った括弧が描けます。
また、PET のような複雑なものでも比較的楽に描けます。
\setpolymerdelim[]
\setchemfig{atom sep=2em}
\chemfig{
Ar-[:30](=[:90]O)-[:-30]O-[:30]-[:-30]-[:30]O
-[@{op,.5}:-30]
(=[:-90]O)-[:30]*6(-=-
(-[:30](=[:90]O)-[:-30]O-[:30]-[:-30]-[:30]O
-[@{cl,.5}:-30]
(=[:-90]O)-[:30]Ar)=-=)
}
\makebraces[70pt,30pt]{\!\!n}{op}{cl}
「括弧の前後が詰っているので、この部分の結合を長くしてバランス良くしたいなー」という場合も、単に線を長くするだけで OK です (マニュアルの方法だといろいろずれます)。
\setpolymerdelim[]
\setchemfig{atom sep=2em}
\chemfig{
Ar-[:30](=[:90]O)-[:-30]O-[:30]-[:-30]-[:30]O
-[@{op,.5}:-30,1.5]
(=[:-90]O)-[:30]*6(-=-
(-[:30](=[:90]O)-[:-30]O-[:30]-[:-30]-[:30]O
-[@{cl,.5}:-30,1.5]
(=[:-90]O)-[:30]Ar)=-=)
}
\makebraces[70pt,30pt]{\!\!n}{op}{cl}