
Estou tentando encaixar meu texto em um espaço específico, pois é uma explicação em gráfico. Gostaria de fazer algo como o gráfico abaixo:
É possível fazer com que o texto caiba nesse espaço? LaTex faz isso sozinho? Um pacote ou comando deve ser usado?
Obrigado.
Responder1
RESPOSTA REVISADA (TOTALMENTE AUTOMATIZADA):
Nesta resposta revisada, invoca-se \constraintext
, passando-lhe cinco argumentos:
#1
A altura restrita do texto
#2
a largura restrita do texto
#3
o conteúdo do texto a restringir
#4
uma estimativa maior ou igual à largura natural (sem escala) do conteúdo (escolher muito grande causará apenas algumas iterações extras)
#5
o incremento positivo de comprimento que será subtraído da largura natural a cada iteração, em busca de satisfazer a proporção desejada.
Como mencionado, um tamanho não dimensionado \parbox
é criado (no tamanho da fonte atual) usando a largura natural (input #4
) como largura da caixa. A proporção de aspecto é testada. Se você selecionou #4
grande o suficiente, a proporção ficará abaixo do valor desejado. Em seguida, a caixa não dimensionada fica mais estreita de acordo com um valor fornecido #5
e a proporção é testada novamente. Será crescente em relação ao teste anterior. Este processo é repetido recursivamente até que a proporção testada seja igual ou exceda o valor alvo.
Nesse ponto, a caixa pode ser definida para a altura restrita ( #1
), com a \parbox
largura permanecendo igual ou ligeiramente abaixo da largura restrita. O preenchimento é realizado com \hfill
s correspondentes para tornar a largura da composição igual à largura restrita.
Coloquei notas no MWE sobre o que comentar para remover a impressão de diagnóstico.
\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}
Dois resultados são mostrados abaixo, com fluxos de entrada de tamanhos diferentes, mas ambos configurados para a caixa final do mesmo tamanho (5 pol. x 2,8 pol.). As regras são definidas ao lado e abaixo das caixas para confirmar a precisão dos tamanhos das caixas.
Os diagnósticos são mostrados, fornecendo primeiro a proporção desejada e, em seguida, a proporção a cada iteração. Quando a proporção aumenta repentinamente, isso indica que a caixa tipográfica exigiu uma linha adicional de texto, devido à quebra automática. Quanto mais próxima a proporção final estiver do alvo, menos preenchimento horizontal será necessário para restringir a caixa.
RESPOSTA ORIGINAL (NÃO TOTALMENTE AUTOMATIZADA):
Isso não é totalmente automatizado, mas com um pouco de iteração, dá conta do recado. Digamos que você queira colocar os dois primeiros parágrafos em uma caixa de 12 centímetros de altura por 5 centímetros de largura. Isso resulta em uma proporção de altura/largura de 2,5. Comecei colocando esses parágrafos em um quadro \parbox
e (aqui está a iteração) brincando com a largura da caixa para obter a proporção correta, usando minha \aspect
macro útil (levei cerca de 4 iterações e talvez um minuto para esta fase iterativa).
Depois de obter um resultado de aspecto 2,5+/-épsilon, usei um \scaleto
da scalerel
embalagem para dimensionar a caixa para uma altura de 5 polegadas. A proporção garante que tenha 2 de largura. Mostro a caixa tipográfica original de 10 pontos (\x) e seu companheiro em escala.
\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}
E quanto ao layout de sua imagem de amostra específica, reavaliei essa proporção para 1,75 como meu alvo (resultando em um tamanho de parágrafo de 5" x 20/7") e descobri isso, onde meus \rule
s podem ser substituídos com \includegraphics
. Claro, minha altura de 15 cm é apenas um palpite, mas isso pode ser alterado.
\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 Estou usando o stackengine V2.0, que talvez você ainda não tenha. Até que você consiga atualizar e para que o segundo MWE funcione, basta remover a [oldsyntax]
opção de pacote.
Responder2
\tcolorbox
inclui biblioteca fitting
com seu comando \tcboxfit
. Ele cabe seu conteúdo dentro de uma caixa de determinada largura e altura.
A seguir alguns exemplos:
\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}