Seite 1 von 1

graphik am paragraphanfang umflossen

Verfasst: So 21. Jun 2009, 22:42
von flying sheep
ich habe ein vllt. größeres problem:

Bild

das obere ist, wie es aktuell aussieht, das untere ein mockup, wie es aussehen soll (die roten × ausgeschlossen, das kann xetex besser als gimp)

hier mein bisheriger ansatz, der für das formen natürlich nicht taugt:
\newcommand{\icon}[1]{
  \noindent
  \begin{wrapfigure}{l}{2.6em}
	\vspace{-2.3em}
	\begin{center}
	  \includegraphics[width=3em,height=3em]{#1}
	\end{center}
	\vspace{-2em}
  \end{wrapfigure}
}
zusammengefasste probleme:
  1. zwischen einer überschrift und einem icon entsteht manchmal ein seitenumbruch (nopagebreak liefert keine bis komische ergebnisse)
  2. bei paragraphs (wie hier) wird die absatzüberschrift über die ganze zeile gestreckt
  3. ich habe eine geringe anzahl von formen (kreise, schwerter wie dieses hier, 2 dolche, …), für die ich einzelne abstände definieren könnte (wie beim schwert im mockup gezeigt), dass sich der textumfluss der grafikform anpasst. aber ich weiß nicht, wie.

Verfasst: Mo 22. Jun 2009, 11:16
von KOMA
Da für TeX die Abbildung einfach nur ein rechteckiger Kasten ist, gibt es kein Paket und wird es vermutlich auch in den nächsten Jahren kein Paket geben, dass die tatsächliche Form der Abbildung analysiert, und entsprechend dieser Form einen Umfluss ermöglicht. TeX selbst bietet aber mit \parshape eine Anweisung, die es erlaubt die Form eines Absatzes zu verändern. Damit wäre es möglich, so etwas manuell zu machen:
\documentclass[a4paper]{article}
\usepackage[ngerman]{babel}
\usepackage{blindtext}

\usepackage{graphicx}

\makeatletter
\newcommand{\icon}[2][\relax]{ 
  \noindent
  \ifx\relax#1\relax% Wenn das optionale Argument nicht verwendet wird oder
                    % leer ist, oder \relax ist, dann wird von einer
                    % quadratischen Abbildung ausgegangen.
    \hangindent=3.5em
    \hangafter=-3
    \hskip-3.5em
    \raisebox{\dimexpr\ht\strutbox-\totalheight}[\ht\strutbox][\dp\strutbox]{%
      \includegraphics[width=3em,height=3em]{#2}%
    }%
    \enskip
  \else
    % Das optionale Argument enthält eine korrekte \parshape-Angabe
    \raisebox{\dimexpr\ht\strutbox-\totalheight}[\ht\strutbox][\dp\strutbox]{%
      \includegraphics[width=3em,height=3em]{#2}%
    }\par\nobreak\vskip\dimexpr-\baselineskip-\parskip\relax\nobreak
    \parshape #1
    \noindent
  \fi
  \ignorespaces
}
\makeatother

\begin{document}

\icon{sword}\blindtext

\icon[4 % Es folgen Angaben für min. 4 Zeilen
        3.5em \dimexpr \linewidth-3.5em\relax % 1. Zeile 3.5em einrücken und entsprechend kürzen
        2.5em \dimexpr \linewidth-2.5em\relax % 2. Zeile 2.5em einrücken und entsprechend kürzen
        1.5em \dimexpr \linewidth-1.5em\relax % 3. Zeile 1.5em einrücken und entsprechend kürzen
        0em \linewidth % ab der 4. Zeile nicht mehr einrücken und volle Länge
]{sword}\blindtext

\end{document}
Das ganze funktioniert in dieser trivialen Form nur, wenn der erste Absatz lang genug ist. Anderenfalls wird nicht etwa unter dem Bild weitergemacht, sondern ggf. mit dem nächsten Absatz in das Bild hineingeschrieben. Es funktioniert auch nur korrekt, wenn am Ende der Seite noch genügend Platz vorhanden ist. Sonst wird das Bild ggf. in den unteren Rand hineingemalt. Man könnte zumindest das ändern, indem man dem Bild mehr Höhe gibt (\raisebox) und dafür den negativen \vskip größer macht.

Dein Problem mit Umbruch nach Überschrift wird von wrapfigure verursacht. Dein Problem mit \paragraph liegt daran, dass auf dieser Ebene Spitzmarken gesetzt werden und keine Überschriften-Zeilen. Diese Ebene ist also ggf. umzudefinieren.

Verfasst: Mo 22. Jun 2009, 13:08
von flying sheep
grandios, du bist genial.
mit parshape hab ich auch schon rumgepfuscht, aber nix hingekriegt.

und mit
\newcommand{\iconsword}[1]{
  \icon[4 % Es folgen Angaben für min. 4 Zeilen
	3.5em \dimexpr \linewidth-3.5em\relax % 1. Zeile 3.5em einrücken und entsprechend kürzen
	2.5em \dimexpr \linewidth-2.5em\relax % 2. Zeile 2.5em einrücken und entsprechend kürzen
	1.5em \dimexpr \linewidth-1.5em\relax % 3. Zeile 1.5em einrücken und entsprechend kürzen
	0em \linewidth % ab der 4. Zeile nicht mehr einrücken und volle Länge
  ]{#1}
}
lässt sich auch für mehrere ähnliche grafiken der selbe shape benutzen.
danke, danke, danke!