
Ich versuche, meinen Text in einen bestimmten Bereich einzupassen, da es sich um eine Diagrammerklärung handelt. Ich möchte so etwas wie das folgende Diagramm erstellen:
Ist es möglich, den Text in diesen Bereich einzupassen? Macht LaTex das von selbst? Sollte man ein Paket oder einen Befehl verwenden?
Danke schön.
Antwort1
ÜBERARBEITETE ANTWORT (VOLLAUTOMATISIERT):
In dieser überarbeiteten Antwort ruft man auf \constraintext
und übergibt ihm fünf Argumente:
#1
Die eingeschränkte Texthöhe
#2
die eingeschränkte Textbreite
#3
der Textinhalt einzuschränken
#4
eine Schätzung, die größer oder gleich der natürlichen (unskalierten) Breite des Inhalts ist (eine zu große Auswahl führt lediglich zu ein paar zusätzlichen Iterationen)
#5
der positive Längenzuwachs, der bei jeder Iteration von der natürlichen Breite abgezogen wird, um das gewünschte Seitenverhältnis zu erreichen.
Wie angedeutet, \parbox
wird ein nicht skaliertes Feld (in der aktuellen Schriftgröße) erstellt, wobei die natürliche Breite (Eingabe #4
) als Feldbreite verwendet wird. Das Seitenverhältnis wird getestet. Wenn Sie #4
groß genug ausgewählt haben, liegt das Seitenverhältnis unter dem Zielwert. Anschließend wird das nicht skalierte Feld um einen in angegebenen Wert schmaler gemacht #5
und das Seitenverhältnis erneut getestet. Es wird im Vergleich zum vorherigen Test zunehmen. Dieser Vorgang wird rekursiv wiederholt, bis das getestete Seitenverhältnis dem Zielwert entspricht oder ihn überschreitet.
#1
An diesem Punkt kann die Box auf die beschränkte Höhe ( ) eingestellt werden , wobei die \parbox
Breite auf oder knapp unter der beschränkten Breite bleibt. Die Auffüllung erfolgt mit passenden \hfill
s, um die gesetzte Breite gleich der beschränkten Breite zu machen.
Ich habe im MWE Anmerkungen hinterlassen, was kommentiert werden muss, um den Diagnosedruck zu entfernen.
\documentclass{article}
\usepackage{scalerel}
\usepackage{fp}
\usepackage{lipsum}
\usepackage{stackengine}
\newcount\boxheight
\newcount\boxwidth
\newlength\constrainedwidth
\newsavebox\testbox
\newlength\currentwidth
\newcommand\aspect[1]{%
\boxheight=\ht#1\relax%
\boxwidth=\wd#1\relax%
\FPdiv\testaspect{\the\boxheight}{\the\boxwidth}%
\testaspect\\% COMMENT THIS LINE TO REMOVE ASPECT-RATIO PRINTS
}
% TARGET-HEIGHT, TARGET-WIDTH, CONTENT, GUESS>NATURAL-WIDTH, dWIDTH
\newcommand\constraintext[5]{%
\def\svfboxsep{\the\fboxsep}%
\setlength\fboxsep{0pt}%
\setlength\constrainedwidth{#2}%
\sbox\testbox{\rule{#2}{#1}}%
TARGET ASPECT RATIO\\% COMMENT THIS LINE TO REMOVE COMMENT
V\\% COMMENT THIS LINE TO REMOVE COMMENT
\aspect{\testbox}%
\edef\aspectratio{\testaspect}%
\constrainsize{#1}{\aspectratio}{#3}{#4}{#5}%
\setlength\fboxsep{\svfboxsep}%
}
\newcommand\constrainsize[5]{%
\sbox{\testbox}{\fbox{\parbox[b]{#4}{#3}}}%
\aspect{\testbox}%
\FPiflt{\testaspect}{#2}%
\setlength{\currentwidth}{#4}%
\addtolength{\currentwidth}{-#5}%
\constrainsize{#1}{#2}{#3}{\currentwidth}{#5}%
\else
\setlength\constrainedwidth{#1}%
\FPdiv\result{1.0}{#2}%
% CHANGE \framebox TO \makebox TO REMOVE FRAME
\framebox[\result\constrainedwidth]{\hfill%
\scaleto{\parbox[b]{\currentwidth}{#3}}{#1}%
\hfill%
}%
\fi%
}
\parindent 0in
\begin{document}
\constraintext{5in}{2.8in}{\lipsum[1-2]}{3in}{.02in}
\rule[-\fboxsep]{.2ex}{5in}\\
\rule{2.8in}{.2ex}
\clearpage
\constraintext{5in}{2.8in}{\lipsum[3]}{2.25in}{.02in}
\rule[-\fboxsep]{.2ex}{5in}\\
\rule{2.8in}{.2ex}
\end{document}
Unten werden zwei Ergebnisse mit unterschiedlich großen Eingabeströmen angezeigt, die jedoch beide auf die gleiche Größe (5 x 2,8 Zoll) der endgültigen Box eingestellt sind. Neben und unter den Boxen sind Regeln festgelegt, um die Genauigkeit der Boxgrößen zu bestätigen.
Es werden Diagnosen angezeigt, die zuerst das Zielseitenverhältnis und dann das Seitenverhältnis bei jeder Iteration angeben. Wenn das Seitenverhältnis plötzlich springt, bedeutet dies, dass das gesetzte Feld aufgrund des Umbruchs eine zusätzliche Textzeile benötigt. Je näher das endgültige Seitenverhältnis am Ziel liegt, desto weniger horizontale Polsterung ist erforderlich, um das Feld einzuschränken.
URSPRÜNGLICHE ANTWORT (NICHT VOLLAUTOMATISIERT):
Dies ist nicht vollständig automatisiert, aber mit ein paar Iterationen ist die Aufgabe erledigt. Angenommen, Sie möchten die ersten beiden Lipsum-Absätze in eine Box mit den Maßen 5 Zoll hoch und 2 Zoll breit setzen. Das ergibt ein Seitenverhältnis von Höhe zu Breite von 2,5. Ich habe damit begonnen, diese Absätze in einen Rahmen zu setzen \parbox
und (hier ist die Iteration) mit der Breite der Box zu spielen, um das richtige Seitenverhältnis zu erreichen, indem ich mein praktisches \aspect
Makro verwendet habe (ich habe ungefähr 4 Iterationen und vielleicht eine Minute für diese iterative Phase benötigt).
Nachdem ich ein Ergebnis von 2,5+/-Epsilon erreicht hatte, habe ich dann ein \scaleto
aus dem scalerel
Paket verwendet, um die Box auf eine Höhe von 5 Zoll zu skalieren. Das Seitenverhältnis garantiert eine Breite von 2 Zoll. Ich zeige die ursprüngliche 10pt-Schriftbox (\x) und ihr skaliertes Gegenstück.
\documentclass{article}
\usepackage{scalerel}
\usepackage{fp}
\usepackage{lipsum}
\newcount\boxheight
\newcount\boxwidth
\newcommand\aspect[1]{%
\boxheight=\ht#1\relax%
\boxwidth=\wd#1\relax%
\FPdiv\result{\the\boxheight}{\the\boxwidth}\result%
}
\begin{document}
\newsavebox\x
\sbox{\x}{\fbox{\parbox[b]{2.42in}{\lipsum[1-2]}}}
\aspect{\x}
\usebox{\x}
\scaleto{\usebox{\x}}{5in}
\end{document}
Und was das Layout Ihres speziellen Beispielbilds betrifft, habe ich dieses Seitenverhältnis auf 1,75 als Ziel neu bewertet (was zu einer Absatzgröße von 5 x 20/7 Zoll führt) und bin zu folgendem Ergebnis gekommen, bei dem mein \rule
s durch ersetzt werden kann \includegraphics
. Natürlich ist meine Höhe von 5 Zoll nur eine Schätzung, aber das ist veränderbar.
\documentclass{article}
\usepackage{scalerel}
\usepackage{fp}
\usepackage{lipsum}
\usepackage[oldsyntax]{stackengine}
\newcount\boxheight
\newcount\boxwidth
\newcommand\aspect[1]{%
\boxheight=\ht#1\relax%
\boxwidth=\wd#1\relax%
\FPdiv\result{\the\boxheight}{\the\boxwidth}\result%
}
\begin{document}
\newsavebox\x
\sbox{\x}{\fbox{\parbox[b]{2.84in}{\lipsum[1-2]}}}
%\aspect{\x}
\def\hgp{\hspace{.1in}}
\def\plotA{\protect\rule{1.36in}{0.66in}}
\def\plotB{\protect\rule{1.36in}{1.36in}}
\def\plotC{\protect\rule{1.36in}{1.36in}}
\def\plotD{\protect\rule{1.36in}{1.36in}}
\def\plotE{\protect\rule{1.36in}{1.36in}}
\def\plotF{\protect\rule{1.36in}{1.36in}\hgp}
\def\plotG{\protect\rule{1.36in}{1.36in}}
\def\stackalignment{l}
\Sstackgap=.1in
\Shortstack{{\plotA} {\plotB} {\plotC} {\plotD} {\plotE}}\hgp%
\stackon{\plotF \plotG}{\scaleto{\usebox{\x}}{5in}}
\end{document}
PS: Ich verwende Stackengine V2.0, das Sie möglicherweise noch nicht haben. Bis Sie ein Upgrade durchführen können und um das 2. MWE zum Laufen zu bringen, entfernen Sie einfach die [oldsyntax]
Paketoption.
Antwort2
\tcolorbox
schließt die Bibliothek fitting
mit ihrem Befehl ein \tcboxfit
. Der Inhalt wird in eine Box mit vorgegebener Breite und Höhe eingefügt.
Nachfolgend einige Beispiele:
\documentclass{article}
\usepackage[most]{tcolorbox}
\usepackage{lipsum}
\usepackage{lmodern}
\tcbset{colframe=blue!50!black,colback=green!10!white,
boxsep=0pt,top=1mm,bottom=1mm,left=1mm,right=1mm,
nobeforeafter, arc=0pt, outer arc=0pt}
\begin{document}
\lipsum[1]
\noindent\tcboxfit[width=.5\linewidth,height=6cm]{\lipsum[1]}
\hfill
\tcboxfit[width=.45\linewidth, height=4cm]{\lipsum[1]}
\noindent\tcboxfit[width=\linewidth, height=2cm]{\lipsum[1]}
\end{document}