Grafik mit Text umfliessemn lassen Thema ist als GELÖST markiert

Tabellen und Grafiken erstellen und anordnen


huebi
Forum-Anfänger
Forum-Anfänger
Beiträge: 46
Registriert: So 7. Nov 2021, 12:53

Grafik mit Text umfliessemn lassen

Beitrag von huebi »

Hallo,

ich möchte eine Art "Infobox" in meinem Text haben, indem sich eine Grafik befindet und der Erklärungstext diese umfliesst:
\documentclass{scrbook}
\usepackage[T1]{fontenc}
\usepackage[latin1]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{csquotes}
\MakeOuterQuote{"}
\usepackage{graphicx}
\usepackage{wrapfig}
\usepackage{blindtext}

\begin{document}
\fbox{\parbox{\columnwidth}{{\includegraphics[width=2cm, height=1.5cm]{example-image}}\blindtext auch.}}
	
	
\end{document}

Ich kann jedoch soviele Dokus lesen wie ich will, auch auf den Kopd stellen hat nicht wirklich etwas gebrach. Ich möchte dass der Text nicht unten an der Grafik anfängt, sondern oben.

Oder ist mein Ansatz kappes und ich solte ganz anders darangehen?

//Huebi

Naseg Ruen

Re: Grafik mit Text umfliessemn lassen

Beitrag von Naseg Ruen »

Wenn der Text daneben stehen soll, dann steht in den wichtigen Hinweisen wie man die vertikale Ausrichtung von Text und Bild ändern kann. Es gibt dort diverse Beispiele, die du einfach alle einmal ausprobieren solltest.

Wenn der Text wirklich die Grafik umfließen soll, dann wäre die Verwendung des bereits geladenen Pakets wrapfig eine Möglichkeit. Neben der Anleitung finden sich Beispiele dafür auch im Forum. Allerdings: Wenn Bild und Text zusammen in einen Rahmen sollen, dann geht das AFAIK nicht mit wrapfig. Ob dann eventuell tcolorbox und cutwin kombiniert werden können, weiß ich nicht und müsste es auch erst ausprobieren. Eventuell muss man dann wirklich auf Low-Level-TeX-Ebene gehen und \parshape o. ä. verwenden.

Davon abgesehen: Der Online-Editor/Compiler ist auf UTF8 voreingestellt. \usepackage[latin1]{inputenc} ist hier also eher kontraproduktiv. Die meisten anderen LaTeX-Editoren sind inzwischen ebenfalls auf UTF8 voreingestellt. Ich kenne keine aktuelle Version eines LaTeX-Editors, bei dem es anders ist. Ich kenne sogar gar keinen aktuellen Editor, der auf ISO-Latin-1 voreingestellt ist.

Bartman
Forum-Meister
Forum-Meister
Beiträge: 2456
Registriert: Do 16. Jul 2009, 21:41
Wohnort: Hessische Provinz

Re: Grafik mit Text umfliessemn lassen

Beitrag von Bartman »

Das Paket lettrine scheint dafür geeignet zu sein.

Ich nutze auch lieber das bereits erwähnte tcolorbox, aber der Einfachheit halber habe ich hier mal framed genommen.
\documentclass{scrbook}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[ngerman]{babel}
\usepackage{csquotes}
\usepackage{graphicx}
\usepackage{lettrine}
\usepackage{blindtext}
\usepackage{framed}

\begin{document}
\begin{framed}
\lettrine[image, lines=4]{example-image}{}
\blindtext
\end{framed}
\end{document}

Naseg Ruen

Re: Grafik mit Text umfliessemn lassen

Beitrag von Naseg Ruen »

Nur für den Fall, dass es für den OP wichtig ist, was aus den bisherigen Infos nicht hervor geht:
\documentclass{scrbook}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[ngerman]{babel}
\usepackage{csquotes}
\usepackage{graphicx}
\usepackage{lettrine}
\usepackage{blindtext}
\usepackage{framed}

\begin{document}
\begin{framed}
\lettrine[image, lines=4]{example-image}{}
Funktioniert ganz hervorragend, solange der Text neben der Abbildung aus maximal einem Absatz besteht. Hier wird es dagegen hässlich.

\blindtext
\end{framed}
\end{document}

Gute*r Gȧst*in

Re: Grafik mit Text umfliessemn lassen

Beitrag von Gute*r Gȧst*in »

Mit
\lettrine[image, lines=4]{example-image}{}\hskip\DefaultNindent
dürfte das Ergebnis beim Einfügen eines Bildes i. d. R. eher den Erwartungen entsprechen. Hintergrund ist, dass die erste Zeile bei lettrine in der Voreinstellung nicht zusätzlich eingerückt wird, die übrigen aber schon.

Alternativ könnte natürlich auch Option nindent=0pt verwendet werden. Das hat aber den Nachteil, dass der Text dann an der Abbildung klebt. Das kann wiederum durch Verwendung von findent gelöst werden:
\documentclass{scrbook}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[ngerman]{babel}
\usepackage{csquotes}
\usepackage{graphicx}
\usepackage{lettrine}
\usepackage{blindtext}
\usepackage{framed}

\begin{document}
\begin{framed}
\lettrine[image, lines=4,findent=\DefaultNindent,nindent=0pt]{example-image}{}%
\blindtext
\end{framed}
\end{document}
Das Prozentzeichen ist hier übrigens wichtig, weil sonst ein zusätzliches Leerzeichen eingefügt wird.

huebi
Forum-Anfänger
Forum-Anfänger
Beiträge: 46
Registriert: So 7. Nov 2021, 12:53

Re: Grafik mit Text umfliessemn lassen

Beitrag von huebi »

Hallo, danke für die Tips. Habe mich erstmal einlesen müssen.

Prinzipiell gefällt mir lettrine ganz gut. Nur scheint sich framed an der Textmenge zu orientieren wenn es den Rahmen berechnet:
\documentclass{scrbook}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[ngerman]{babel}
\usepackage{csquotes}
\usepackage{graphicx}
\usepackage{lettrine}
\usepackage{blindtext}
\usepackage{framed}

\begin{document}
\begin{framed}
\lettrine[image, lines=4,findent=\DefaultNindent,nindent=0pt]{example-image}{}%
Wenig Text.
\end{framed}
\end{document}
Die Dokumentation zu framed habe ich mir dann mal durchgelesen, wie ich aber das Problem mit wenig Text löse habe ich nicht gefunden.

Die Anfänge des Dokumentes liegen im übrigen im Jahre 2011 unter Windows. Daher auch die Encodierung. Ich hab zwar schon mal versucht, dass Dokument in utf8 umzuwandeln, das war aber nicht von Erfolg gekrönt. Ich hab mich auch nie sonderlich hingesetzt um das zu bewerkstelligen. Ich hab für das Beispiel dann halt die entsprechneden Stellen aus meinem Dokument zu einem lauffähigen Beispiel zusammengefügt.

//Huebi

Naseg Ruen

Re: Grafik mit Text umfliessemn lassen

Beitrag von Naseg Ruen »

Das ist genau genommen das gleiche Problem wie von mir oben bereits mit einem kurzen Absatz gefolgt von einem langen gezeigt wurde. lettrine funktioniert grundsätzlich nur (automatisch), wenn der Text des Absatzes vertikal min. so viel Platz benötigt wie das Bild. Anders gesagt, wenn das Bild nicht komplett in den Textabsatz passt, dann hat man ein Problem. Man kann das aber einfach mit einem \vspace lösen. Man kann aber auch eine \parbox oder eine minipage in die framed-Umgebung packen und deren optionales Argument für die Höhe verwenden. Man könnte auch erst alles in eine lrbox packen und dann ausmessen, ob das Ergebnis min. so hoch ist wie die Abbildung und anderenfalls mit \vspace danach Platz schaffen. Es gibt da viele Möglichkeiten. Was mit lettrine immer schief geht, sind aber zwei Absätze neben dem Bild (siehe oben).

Oder man verwendet das bereits erwähnte tcolorbox. Dort kann man eine Höhe als Option angeben. Alternativ kann man auch eine Vergrößerung der natürlichen Höhe angeben. Das Paket bietet wirklich extrem viele Möglichkeiten.

huebi
Forum-Anfänger
Forum-Anfänger
Beiträge: 46
Registriert: So 7. Nov 2021, 12:53

Re: Grafik mit Text umfliessemn lassen

Beitrag von huebi »

Moin,
ich muss jetzt einfach feststellen dass das ganze doch Ausmaße annimmt, die mich dazu bewegen dieses zu beerdigen. Für mich sah das Problem recht einfach aus. Leider funktioniert die einfach aussehemde Lösung mit lettrine nicht, und mit vspace mag ich nicht arbeiten, da ich ja dann für jede Box mit wenig Text diese individuell nachjustieren müsste.
tcolorbox sieht ganz nett aus und mit einfachen Sachen kommt man recht weit. Es gibt auch auf CTAN ein Dokument welches zahlreiche Beispiele zeigt, aber nicht eines beschäftigt sich auch nur annährend mit meinem Darstellungswunsch. Und mich nun durch satte 540 Seiten zu wühlen, ist mir jetzt echt zu viel. Es wird wohl das letzte LaTex Dokument sein welches ich noch erstellen werde und hab mein "Projekt" mit LaTex aus Spaß an der Freude angefangen. Aber mich nun durch tcolorbox, wrapfig, minipage, lrbox und was weiss ich noch durchzuwühlen, da steht für mich persönlich der Aufwand in keiner Relation zum Nutzen.
Hab trotzdem das eine oder andere mitgenommen, und bedanke mich für die Zeit, die ihr hier verwendet habt.

//Huebi

PS Nein ich hab keine fertige Copy&Paste Lösung erwartet, das würde der Motivation das ganze mit LaTex aufzusetzen zuwiderlaufen.

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

Re: Grafik mit Text umfliessemn lassen

Beitrag von KOMA »

huebi hat geschrieben:
Mi 26. Jan 2022, 07:02
Leider funktioniert die einfach aussehemde Lösung mit lettrine nicht, und mit vspace mag ich nicht arbeiten, da ich ja dann für jede Box mit wenig Text diese individuell nachjustieren müsste.
Eigentlich nicht. Denn bei Boxen mit weniger Text funktioniert ja die triviale Lösung mit \parbox oder minipage neben der Grafik, wie sie in den wichtigen Hinweisen (allererster Link in der Diskussion) gezeigt wird. Man braucht dann nur noch den Rahmen, für den ja bereits tcolorbox empfohlen wurde (aber auch eine schier unendliche Menge weiterer Pakete verfügbar ist). Außerdem kann man das, wie oben erwähnt, sogar automatisch bestimmen, weil man bei LaTeX die Höhe des Ergebnisses von etwas eben ausmessen kann. (Ich werde unten zeigen, dass man das aber gar nicht muss.) Das fällt aber nicht vom Himmel, sondern man muss LaTeX eben lernen – und je komplexere Probleme man hat, desto intensiver lernen – bevor man solche Dinge angeht. Halbwissen (wie meines) kann dabei zwar nützlich sein. Es genügt auch nie zu sagen: »Ich mache jetzt seit 25 Jahren LaTeX, ich muss keine Anleitungen mehr lesen.«. (Nein, ich unterstelle Dir das nicht, ich selbst könnte mich auf dieses hohe Ross stellen und damit kläglich scheitern). In konkreten Fällen muss man einfach die Bereitschaft haben, ggf. einmal 1­–2 Stunden oder ggf. auch mehr Anleitungen intensiver zu studieren. Man macht das ja nie umsonst, sondern lernt dabei eigentlich immer etwas dazu.

Du hast wohl schlicht unterschätzt, dass wenn man bei LaTeX gleich zu Anfang alles wissen/können will, das nichts wird. Der Einstieg in LaTeX ist nicht ganz so schwer, wie oft dargestellt – vorausgesetzt man will nicht gleich alles anders haben. Bei LaTeX gibt es für komplexere Probleme auch oftmals unzählige unterschiedliche Ansätze (wie man an meinem zweiten Link im vorherigen Absatz sieht ;-)). Da lohnt es sich ggf. durchaus nachzufragen und auf Ratschläge – wie den zu tcolorbox oben – zu hören. Wobei tcolorbox hier ja lediglich den Teil des Rahmens liefert. Dafür reicht im ersten Ansatz schon die Quick Reference in der Anleitung (zuzüglich eventuell einiger gezielter Suchen, wie ich gleich zeigen werde).

Bilder mit Text umfließen ist übrigens eines der Probleme, das man mit LaTeX eher mäßig gut lösen kann. Für einfache Fälle funktioniert das (beispielsweise mit dem erwähnten wrapfig, das übrigens eine sehr kurze Anleitung hat) recht gut. Du hast hier aber bereits einen recht speziellen Fall, auch wenn das auf den ersten Blick nicht so scheinen mag. Das ist übrigens auch nichts, was man wirklich häufig tut oder tun sollte. Wechselnde Zeilenlängen stören nämlich den Lesefluss. Wenn ich das richtig verstanden habe, hast du hier einen speziellen Fall, weil du so eine Art Alertbox realisieren willst. Das ist legitim und durchaus auch realisierbar. Und man muss das auch nicht gleich zu Anfang perfekt haben. Für den ersten Schritt würde ja etwas wie:
\documentclass[a4paper]{article}
\usepackage[ngerman]{babel}
\usepackage{tcolorbox}

\usepackage{mwe}% Für kleine Beispiele nützlich.

\newcommand{\Alert}[2]{% #1 = filename of image, #2 = text
  \begin{tcolorbox}
    \raisebox{\dimexpr\ht\strutbox-\totalheight}{% siehe die wichtigen Hinweise zu diesem Foremabschnitt
      \includegraphics[width=2cm]{#1}%
    }\hskip 1em
    \parbox[t]{\dimexpr\linewidth-2cm-1em}{%
      \setlength{\parindent}{1em}\noindent\ignorespaces
      #2%
    }%
  \end{tcolorbox}
}
\begin{document}
\blindtext
\Alert{example-image}{Das ist ein ganz kurzer Beispieltext}
\blindtext
\Alert{example-image-a}{\blindtext}
\blindtext
\Alert{example-image}{Es geht auch, wenn man zwei Absätze hat, wie in diesem
  Beispiel hier.\par\blindtext}
\blindtext
\end{document}
genügen.

Das Umfließen kann man dann irgendwann später realisieren, wenn man unter weniger Lerndruck steht. Dem kann man sich auch relativ einfach annähern, indem man unter Zuhilfenahme des bereits ganz weit oben erwähnten Pakets wrapfig erst einmal etwas wie:
\newcommand{\Alert}[2]{% #1 = filename of image, #2 = text
  \begin{tcolorbox}
    \setlength{\intextsep}{0pt}
    \begin{wrapfigure}{l}{0pt}
      \includegraphics[height=4\baselineskip]{#1}%
    \end{wrapfigure}
    #2%
  \end{tcolorbox}
}
ausprobiert. Dabei stellt man fest, dass die erste Box aus meinem vorherigen Beispiel nicht hoch genug wird, weil offenbar die Höhe des Bildes für die Höhe der Box nicht relevant ist. Das ist aber kein Beinbruch. Man schaut jetzt einfach einmal in der tcolorbox-Anleitung nach, was dort zum Thema height gesagt wird. Bereits im Inhaltsverzeichnis wird man fündig, dass sich der komplette Abschnitt »4.10 Height Control« damit beschäftigt. Ich musste das übrigens auch gerade erst nachlese, weil ich zwar wusste, dass man die Höhe ändern kann, aber nicht, wie man eine Mindesthöhe angibt. Man macht das, indem man eine Mindest-Höhe und eine Maximalhöhe angibt, wahlweise über die beiden Optionen height und height plus oder direkt über height from, wobei letztere Option offenbar ein Problem mit Angaben wie height from=6\baselineskip to \textheight hat, während height from=2cm to \textheight funktioniert. Also habe ich mich zur Methode mit zwei Optionen entschlossen und:
\newcommand{\Alert}[2]{% #1 = filename of image, #2 = text
  \begin{tcolorbox}[height=6\baselineskip,height plus=\textheight]
    \setlength{\intextsep}{0pt}
    \begin{wrapfigure}{l}{0pt}
      \includegraphics[height=4\baselineskip]{#1}%
    \end{wrapfigure}
    #2%
  \end{tcolorbox}
}
verwendet. Es ergibt sich somit:
\documentclass[a4paper]{article}
\usepackage[ngerman]{babel}
\usepackage{tcolorbox}
\usepackage{wrapfig}

\usepackage{mwe}% Für kleine Beispiele nützlich.

\newcommand{\Alert}[2]{% #1 = filename of image, #2 = text
  \begin{tcolorbox}[height=6\baselineskip,height plus=\textheight]
    \setlength{\intextsep}{0pt}
    \begin{wrapfigure}{l}{0pt}
      \includegraphics[height=4\baselineskip]{#1}%
    \end{wrapfigure}
    #2%
  \end{tcolorbox}
}
\begin{document}
\blindtext
\Alert{example-image}{Das ist ein ganz kurzer Beispieltext}
\blindtext
\Alert{example-image-a}{\blindtext}
\blindtext
\Alert{example-image}{Es geht auch, wenn man zwei Absätze hat, wie in diesem
  Beispiel hier.\par\blindtext}
\blindtext
\end{document}
Wie man sieht, ist das weit weniger kompliziert als man denkt. Für den Einstieg braucht man von grundlegendem Basiswissen wie \baselineskip (das man ggf. natürlich auch durch feste Werte ersetzen könnte) kaum mehr als zwei Seiten tcolorbox-Anleitung (nämlich die Quick Reference) und eine Seite wichtige Hinweise aus dem Forum. Für die gute Lösung braucht man noch zwei Seiten wrapfig Anleitung, 5 Minuten Suchen in der tcolorbox-Anleitung und dort dann noch einmal keine zwei Seiten eines Abschnitts von 9 Seiten.

Wie man in dem Beispiel auch sieht, ist es von Vorteil, von Anfang an mit sauberem Markup zu arbeiten. Ich musste nämlich für die ganzen Experimente immer nur die Definition von \Alert ändern, während ich den Körper des Beispieldokuments unangetastet lassen konnte.

Es sei nicht verschwiegen, dass man für Bild und Text nebeneinander auch Abschnitt »6 Side by Side« der tcolorbox-Anleitung hätte lesen und damit eine ganz andere Lösung als in meinem ersten Beispiel hätte erreichen können. Ich wollte aber zeigen, dass man eben auch mit konventioneller einsteigen kann.

Es sei auch erwähnt, dass mit Abschnitt »4.11 Box Content Additions« das Einfügen der wrapfigure auch hätte per Option erfolgen können. Und natürlich hätte man statt eines \Alert-Befehl auch eine Umgebung definieren können. In dem Fall sei ausdrücklich auch Abschnitt »24.2 Producing tcolorbox Environments and Commands« hingewiesen.

Am Rande bemerkt: Das Schreiben dieses Beitrags hat übrigens weit länger gedauert als das Finden eine Lösung. Bei einem Anfänger wäre das natürlich eher umgekehrt gewesen. Das Leben ist unfair. Eigentlich wollte ich aber nur zeigen, dass man nicht immer gleich die Flinte ins Korn werfen muss. Die entscheidenden Hinweise, nämlich die die wichtigen Hinweise und welche Pakete man sich anschauen solle und dass man die Höhe des Kastens bei tcolorbox per Option verändern kann, gab es auch ganz früh in dieser Diskussion. Ich habe diese Informationen ganz bewusst für meinen gezeigten Lösungsweg auch genutzt. Den Weg über die Bestimmung der Höhe via lrbox (das ist übrigens kein Paket, sondern eine Umgebung, die im usrguide erklärt wird, also zum Basiswissen gehören sollte) habe ich mir erspart, weil er schlicht nicht benötigt wird. Genau genommen wird lrbox ohnehin nicht zwingend benötigt, weil man auch einfach \settoheight und \settodepth nutzen kann, um Höhe und Tiefe von etwas zu ermitteln. Auch das sind Anweisungen aus dem LaTeX-Kern, gehören also eigentlich zum Basiswissen.

huebi
Forum-Anfänger
Forum-Anfänger
Beiträge: 46
Registriert: So 7. Nov 2021, 12:53

Re: Grafik mit Text umfliessemn lassen

Beitrag von huebi »

Hallo,

gleich so eine lange Antwort. Da muss ich mal ausholen.

Ich speicher mir Kochrezepte ab, die mir beim Surfen über den Weg laufen, nachgekocht wurden und für würdig befunden archiviert zu werde. Das erste Kochbuch habe ich noch mit Openoffice geschrieben, beim zweiten habe ich mich dann hingesetzt und mit LaTex angefangen. Das jetzige hat seinen Ursprung übrigens schon im Kahr 2011. Programme/Apps für Rezeotdatenbanken mag ich nicht weil ich in der Küche nicht mit Tablet oder gar Laptop hantieren mag. Wenn das Buch einen gewissen Umfang hat wird es gedruckt.
Die Beschäftigung mit LaTex ist eher Spass an der Sache und strukturell sind Kochbücher eher einfach gestrickt, von daher gibt es keinen Druck es mit LaTex zu machen.
Ich hatte nun im Weinhachtsurlaub die spleenige Idee, den Getränketipp doch etwas vom Text abzuheben. Nur waren alle meine Versuche recht erfolglos und hab mit gesagt, als letzten Versuch fragste mal hier. Aber die Lösung war in manchen Fällen halt unbefriegend und habe mich dann entschieden, dass mir noch mehr Aufwand einfach nicht gerechtfertigt war. Flinte ins Kornwerden würde ich daher nicht sagen. Meine Zeit ist halt auch beschränkt und die meiste Zeit kopiere ich nur Texte rein, lasse eine Handvoll Makros von TexStudio drüber laufen und gut ist.
Und weil ein paar Leute halt Zeit investiert haben um mr zu helfen wollte den Thread nicht einfach sang und klanglos beenden. sondern sagen, warum ich das (eigentlich) nicht weiter verfolgen wollte.

Von daher danke das du nochmal soviel Zeit investiert hast.

Antworten