chemfig und TikZ

Jeder, der schon einmal das großartige Paket chemfig verwendet hat, weiß, dass es die Strukturformeln mit der Hilfe von TikZ zeichnet. Darüber muss man allerdings bei der Verwendung nicht Bescheid wissen – es sein denn, man möchte mehr als nur Formeln zeichnen. Elektronenverschiebungspfeile zum Beispiel. Oder Rahmen um eine Formel in einem Schema. Oder …

In vielen Fällen kann man nach folgendem Muster vorgehen.

  • chemfig ermöglicht es dem Anwender, auf die Knoten der Formeln zuzugreifen. Ist der Knoten eines Atoms gemeint, so setzt man direkt vor das Atom @{ID}. Damit kann man auf den entsprechenden Knoten später unter dem Namen ID zugreifen. Möchte man auf eine Bindung zu greifen, so setzt man das gleiche als erstes in das optionale Argument der Bindung -[@{ID}]. In diesem Fall kann man außerdem einen Dezimalwert angeben, der die relative Position des Knotens entlang der Bindung angibt: -[@{ID,.3}] – 30% entlang der Bindung vom Start der Bindung aus gesehen. Voreingestellt ist sinnvollerweise 0.5. Nur falls es nicht klar geworden sein sollte: natürlich verwendet man nicht jedes Mal ID sondern bei jeder Verwendung einen eindeutigen Namen – zumindest bis man die Namen im nächsten \chemmove{...} verwendet hat. Und damit sind wir schon bei Schritt zwei:
  • Später greift man auf die so benannten Knoten mit \chemmove{...} zu. Der Befehl ist letztlich nichts anderes als eine Verpackung für \begin{tikzpicture}[remember picture, overlay]. Das bedeutet übrigens, dass man in der Regel zwei Mal kompilieren muss, wenn man ihn verwendet.

Damit lassen sich beispielsweise Elektronenverschiebungspfeile ohne allzu große Mühe einzeichnen. Das klärt auch vermutlich den Namen des Befehls: er fand seinen Weg in chemfig bei der Suche nach einer Lösung für electron movements.

\documentclass{article}
\usepackage{chemfig}
\begin{document}

\chemfig{@{a1}=_[@{b1}::30][::-60]\lewis{2,X}}
\chemmove{
  \draw[->,red,shorten >=2pt,shorten <=2pt]
    (b1) .. controls +(80:8mm) and +(145:8mm) .. (a1) ;
}

\end{document
}

chemfig-1

Verwendet man chemfigs \schemestart ... \schemestop um ein Reaktionsschema zu setzen, dann gilt ganz ähnliches für die Verbindungen – genauer: für die Teile jeweils zwischen zwei \arrows. Diese sind wieder nichts anderes als TikZ-Knoten und man kann mit einer vergleichbaren Taktik auf sie zurückgreifen.

In der Syntax von \arrow gibt es ein optionales Argument mit runden Klammern, das im minimalsten Fall so aussieht: \arrow(--). Das entspricht dem Weglassen der Option. Vor und nach -- kann man den durch den Pfeil verbundenen Knoten Namen geben (\arrow(vor--nach)). Macht man das nicht, benennt chemfig sie selbst und zwar nacheinander mit c1, c2 und so weiter. Anzeigen lassen kann man sich die Namen durch \schemedebug{true}.

\documentclass{article}
\usepackage{chemfig}
\begin{document}

\schemedebug{true}
\schemestart
  A \arrow B
\schemestop

\bigskip

\schemestart
  A \arrow(vor–nach) B
\schemestop

\end{document
}

chemfig-2

Das optionale Argument kann aber noch mehr: es lassen sich auch die Anker angeben, an denen der Pfeil starten und enden soll: \arrow(vor.south--nach.north) oder \arrow(vor--nach.35). Das funktioniert auch ohne eigene Namen: \arrow(.south--.north).

Damit aber noch nicht genug: nach Namen und Anker kann man in einem optionalen Argument TikZ-Eigenschaften an den Knoten weiterreichen: \arrow(vor.south[draw=red]--). Das funktioniert wieder auch ohne Namen und ohne Anker: \arrow([draw=red]--).

\documentclass{article}
\usepackage{chemfig}
\begin{document}

\schemestart
  A \arrow([draw=red,inner sep=4pt,rounded corners]–) B
\schemestop

\end{document
}

chemfig-3

Man kann auch schon benannte Knoten mit dem \arrow-Befehl verbinden. Dabei gibt man an Stelle des neuen Namens den alten an mit einem vorangestellten @: \arrow(@alt--neu).

Natürlich lassen sich auch die automatisch oder selbst benannten Knoten später mit einem \chemmove{} weiter verwenden.

Weidet man all die Möglichkeiten aus, lassen sich mit chemfig vielseitige Schemata erstellen. Ein Beispiel dafür gibt es in meiner Antwort auf »Brauche Hilfe mit dem Paket “Chemfig”« auf der TeXwelt zu sehen, ein weiteres folgt hier:

chemfig-4

\documentclass[DIV=11]{scrartcl}
\usepackage[ngerman]{babel}

\usepackage[ghsystem=false]{chemmacros}
\usepackage{chemfig
}

% bei Joseph Wright geklaut: http://www.texdev.net/tag/chemfig/
\setdoublesep{0.35700 em}  % ‘Bond Spacing’
\setatomsep{1.78500 em}    % ‘Fixed Length’
\setbondoffset{0.18265 em} % ‘Margin Width’
\newcommand{\bondwidth}{0.06642 em} % ‘Line Width’
\setbondstyle{line width = \bondwidth}
\newcommand*{\bondboldwidth}{0.22832 em
} %’Bold Width’
\newcommand*{\bondhashlength}{0.25737 em} % ‘Hash Spacing’
\setcrambond
  {\the\dimexpr \bondwidth * 2 + \bondboldwidth \relax}
  {\bondwidth}{\bondhashlength}

\setstacksep{.7ex}

\tikzset{
  bold bond/.style = {line width = \bondboldwidth},
  dash bond/.style =
    {dash pattern = on \bondhashlength off \bondhashlength},
  hash bond/.style =
    {
      dash pattern = on \bondwidth off \bondhashlength,
      line width   = \bondboldwidth
    },
}

\renewcommand*\printatom[1]{\ensuremath{\mathsf{#1}}}
\setchemformula{format=\sffamily
}

\DeclareNewTOC[
  type=scheme,
  types=schemes,% used in the \listof.. command
  float,
  name=Schema,
  listname={Verzeichnis der Schemata}
]{los}

\begin{document}
\begin{scheme}
  \setcompoundsep{6em}
  \chemsetup[option]{circled=all}
  \schemestart
    \chemfig{
      Bu-[:-30]
        (<[6,,,,rounded corners=0]@{O1}\lewis{4:6:,O}H)
      –[:30]
        (<[2,,,,rounded corners=0]Si|R_3)
      –[:-30]Hex
   
}
    % rechts: syn-Elim.
    \arrow([draw,inner sep=4pt,rounded corners]–){->[\ch{KH}][\ch{- H2}]}
    \chemfig{
      Bu-[:-30]
        (<[6]@{O2}\Lewis{0:4:6:,O}|^{\fminus}[:-135,,,,draw=none]K^\fplus)
      –[:30]
        (<[2]@{Si}Si|R_3)
      –[:-30]Hex
    }
    \arrow{->[*{0}{\ch{- K+}}]}[-90,1.1]
    \chemfig{
      Bu>:[:-10]
        (<[:-120]H)
        (-[@{b1}2]@{O3}O?)
      –[@{b2}]
        (-[@{b3}2]\chemabove{Si}{\fscrm}?|R_3)
        (<:[:10]H)
      <[:-60]Hex
    }
    \arrow{->[\ch{- ^-OSiR3}]}[180,1.25]
    \chemfig{Bu-[:-30]=_[:30][:-30]Hex}
    \arrow(–[red,text width=4cm,align=center]){0}[-90,.2]
    basenvermittelt\\ syn-Eliminierung \trans-Olefin
    \chemmove[->,red,shorten >=1pt,shorten <=1pt]{
      \draw[shorten <=4pt] (O2) .. controls +(-10:1.3cm) and +(180:1cm) .. (Si);
      \draw (b3) .. controls +(180:2mm) and +(90:2mm) .. (b2);
      \draw (b1) .. controls +(180:4mm) and +(180:4mm) .. (O3);
   
}
    % links: anti-Elim.
    \arrow(@c1–){->[{\chemfig{F_3@{B}B-[@{b4},.5]@{O4}OEt}}]}[180,1.3]
    \chemfig{
      H-[:-10,,,,bold bond]
        (-[@{b5}6,,,,bold bond]@{O5}\chembelow{O}{\fscrm}H-[:-135,,1,2]F_3B)
        (-[:10,,,,bold bond]Bu)
      >[@{b6}1]
        (-[:-30,1.3]Hex)
      –[@{b7}2]Si|R_3
    }
    \arrow{->[*{0}\ch{- F3BOH}]}[-90]
    \chemfig{Bu-[2]=_[:30][:-30]Hex}
    \arrow(–[orange,text width=4cm,align=center]){0}[-90,.2]
    sauer katalysiert\\ anti-Eliminierung \cis-Olefin
    \chemmove[->,orange,shorten >=1pt,shorten <=1pt]{
      \draw[shorten <=3pt] (O1) .. controls +(-90:1cm) and +(-90:2cm) .. (B);
      \draw (b4) .. controls +(90:4mm) and +(90:4mm) .. (O4);
      \draw[shorten >=2pt] (b7) .. controls +(180:4mm) and +(135:4mm) .. (b6);
      \draw[shorten <=3pt] (b5) .. controls +(180:4mm) and +(160:4mm) .. (O5);
    }
  \schemestop
  \caption{Peterson"=Olefinierung}
\end{scheme}
\end{document
}

Posted

in

by

Tags:

Comments

One response to “chemfig und TikZ”

  1. Stefan

    Mit chemfig hätte ich damals in der Schule mehr Spaß an Chemie gehabt! Z.B. war ein wesentlicher Teil der Freude an Mathematik die Möglichkeit, mit TeX schöne Lösungen zu Übungsaufgaben und Haus-Arbeiten zu verfassen, was dann auch durchs Studium begleitete.