PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anzahl Zeilen für einen Text berechnen



Dee
01-05-2009, 21:02
Hallo,

ich hab ein eher ungewöhnliches Problem, vielleicht weiß aber dennoch jemand eine Lösung.

Man stelle sich vor, ich habe ein Umgebung, die mit Text gefüllt wird:


\begin{myenvironment}
... viel Text ...
\end{myenvironment}

Die Umgebung ist so definiert, dass sie hinter den Text eine Grafik setzt. Die Höhe der Grafik berechnet sich aus der Anzahl der benötigten Zeilen.

Und genau hier ist mein Problem: Zur Zeit gebe ich an meine Umgebung per


\begin{myenvironment}{10}
... viel Text ...
\end{myenvironment}

die Anzahl der Zeilen (hier 10) mit, damit die Größe berechnet wird.

Geht dies irgendwie automatisch? Sprich ein Befehl der Art


\calcheight{KOMPLEXER_LATEX_BEFEHL}

der berechnet, wie viel Höhe der KOMPLEXE_LATEX_BEFEHL im Text einnehmen würde?

Viele Grüße
Dee

mechanicus
01-05-2009, 22:18
Hallo,

du kannst die Umgebung linenumbers für deine Zwecke verwenden. Ist Bestandteil des lineno-Paketes.

Gruß
Marco

Dee
02-05-2009, 09:38
Hm, ich habe nun mal so was versucht:


\begin{linenumbers}
Hallo\\
Wie geht es\\
Dir
\end{linenumbers}

Da sehe ich dann vor jeder Zeile die Zeilennummer. Ich sehe aber noch nicht ganz, wie ich die Anzahl dann automatisch weiter benutzen kann. Und vor allem will ich ja nicht, dass dieser berechnete Text ausgegeben wird (zumindest nicht mit Zeilennummern).

Gruß Dee

edico
02-05-2009, 10:47
Wenn du eine Höhe berechnen willst, um mit ihr zu arbeiten, kannst du den Prozess imo nur in zwei Schritten generieren:
1. du musst die Berechnungen vornehmen, indem du den Text in eine fiktive Box packst,
2. du kannst die Masze der Box einbauen.



\documentclass[paper=a5,pagesize,halfparskip,10pt]{scrartcl}
\usepackage{showframe}% just_4_demo

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[sc,osf]{mathpazo}
\usepackage[scaled=.8]{beramono}

\usepackage{calc,graphicx,settobox}


\begin{document}

\section{Die Hilfs-Box berechnen}

\newsavebox{\mybox}
\savebox{\mybox}{%
\begin{tabular}{@{}p{\linewidth}@{}}
Wir vergleichen das Genom von gesunden Probanden mit dem von kranken und suchen jene Biomarker, die die psychische Krankheit anzeigen. Die Messungen nimmt ein Roboter vor. Da rattert es, und heraus kommt die Aktivität Tausender Gene. Tatsächlich wissen wir jetzt, dass bei denjenigen, die krank wurden, einige Gene anders reguliert werden.
\end{tabular}
}
Die Box um eine nicht sichtbare, fiktive Tabelle hat folgende Masze:\par
\the\wd\mybox -- Breite der Box\par
\the\ht\mybox -- Hoehe der Box\par
\the\dp\mybox -- Tiefe der Box\par


\clearpage\newpage
\section{Die Seite bauen}

\parbox{\the\wd\mybox}{%
\begin{tabular}{@{}p{\linewidth}@{}}
Wir vergleichen das Genom von gesunden Probanden mit dem von kranken und suchen jene Biomarker, die die psychische Krankheit anzeigen. Die Messungen nimmt ein Roboter vor. Da rattert es, und heraus kommt die Aktivität Tausender Gene. Tatsächlich wissen wir jetzt, dass bei denjenigen, die krank wurden, einige Gene anders reguliert werden.
\end{tabular}
}

\includegraphics[height=\ht\mybox+\dp\mybox]{bild}

\end{document}


edico

voss
02-05-2009, 12:24
Wenn du eine Höhe berechnen willst, um mit ihr zu arbeiten, kannst du den Prozess imo nur in zwei Schritten generieren:
1. du musst die Berechnungen vornehmen, indem du den Text in eine fiktive Box packst,
2. du kannst die Masze der Box einbauen.



\parbox{\the\wd\mybox}{%
\begin{tabular}{@{}p{\linewidth}@{}}
Wir vergleichen das Genom von gesunden Probanden mit dem von kranken und suchen jene Biomarker, die die psychische Krankheit anzeigen. Die Messungen nimmt ein Roboter vor. Da rattert es, und heraus kommt die Aktivität Tausender Gene. Tatsächlich wissen wir jetzt, dass bei denjenigen, die krank wurden, einige Gene anders reguliert werden.
\end{tabular}
}



\usebox\mybox macht dasselbe

Herbert

Dee
02-05-2009, 20:21
Hallo,

das klingt sehr gut. Vielen Dank dafür. Ich habe es jetzt per


\newsavebox{\mybox}

\newcommand{\boxhoehe}[1]
{
\savebox{\mybox}{%
\begin{tabular}{@{}p{\linewidth}@{}}
#1
\end{tabular}
}
Die Box um eine nicht sichtbare, fiktive Tabelle hat folgende Masze:\par
\the\wd\mybox -- Breite der Box\par
\the\ht\mybox -- Hoehe der Box\par
\the\dp\mybox -- Tiefe der Box\par
}

umgesetzt.

Ist es jetzt noch möglich, das ganze als Environment zu schreiben? Hat denn das, was zwischen dem \begin und \end steht einen Zugriffsbezeichner? Sprich, kann von


\begin{myenvironment}
... viel Text ...
\end{myenvironment}

die Höhe über die obige Box berechnet werden?

Wenn nicht, muss ich wohl auf ein simples Kommando umsteigen.

Viele Grüße
Dominik

mechanicus
02-05-2009, 20:31
Hallo,


\documentclass[ngerman]{article}
\usepackage{babel,blindtext}
\newsavebox{\mybox}
\newenvironment{myenv}{%
\begin{lrbox}{\mybox}\begin{minipage}{\textwidth}
}{%
\end{minipage}\end{lrbox}%
\usebox{\mybox}
\par Die Box um eine nicht sichtbare, fiktive Tabelle hat folgende Masze:\par
\the\wd\mybox -- Breite der Box\par
\the\ht\mybox -- Hoehe der Box\par
\the\dp\mybox -- Tiefe der Box\par}
\begin{document}
\begin{myenv}
\blindtext[1]

\rule{4cm}{2cm}
\end{myenv}

\end{document}

Gruß
Marco

Dee
02-05-2009, 21:05
Vielen Dank. Wir nähern uns langsam meinem Ziel. :)

Ich habe noch ein Problem, wenn ich die Minipage zentrieren will:


\documentclass[ngerman]{article}
\usepackage{babel,blindtext}
\newsavebox{\mybox}
\newenvironment{myenv}
{%
\begin{lrbox}{\mybox}
\begin{center}
\begin{minipage}{0.5\textwidth}
}{%
\end{minipage}
\end{center}
\end{lrbox}%
\usebox{\mybox}
\par Die Box hat folgende Hoehe: \the\ht\mybox
}

\begin{document}
\begin{myenv}
\blindtext[1]
\end{myenv}
\end{document}

So kompiliert es leider nicht wegen "! LaTeX Error: Something's wrong--perhaps a missing \item." Ohne die Box drumherum würde es klappen.

Mit \centering habe ich es auch probiert, das gibt zwar keinen Fehler, die Minipage ist aber auch nicht zentriert.

Viele Grüße
Dominik

mechanicus
02-05-2009, 21:06
Hallo,


\documentclass[ngerman]{article}
\usepackage{babel,blindtext}
\newsavebox{\mybox}
\newenvironment{myenv}
{%
\begin{lrbox}{\mybox}
\begin{minipage}{0.5\textwidth}\centering
}{%
\end{minipage}
\end{lrbox}%
\usebox{\mybox}
\par Die Box hat folgende Hoehe: \the\ht\mybox
}

\begin{document}
\begin{myenv}
\blindtext[1]
\end{myenv}
\end{document}

Gruß
Marco

voss
02-05-2009, 21:41
man möchte wahrscheinlich die Werte außerhalb der Box haben:


\documentclass[ngerman]{article}
\usepackage{babel,blindtext}
\newsavebox{\mybox}
\newenvironment{myenv}{%
\global\lrbox{\mybox}
\minipage{0.5\textwidth}
}{\endminipage\endlrbox}

\begin{document}
\begin{myenv}
\blindtext[1]
\end{myenv}

Die Box hat folgende Hoehe: \the\ht\mybox
\par Die Box hat folgende Tiefe: \the\dp\mybox
\par Die Box hat folgende Breite: \the\wd\mybox

\end{document}


Herbert

mechanicus
02-05-2009, 21:47
Hallo Herbert,

um den Text in myenv auszugeben, benötigt man eigentlich usebox. Doch es will nicht:

\documentclass[ngerman]{article}
\usepackage{babel,blindtext}
\newsavebox{\mybox}
\newenvironment{myenv}{%
\global\lrbox{\mybox}
\minipage{0.5\textwidth}
}{\endminipage\endlrbox\usebox{\mybox}}

\begin{document}
\begin{myenv}
\blindtext[1]
\end{myenv}

Die Box hat folgende Hoehe: \the\ht\mybox
\par Die Box hat folgende Tiefe: \the\dp\mybox
\par Die Box hat folgende Breite: \the\wd\mybox

\end{document}

Gruß
Marco

voss
02-05-2009, 22:33
um den Text in myenv auszugeben, benötigt man eigentlich usebox. Doch es will nicht:


dann muss man die Werte global festlegen:


\documentclass[ngerman]{article}
\usepackage{babel,blindtext}
\newsavebox\mybox
\newenvironment{myenv}[1][\textwidth]{%
\begin{lrbox}{\mybox}
\minipage{0.5\textwidth}
}{\endminipage\end{lrbox}\usebox\mybox%
\xdef\Hoehe{\the\ht\mybox}%
\xdef\Tiefe{\the\dp\mybox}%
\xdef\Breite{\the\wd\mybox}}

\begin{document}
\begin{myenv}[0.5\linewidth]
\blindtext[1]
\end{myenv}

Die Box hat folgende Hoehe: \Hoehe
\par Die Box hat folgende Tiefe: \Tiefe
\par Die Box hat folgende Breite: \Breite

\end{document}


Herbert

Dee
03-05-2009, 07:15
@Marco: Ich möchte nicht den Text in der Minipage zentrieren, sondern die Minipage selbst. Es geht aber, wenn ich das \begin{center} oder das \centering vor das \begin{myenv} schreibe. Es wäre für mich natürlich weniger Schreibarbeit, wenn das Environment das selbst machen könnte.

@Herbert: Eine Benutzung der Box innerhalb der Umgebung ist für mich vollkommen ausreichend.

Woran liegt es denn aber, dass


\newenvironment{myenv}{%
\begin{lrbox}{\mybox}
\minipage{0.5\textwidth}
}{\endminipage\end{lrbox}\usebox\mybox}

die Box darstellt,


\newenvironment{myenv}{%
\lrbox{\mybox}
\minipage{0.5\textwidth}
}{\endminipage\endlrbox\usebox{\mybox}}

aber nicht?

Viele Grüße
Dominik

Dee
03-05-2009, 08:11
So, ich glaub, ich hab's. Hier mein Ergebnis:


\documentclass[ngerman]{article}
\usepackage{babel,blindtext,xcolor,calc}
\newsavebox{\mybox}
\newlength{\BoxHoehe}

\newenvironment{MyBoxEnv}
{
\lrbox{\mybox}
\begin{minipage}{0.5\linewidth}
}
{
\end{minipage}
\endlrbox
}

\newenvironment{MyEnv}
{
\begin{MyBoxEnv}
}
{
\end{MyBoxEnv}
\setlength{\BoxHoehe}{\ht\mybox+\dp\mybox}
\begin{center}
\begin{minipage}{0.5\linewidth}
\color{red}\rule{\linewidth}{\BoxHoehe}
\end{minipage}\\[-\BoxHoehe]
\usebox{\mybox}
\end{center}
}

\begin{document}
\begin{MyEnv}
\blindtext[1]
\end{MyEnv}
\end{document}

Die berechnete Höhe ist zwar nicht ganz exakt (es fehlen ein paar Pixel am Ende), aber da kann ich auch einfach was draufrechnen. :)

Vielen Dank für Eure Hilfe
Dominik