chemfig: Retinal und farbige Bindungen

Tabellen und Grafiken erstellen und anordnen


michl1211
Forum-Anfänger
Forum-Anfänger
Beiträge: 23
Registriert: So 17. Jan 2010, 17:23

Beitrag von michl1211 »

Hallo,

ich würde gerne folgendes erreichen. Ich hätte gerne, daß im Molekül "Retinal" eine der zwei Bindungen (die untere) einer Doppelbindung etwas verkürzt dargestellt wird (nämlich so, wie im Benzolring). Diese Option würde ich gerne von Molekül zu Molekül bzw. von Bindung zu Bindung an- oder abschalten können (bei der Ölsäure sehen z.B: zwei gleichlange Bindungen besser aus). Außerdem suche ich nach einer Möglichkeit eine einzelne der zwei Bindungen einer Doppelbindung einzufärben.
\documentclass[a4paper,10pt]{scrartcl}

\usepackage[utf8x]{inputenc}
  \usepackage{chemfig}

\begin{document}

Retinal:

\chemfig{*6(--(-)=(%
  -=_[::-60]-[::60](-[2])=_[::-60]-[::60]=_[::-60]-[::60](-[2])=_[::-60]-[::60]=_[::-60]O)%
  -(-[:60])(-[:120])--)}


\par\bigskip

Ölsäure:

\chemfig{[:+30]-[::-60]-[::+60]-[::-60]-[::+60]-[::-60]-[::+60]-[::-60]-[::+60]%
              (-[2,0.20,,,draw=none] \scriptstyle{\color{gray}9})%
         =_[::-30,0.87]-[::-30]-[::+60]-[::-60]-[::+60]-[::-60]-[::+60]-[::-60]-%
              (-[2,0.87]OH)(-[2,0.20,,,draw=none] \scriptstyle{\color{gray}\hspace*{-4mm}18})%
         =_[::-60]O%
        }
\end{document}
Hat jemand eine Lösungsidee?

vielen Dank für eure Hilfe.


Gruß michl1211
System: TeX Live 2012, ArchLinux 3.2.9-1; Editor: Vim, Kile

Benutzeravatar
cgnieder
Forum-Meister
Forum-Meister
Beiträge: 730
Registriert: Fr 22. Okt 2010, 18:37
Wohnort: Herrenberg
Kontaktdaten:

Beitrag von cgnieder »

Eine einzelne Bindung einer Doppelbindung einzufärben dürfte schwierig werden. Was das Erscheinungsbild der Doppelbindungen angeht: chemfig liefert drei Typen: den Standard-Typ = , den rechten Typ =_ und den linken Typ =^
\documentclass[a4paper,10pt]{scrartcl}
\usepackage[utf8x]{inputenc}
\usepackage{chemfig}

\begin{document}
\setdoublesep{3pt}
\chemfig{-[:60]=-[:-60]} \chemfig{-[:60]=_-[:-60]} \chemfig{-[:60]=^-[:-60]}

\end{document}
Gruß
Clemens
Paketauthor

Benutzeravatar
cgnieder
Forum-Meister
Forum-Meister
Beiträge: 730
Registriert: Fr 22. Okt 2010, 18:37
Wohnort: Herrenberg
Kontaktdaten:

Beitrag von cgnieder »

Einseitig farbige Doppelbindungen kann man über eigens definierte decorations erzielen. Ich hab mich erinnert, dass im ChemFig-Manual eine ähliche Methode gewählt wurde, um delokalisierte Doppelbindungen zu erreichen.
\documentclass{article}

\usepackage{chemfig}
\usetikzlibrary{decorations}

\makeatletter
\def\sethclinewidth{\def\hc@line@width}
% default line width:
\sethclinewidth{0.4pt}

% outer half colored bond:
\pgfdeclaredecoration{ohc}{initial}
  {
    \state{initial}[width=.5pt]
      {
        \pgfsetlinewidth{\hc@line@width}
        \pgfpathlineto{\pgfpoint{.5pt}{0pt}}
        \color{black}\pgfusepath{stroke}
        \pgfpathmoveto{\pgfpoint{0pt}{\CF@double@sep}}
        \pgfpathlineto{\pgfpoint{.5pt}{\CF@double@sep}}
        % choose color you want:
        \color{red}\pgfusepath{stroke}
        \pgfpathmoveto{\pgfpoint{.5pt}{0pt}}
      }
    \state{final}
      {
        \pgfpathlineto{\pgfpointdecoratedpathlast}
      }
  }

% middle half colored bond:
\pgfdeclaredecoration{mhc}{initial}
  {
    \state{initial}[width=.5pt]
      {
        \pgfsetlinewidth{\hc@line@width}
        \pgfpathmoveto{\pgfpoint{0pt}{-.5*\CF@double@sep}}
        \pgfpathlineto{\pgfpoint{.5pt}{-.5*\CF@double@sep}}
        \color{black}\pgfusepath{stroke}
        \pgfpathmoveto{\pgfpoint{0pt}{.5*\CF@double@sep}}
        \pgfpathlineto{\pgfpoint{.5pt}{.5*\CF@double@sep}}
        % choose color you want:
        \color{red}\pgfusepath{stroke}
        \pgfpathmoveto{\pgfpoint{.5pt}{0pt}}
      }
    \state{final}
      {
        \pgfpathlineto{\pgfpointdecoratedpathlast}
      }
  }

% use decorations as styles:
\tikzset{
  olc/.style={decorate,decoration={ohc}},
  orc/.style={decorate,decoration={ohc,mirror}},
  mlc/.style={decorate,decoration={mhc}},
  mrc/.style={decorate,decoration={mhc,mirror}},
}
\makeatother

\begin{document}

\setatomsep{4em}
\chemfig{-[,,,,mrc]--[,,,,mlc]--[,,,,orc]--[,,,,olc]}

\setdoublesep{3pt}\setbondstyle{line width=1pt}\sethclinewidth{1pt}
\chemfig{-[,,,,mrc]--[,,,,mlc]--[,,,,orc]--[,,,,olc]}

\end{document}
Clemens
Paketauthor

michl1211
Forum-Anfänger
Forum-Anfänger
Beiträge: 23
Registriert: So 17. Jan 2010, 17:23

Beitrag von michl1211 »

Hallo,

wow! Das hast Du aber schnell hinbekommen! Eine Funktion wünsche ich mir aber noch ;) und zwar: Ich hätte gerne, daß NICHT beide Striche der Doppelbindung gleich lang sind, sondern im Retinal, der untere Strich etwas kürzer ist als der obere Strich - so wie auch im Benzolring (der innere Strich)

Gruß
michl1211
System: TeX Live 2012, ArchLinux 3.2.9-1; Editor: Vim, Kile

Benutzeravatar
cgnieder
Forum-Meister
Forum-Meister
Beiträge: 730
Registriert: Fr 22. Okt 2010, 18:37
Wohnort: Herrenberg
Kontaktdaten:

Beitrag von cgnieder »

So eine Funktion gibt es nicht. Was man tun könnte, wäre einfach nur einen Teil eines Rings zu zeichnen:
\documentclass{article}
\usepackage{chemfig}
\begin{document}

\chemfig{--[:-60]=^-[:60]-} \chemfig{-*6(-=-(-))}

\end{document}
Clemens
Paketauthor

michl1211
Forum-Anfänger
Forum-Anfänger
Beiträge: 23
Registriert: So 17. Jan 2010, 17:23

Beitrag von michl1211 »

Hallo,

ok. das wäre eine Idee ;) aber auch nicht gerade eine schöne Lösung, und die Möglichkeit wieder eine der beiden Bindungen zu färben würde flöten gehen. Gibt es die Möglichkeit in deinem obigen Makro eine der Bindungen zu kürzen?

edit:
habe gerade Retinal auf diese Weise gezeichnet. Die Syntax ist also doch gar nicht so aufwändig als es zunächst scheint (man muss aber von hinten nach vorne lesen):
\chemfig{[:180]*6(O=-*6(=(-)-*6(=-*6(=(-)-*6(=-*6(-(-[::-30])(-[::-90])----=))))))}
Hat, aber immer noch das Problem, daß, wenn ich zusätzlich dein Macro für farbige Bindungen verwende, diese wieder länger dargestellt werden.

Gruß
System: TeX Live 2012, ArchLinux 3.2.9-1; Editor: Vim, Kile

Benutzeravatar
cgnieder
Forum-Meister
Forum-Meister
Beiträge: 730
Registriert: Fr 22. Okt 2010, 18:37
Wohnort: Herrenberg
Kontaktdaten:

Beitrag von cgnieder »

Gekürzte Bindungen als decoration darzustellen ist etwas knifflig. Ich hatte ja ein Muster verwendet, das sich alle 0.5pt wiederholt. Wenn ich es richtig verstehe, muss so eine decoration auf jeden Fall kürzer sein, als der Pfad, auf dem man sie zeichnet.

Meine Lösung also (siehe Code unten):

Die erste Variante (outer half red colored bond) nimmt jetzt eine Muster, das um 0.1pt kürzer als der mit \setatomsep eingestellte Abstand.
Die als Bindung zu verwenden geht aber schief, wenn man die Bindung mit einem Atom (hier das O) enden lässt. Dafür dann die zweite Variante (outer half red colored bond to end at atom ), bei der die zweite Bindung nur am Anfang gekürzt ist.

Ich will nicht versprechen, dass das unter allen Umständen funktioniert...
\documentclass{article}

\usepackage{chemfig}
\usetikzlibrary{decorations}

\makeatletter
\def\sethclinewidth{\def\hc@line@width}
% default line width:
\sethclinewidth{0.4pt}

% outer half red colored bond:
\pgfdeclaredecoration{hc}{initial}
  {
    \def\hc@length{\CF@atom@sep-.1pt}
    \state{initial}[width=\hc@length]
      {
        \pgfsetlinewidth{\hc@line@width}
        \pgfpathlineto{\pgfpoint{\hc@length}{0pt}}
        \color{black}\pgfusepath{stroke}
        \pgfpathmoveto{\pgfpoint{2pt}{\CF@double@sep}}
        \pgfpathlineto{\pgfpoint{\CF@atom@sep-2.05pt}{\CF@double@sep}}
        % choose color you want:
        \color{red}\pgfusepath{stroke}
        \pgfpathmoveto{\pgfpoint{\hc@length}{0pt}}
      }
    \state{final}
      {
        \pgfpathlineto{\pgfpointdecoratedpathlast}
      }
  }

% outer half red colored bond to end at atom
\pgfdeclaredecoration{hca}{initial}
  {
    \state{initial}[width=2.5pt,next state=middle]
      {
        \pgfsetlinewidth{\hc@line@width}
        \pgfpathlineto{\pgfpoint{2.5pt}{0pt}}
        \color{black}\pgfusepath{stroke}
        \pgfpathmoveto{\pgfpoint{2.05pt}{\CF@double@sep}}
        \pgfpathlineto{\pgfpoint{2.5pt}{\CF@double@sep}}
        % choose color you want:
        \color{red}\pgfusepath{stroke}
        \pgfpathmoveto{\pgfpoint{2.5pt}{0pt}}
      }
    \state{middle}[width=.5pt]
      {
        \pgfsetlinewidth{\hc@line@width}
        \pgfpathlineto{\pgfpoint{.5pt}{0pt}}
        \color{black}\pgfusepath{stroke}
        \pgfpathmoveto{\pgfpoint{0pt}{\CF@double@sep}}
        \pgfpathlineto{\pgfpoint{.5pt}{\CF@double@sep}}
        % choose color you want:
        \color{red}\pgfusepath{stroke}
        \pgfpathmoveto{\pgfpoint{.5pt}{0pt}}
      }
    \state{final}
      {
        \pgfpathlineto{\pgfpointdecoratedpathlast}
      }
  }

% use decorations as styles:
\tikzset{
  lc/.style={decorate,decoration={hc}},
  rc/.style={decorate,decoration={hc,mirror}},
  lca/.style={decorate,decoration={hca}},
  rca/.style={decorate,decoration={hca,mirror}},
}
\makeatother

\begin{document}

\setatomsep{2em}\setbondstyle{line width=1pt}\sethclinewidth{1pt}

\chemfig{*6(---[,,,,lc](--[::-60,,,,rc]-[::60](-[2])-[::-60,,,,rc]-[::60]-[::-60,,,,rc]-[::60](-[2])-[::-60,,,,rc]-[::60]-[::-60,,,,rca]O)-(-[:60])(-[:120])--)}

\end{document}
Gruß
Clemens
Paketauthor

Antworten