Gibt es eine Möglichkeit einen Zeilenumbruch in der Beschriftung für Reaktionspfeile bei dem Paket chemfig einzufügen?

gefragt 24 Jul '13, 08:38

Bettina's gravatar image

Bettina
65541923
Akzeptiert: 83%

bearbeitet 25 Sep '13, 12:52

saputello's gravatar image

saputello
18.4k22352


Du könntest den Inhalt des Labels in eine \parbox setzen:

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

\schemestart
 A \arrow{->[\parbox{5cm}{\centering a\\b}][c]} B
\schemestop

\end{document}

Beispiel eins

oder zur Bequemlichkeit einen Befehl definieren, der das für Dich macht:

\documentclass{article}
\usepackage{chemfig}

\newcommand\stack[2][5cm]{\parbox{#1}{\centering#2}}

\begin{document}

\schemestart
 A \arrow{->[\stack{a\\b}][c]} B
\schemestop

\end{document}

Eine zweite Möglichkeit ohne Argument für die Breite wäre, eine {tabular} Umgebung zu verwenden (Dank an @saputello für den Hinweis):

\documentclass{article}
\usepackage{chemfig}

\newcommand\stack[1]{\begin{tabular}{@{}c@{}}#1\end{tabular}}

\begin{document}

\schemestart
 A \arrow{->[\stack{a\\b}][c]} B
\schemestop

\end{document}

Die Label sind TikZ-Knoten. Wenn man es also schaffte, ihnen die Option align=center hinzuzufügen, dann bräuchte man die \parbox oder die {tabular}-Umgebung nicht. Leider stellt chemfig keine Schnittstelle bereit, um ihre Eigenschaften direkt zu ändern. Die Knoten werden durch den Befehl \CF@arrow@display@label@i gesetzt, den man umdefinieren könnte:

\documentclass{article}
\usepackage{chemfig}

\makeatletter
\def\CF@arrow@display@label@i#1#2#3{%
  \ifx\@empty#1\@empty\else
    \if*\expandafter\@car\detokenize{#1}\@nil
      \ifCF@reac@debug
         node[pos=#2,sloped,yshift=#3\CF@arrow@labelsep,draw,fill,cyan](shifted@node){}%
         node[
           draw,rotate=\CF@rotate@node#1\@nil,anchor=\CF@anchor@node#1\@nil#3,at=(shifted@node),
           align=center% <= das ist neu
         ]{\expandafter\@gobble\@gobble#1}%
      \else
        node[pos=#2,sloped,yshift=#3\CF@arrow@labelsep](shifted@node){}%
        node[
          rotate=\CF@rotate@node#1\@nil,anchor=\CF@anchor@node#1\@nil#3,at=(shifted@node),
          align=center% <= this is new
        ]{\expandafter\@gobble\@gobble#1}%
      \fi
    \else
      \ifCF@reac@debug
        node[pos=#2,sloped,yshift=#3\CF@arrow@labelsep,draw,fill,cyan](shifted@node){}%
        node[
          draw,pos=#2,anchor=-#390,sloped,yshift=#3\CF@arrow@labelsep,
          align=center% <= das ist neu
        ]{#1}%
      \else
        node[
          pos=#2,anchor=-#390,sloped,yshift=#3\CF@arrow@labelsep,
          align=center% <= das ist neu
        ]{#1}%
      \fi
    \fi
  \fi
}
\makeatother

\begin{document}

\schemestart
 A \arrow{->[a\\b][c]} B
\schemestop

\end{document}

Anstelle der manuellen Neu-Deufinition wäre ein Patch mit der Hilfe von Enrico Gregorios's regexpatch Paket leichter:

\documentclass{article}
\usepackage{chemfig}
\usepackage{regexpatch}
\makeatletter
% \xpatchcmd{<cmd>}{<search>}{<replace>}{<success>}{<failure>}
% die Sternvariante ersetzt alle Vorkommnisse von <search>
\xpatchcmd*\CF@arrow@display@label@i{node[}{node[align=center,}{}{}
\makeatother

\begin{document}

\schemestart
 A \arrow{->[a\\b][c]} B
\schemestop

\end{document}
Permanenter link

beantwortet 24 Jul '13, 08:51

Clemens's gravatar image

Clemens
19.0k112960

bearbeitet 24 Jul '13, 12:09

Das ist die Übersetzung meiner Antwort auf TeX.sx zu einer ähnlichen Frage.

(24 Jul '13, 08:52) Clemens

Super, vielen Dank! Für mich funktioniert folgende Lösung super:

\makeatletter
\newcommand\stack[2][5cm]{\parbox{#1}{\centering#2}}
\makeatother
(24 Jul '13, 09:17) Bettina

@Bettina ich habe Deine Antwort in einen Kommentar zu Clemens Antwort umgewandelt. Zur Info, diese Seite funktioniert etwas spezieller als Foren, wo man hintereinander wegschreibt: oben steht eine Frage, unten stehen Antworten - auf diese Frage. Bemerkungen gehen noch als Kommentare zu schreiben. Das stellt Lösungen besser dar für spätere Leser.

(24 Jul '13, 09:31) stefan ♦♦

@Clemens: \makeatletter und \makeatother sind bei der Definition von \stack überflüssig. Das optionale Argument für die Breite kann man sich sparen, wenn man die \parbox durch eine tabular ersetzt:

\newcommand\stack[1]{\begin{tabular}{@{}c@{}}#1\end{tabular}}

alternativ kann man auch eine varwidth-Umgebung mit dem varwidth-Paket verwenden, braucht dann aber wieder ein Argument für die maximale Breite.

(24 Jul '13, 12:03) saputello

@saputello komisch, \makeatletter ist mir gar nicht aufgefallen... muss ein Überbleibsel eines anderen Versuchs sein... werde ich rauslöschen. tabular ist eine gute Idee!

(24 Jul '13, 12:05) Clemens
Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

Per RSS:

Antworten

Antworten und Kommentare

Aktuelle Buch-Infos

LaTeX Cookbook

LaTeX Beginners Guide

Limitierter Rabatt ebook
50% Coupon code tDRet6Y

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs füge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×31
×27
×27
×18

Frage gestellt: 24 Jul '13, 08:38

Frage wurde angeschaut: 5,684 Mal

Zuletzt aktualisiert: 25 Sep '13, 12:52