alt text

Wenn ich \def\mybox{Zeile 1 \\ Zeile 2 \\ Zeile 3} habe, mit irgendeinem Inhalt (also z.B. auch Graphiken) und davon die Höhe messen will, \newlength\myheight \settoheight\myheight{\mybox}, scheint die Mehrzeiligkeit ignoriert zu werden.

Wie kann ich die korrekte Höhe messen?

Öffne in Overleaf
\documentclass[]{book}
%\parindent0pt    % alt 
\setparsizes{0pt}{0pt}{0pt plus 1fil}  % neu
\begin{document}

\newlength\myheight
\def\mybox{Zeile 1   \\  Zeile 2 \\ Zeile 3}
\settoheight\myheight{\mybox}
Wert: \the\myheight  ~(falsch!) \\
Inhalt: \\ \mybox

\bigskip 
\newlength\Myheight
\def\Mybox{Zeile 1} 
\settoheight\Myheight{\Mybox}
Wert: \the\Myheight \\
Inhalt: \\ \Mybox
\end{document}

gefragt 28 Nov '18, 19:06

cis's gravatar image

cis
9.5k75452491
Akzeptiert-Rate: 29%

bearbeitet 06 Dez '18, 15:47

Bei deiner Messung wird nur die Höhe, nicht die Tiefe gemessen. Ich glaube (nicht getestet), der Befehl müsste \settototalheight lauten.

(28 Nov '18, 19:20) Skillmon

Mmhhh, \settototalheight\myheight{\mybox} (\usepackage{calc}) hatte erstmal keinen Effekt.

(28 Nov '18, 19:30) cis

In dem Fall greife ich auf die händische Methode zurück: \newsavebox\mysavebox\setbox\mysavebox\vbox{\mybox} \setlength\myheight{\dimexpr\ht\mysavebox+\dp\mysavebox\relax}

(28 Nov '18, 19:51) Skillmon

Das Problem mit \settototalheight ist, dass es eine \hbox verwendet. In dieser werden Zeilenumbrüche ignoriert (es sei denn, du verwendest eine \parbox o.ä.).

(28 Nov '18, 19:56) Skillmon

Du musst intern z.B. eine parbox oder eine tabular verwenden.

(28 Nov '18, 20:55) Ulrike Fischer
1

Ich gehe mal davon aus, dass du im wahren Leben \parindent0pt nicht verwendest. Weil aber Anfänger gerne Dinge nachmachen, die sie irgendwo im Internet gesehen haben, seien diese hiermit vorsorglich davor gewarnt: Was ist eigentlich so schlimm daran, parindent auf Null zu setzen?

(29 Nov '18, 08:15) gast3

Diesen parindent ungleich Null braucht man m.E. nur dann, wenn man fortlaufende / schriftstellerische / lange Texte verfasst. Das mache ich in seltensten Fällen. Ich habe z.B. ein Blatt mit einer Graphik und paar Angaben dazu. Die Angaben sollen untereinander stehen. Und dann nervt es mich, das bei diesen Angaben gleich wieder ein Absatzeinzug erzwungen wird. Und dann setze ich \parindent0pt. Wenn es dafür einen besseren Befehl mit gleicher Wirkung gibt, kann ich auch diesen verwenden.

(29 Nov '18, 14:37) cis

In dem Fall empfehle ich dir, tatsächlich die von mir verlinkte Seite einmal sehr aufmerksam durchzulesen.

(29 Nov '18, 15:58) gast3

Der Linktext sagt mir, dass \parindent0mm bzw. seine analogen Befehle schlecht sind und Beispiele, die das verwenden blöd sind. Wie man den Asatzeinzug abstellt, finde ich da nicht. Andereseits wird auf das KOMA-Handbuch verwiesen. Sofern ich in der Tabelle parskip=<WERT> nichts übersehen habe, finde da auch nichts Passendes. Weiteres forschen im KOMA-Handbuch liefert schließlich versteckt \setparsizes{0pt}{0pt}{0pt plus 1fil}, das beseitigt den Absatzeinzug. Ist mir irgendwie noch untergekommen, aber das besser ist: von mir aus.

(29 Nov '18, 23:42) cis

Fortsetzung: Im Fall des nicht-romanartigen Dokuments, z.B. ein Blatt mit Graphiken, sind mir mit \parindent0mm noch keine Probleme aufgefallen, außer dass das Ding einen schlechten Ruf hat und Profis dann die Beispiele blöd finden.

Auf der anderen Seite finde ich eigentlich immer nur Kritik an diesem Befehl. Bei googeln nach Lösungen finde aber nur diesen Befehl oder den Hinweis, dass man unbedingt einen Absatzeinzug verwenden soll...

(29 Nov '18, 23:48) cis

Fortsetzung: Ich könnte mir vorstellen, dass \parindent0mm Probleme machen könnte, wenn man sowas wie eine Absatznummerierung haben möchte. Weil, \parindent0mm, wohl die Absätze unerkennbar macht oder sowas.

Ansonsten kann ich auch dieses Monstrum \setparsizes{0pt}{0pt}{0pt plus 1fil} da verwenden. Wenn das die Herzen der Leute mehr erfreut, warum nicht...

(29 Nov '18, 23:48) cis
1

Du scheinst irgendwie eine andere Seite gelesen zu haben, denn die verlinkte Seite erklärt auch ausführlich, dass und warum es schlecht ist, einfach nur den Absatzeinzug abzuschalten, ohne dann explizit eine andere Art der Absatzauszeichnung zu aktivieren. Es liefert sogar Beispiele, die das verdeutlichen. Es wird auch erklärt, welche Arten von Absatzauszeichnungen existieren, wie man diese ggf. aktiviert und welche Art aus welchem Grund normalerweise zu bevorzugen ist.

(30 Nov '18, 16:46) gast3

Naja, das habe ich schon so gemeint: Die Seite sagt mir: "mach das nicht, das ist nicht gut". Aber sie sagt mir nicht, wie ich den Absatzeinzug abstelle.

(02 Dez '18, 00:13) cis

Doch genau das tut sie, denn sie sagt, dass du nicht einfach den Absatzeinzug abschalten, sondern auf eine andere Absatzauszeichnung umschalten sollst. Sie erklärt auch, dass die einzige taugliche andere Absatzauszeichnung der Absatzabstand ist und wie man korrekt auf diesen umschaltet. Zu letztere, gibt es übrigens auch auf TeXwelt bereits eine Seite: Wie erhalte ich eine Leerzeile zwischen Absätzen?

(02 Dez '18, 10:06) gast3
Ergebnis 5 von 14 show 9 more comments

\settoheight verwendet intern eine \hbox welche nur eine einzelne Zeile darstellen kann. Um mehrere Zeilen zu erhalten muss man den Inhalt in eine \vbox packen. Um die gesamte Höhe (\ht+\dp) der Box zu erhalten muss man \settototalheight aus dem calc Paket verwenden.

N.B.: \\ beginnt keinen neuen Absatz, sondern fügt nur eine Penalty mit Wert -10000 ein, um einen Zeilenumbruch zu erzwingen. Die Definition von \\ ist effektiv \penalty10000\hfil\penalty-10000. Zunächst wird mit \penalty10000 ein Zeilenumbruch unterdrückt, dann wird mit \hfil die Zeile aufgefüllt und schließlich mit \penalty-10000 der Zeilenumbruch erzwungen. Man sollte stattdessen immer \par oder einfach eine leere Zeile verwenden.

Öffne in Overleaf
\documentclass[]{book}
\usepackage{calc}
\parindent0pt
\begin{document}

\newlength\myheight
\def\mybox{Zeile 1\par Zeile 2\par Zeile 3}
\settototalheight\myheight{\vbox{\mybox}}
Wert: \the\myheight  ~(falsch!)

Inhalt:

\mybox

\bigskip 
\newlength\Myheight
\def\Mybox{Zeile 1} 
\settototalheight\Myheight{\vbox{\Mybox}}
Wert: \the\Myheight

Inhalt:

\Mybox
\end{document}

alt text

Permanenter link

beantwortet 28 Nov '18, 22:27

Henri's gravatar image

Henri
15.7k133943
Akzeptiert-Rate: 46%

bearbeitet 28 Nov '18, 22:33

Nur als Ergänzung: Eine Implementierung von \settototalheight ohne Verwendung von calc findet sich beispielsweise in https://texwelt.de/wissen/antwort_link/22491/.

(29 Nov '18, 08:12) gast3
(29 Nov '18, 14:31) cis

@cis Das war dort nicht gefragt (schon meinen Hinweis zu einem Kommentar in der Antwort betrachte ich als eher gewagt, da Kommentare jederzeit unwiederbringlich gelöscht werden können und eigentlich nicht Teil der Frage sind) und außerdem hast du ja zu der Frage, zu der ich oben eine Antwort verlinkt habe, ebenfalls eine Antwort beigetragen, so dass ich davon ausgehen darf, dass du auch meine Antwort aufmerksam gelesen hast und deshalb diese Methode bereits kennst. ;-)

(29 Nov '18, 16:01) gast3

@Ijon Tichy An sich sollte es durch Kombination beider Lösungen nun klar sein. Ich habe damit rumgebastelt, es kommt nicht sauber raus. Was wahrscheinlich an irgendwelchen weiteren Maßen liegt ('marginsep' usw.?). Ich versuche es später am Abend nochmal.

(29 Nov '18, 17:03) cis
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:

×74
×20
×3

gestellte Frage: 28 Nov '18, 19:06

Frage wurde gesehen: 4,779 Mal

zuletzt geändert: 04 Dez '18, 15:53