graphik am paragraphanfang umflossen

Redefinition von Makros, Definition eigener Befehle sowie neuer Umgebungen


flying sheep
Forum-Anfänger
Forum-Anfänger
Beiträge: 40
Registriert: So 27. Jul 2008, 14:34
Wohnort: München, By
Kontaktdaten:

graphik am paragraphanfang umflossen

Beitrag 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.

Benutzeravatar
KOMA
TeX-Entwickler
TeX-Entwickler
Beiträge: 2958
Registriert: Fr 4. Jul 2008, 17:28
Kontaktdaten:

Beitrag 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.

flying sheep
Forum-Anfänger
Forum-Anfänger
Beiträge: 40
Registriert: So 27. Jul 2008, 14:34
Wohnort: München, By
Kontaktdaten:

Beitrag 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!

Antworten