Wenn ich Textelemente mit MetaPost dekoriere oder kleine MetaPost-Bilde einbinde, die Text enthalten, möchte ich an der Grundlinie aka baseline ausrichten.

Ein Beispiel, was sich aus einer Antwort zu TeX-Code in MetaPost ergeben hat:

\documentclass{article}
\usepackage{pdftexcmds}
\makeatletter
\let\pdfstrcmp=\pdf@strcmp
\usepackage{luatexko-mplib}
\makeatother
\begin{document}
Die Kreiszahl
\begin{mplibcode}
  beginfig(0)
    draw fullcircle scaled 10;
    draw btex $\pi$ etex shifted 10 (-0.25,-0.25);
  endfig;
\end{mplibcode}
ist eine mathematische Konstante.
\end{document}

Ausgabe mit verschobener baseline

Wie kann ich die baseline des Bildes auf die baseline der TeX-Zeile darin setzen?

gefragt 21 Jun '13, 15:50

Felix's gravatar image

Felix
1.3k525666
Akzeptiert-Rate: 47%


Die y-Koordinate der Grundlinie von mit btex ... etex gesetztem Text ist in MetaPost im Normalfall Null. Für die Positionierung der Grafik in TeX ist jedoch die Bounding-Box maßgeblich. Diese wird durch Unterlängen im Text oder weitere Grafikelemente bestimmt, wie hier dem Kreis. Um zu erreichen, dass in TeX die Grundlinie der MetaPost-Grafik mit der Grundlinie der aktuellen Zeile übereinstimmt, muss die Bounding-Box der Grafik unterhalb der Abszisse abgeschnitten werden. Dies lässt sich mit Hilfe des Kommando setbounds erreichen. Zusätzlich muss die interne Variable bboxmargin auf Null gesetzt werden, die einen Zuschlag zur eigentlichen Bounding-Box festlegt. Im folgenden Beispiel wird ein Makro schneide_unterhalb definiert, welches die Korrektur der Bounding-Box vornimmt. Argument ist eine y-Koordinate. Das Makro muss als letztes vor endfig ausgeführt werden.

\documentclass{article}
\usepackage{luamplib}
\begin{document}
Die Kreiszahl
\begin{mplibcode}
  def schneide_unterhalb(expr y) =
  begingroup
    save bb; path bb;
    interim bboxmargin := 0;
    bb := bbox currentpicture;
    setbounds currentpicture to
      (xpart llcorner bb, y) -- (xpart lrcorner bb, y) -- 
      urcorner bb -- ulcorner bb -- cycle;
  endgroup
  enddef;
  u := 10;
  beginfig(0);
    picture text;
    text := btex $\pi$ etex;
    draw text;
    draw fullcircle scaled u shifted center text;
    schneide_unterhalb(0);
  endfig;
\end{mplibcode}
ist eine mathematische Konstante.
\end{document}

gesetztes Beispiel

Falls man mehrere Grafiken so behandeln möchte, kann man das Makro auch automatisch per extra_endfig ausführen lassen:

extra_endfig := extra_endfig & "schneide_unterhalb(0);";

Zumindest in MetaPost. Die Umgebung mplibcode des Pakets luamplib scheint übergreifende Variablenzuweisungen momentan nicht zu unterstützen. Als Behelf kann man die Makrodefinition und die Zuweisung an extra_endfig auch in eine Datei schreiben und diese in jeder Umgebung per input einbinden. Es empfiehlt sich dann, statt des Makroparameters eine neue interne Variable einzuführen.

newinternal numeric lowerbb;
lowerbb := 0;

def schneide_unterhalb =
begingroup
  save bb; path bb;
  interim bboxmargin := 0;
  bb := bbox currentpicture;
  setbounds currentpicture to
    (xpart llcorner bb, lowerbb) -- (xpart lrcorner bb, lowerbb) -- 
    urcorner bb -- ulcorner bb -- cycle;
endgroup
enddef;

extra_endfig := extra_endfig & "schneide_unterhalb;";

Bindet man dieses Paket ein, wird die Bounding-Box jeder Grafik unterhalb der y-Koordinate Null abgeschnitten. Durch Zuweisungen an die Variable lowerbb kann man die y-Kordinate für einzelne Grafiken ändern. Die Zuweisungen sollten lokal mittels interim erfolgen, da luamplib in Zukunft möglicherweise umgebungsübergreifende Zuweisungen unterstützt.

Permanenter link

beantwortet 27 Jun '13, 00:19

Stephan%20Hennig's gravatar image

Stephan Hennig
5613
Akzeptiert-Rate: 50%

bearbeitet 27 Jun '13, 09:35

Das MP-Bild wird so eingefügt, dass die Unterkante auf der Basislinie liegt. Du musst also schon in MP dem Ganzen eine Tiefe (depth) mitgeben oder eben einfach die Abbildung verschieben:

\raisebox{-0.5ex}{%
\begin{mplibcode}
...
\end{mplibcode}}

Mit aktuellem TeXLive 2013 kannst du dir das Leben erleichtern, denn es funktioniert auch ohne Zusatzpakete:

\documentclass{article}
\usepackage{graphicx,luamplib}

\begin{document}
Die Kreiszahl
\raisebox{-0.5ex}{%
\begin{mplibcode}
  beginfig(0)
    draw fullcircle scaled 10;
    draw btex $\pi$ etex shifted 10 (-0.25,-0.25);
  endfig;
\end{mplibcode}}
ist eine mathematische Konstante.
\end{document}
Permanenter link

beantwortet 21 Jun '13, 17:54

Herbert's gravatar image

Herbert
5.1k34
Akzeptiert-Rate: 31%

bearbeitet 21 Jun '13, 18:07

Danke, auch für den Tipp, dass TL 2013 das mitbringt! Statt des Verschiebens hoffe ich halt, dass etwas ähnliches machbar ist wie mit der baseline-Option für TikZ-Bilder.

(21 Jun '13, 18:11) Felix
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

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ügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×69
×28
×6
×3
×2

gestellte Frage: 21 Jun '13, 15:50

Frage wurde gesehen: 10,961 Mal

zuletzt geändert: 27 Jun '13, 09:35