将文本插入到固定大小的框中

将文本插入到固定大小的框中

有没有办法创建一个具有固定宽度和高度的框?我尝试了\parbox一些类似的东西,但有时文本会溢出。

如果插入的文本溢出:应调整其大小以适应文本,或对其进行裁剪(并发出警告)。这些方法可行吗?

我们可以假设插入的文本是一个连续的段落。

有关的:游戏/扑克牌包装(不仅仅是扑克)

答案1

您可以使用包fitting的库tcolorbox。它提供了一个名为的宏\tcboxfit,可使内容的字体大小与框的尺寸相匹配。或者,选项fittcolorbox可以达到同样的效果。

请注意,所使用的字体必须能够调整为所有尺寸(矢量字体)才能实现正确的调整大小。

第一个例子显示了一个有框架的框(可以以多种方式调整),第二个例子显示了一个没有框架的框(红色边框只是为了显示大小),第三个例子显示了一个有标题和固定高度的框。

\documentclass[a4paper]{article}
\usepackage[many]{tcolorbox}
\usepackage{lmodern}% or any other vector / postscript font
\usepackage{lipsum}
\begin{document}

\tcboxfit[width=6cm,height=6cm,nobeforeafter,
  before=\noindent]{\lipsum[1]}
%
%
\begin{tcolorbox}[fit,width=6cm,height=6cm,blank,
  borderline={0.4pt}{0pt}{red!20!white},
  watermark text={6cm $\times$ 6cm},nobeforeafter]
\lipsum[1]
\end{tcolorbox}

\bigskip

\tcboxfit[height=6cm,title={This box has a height of 6cm},
  colback=blue!5!white,colframe=blue!30!black,
  before=\noindent]{\lipsum[1]}

\end{document}

enter image description here

答案2

使用tikz或者pstricks您可以剪辑图形的一部分。

下面是一个使用的示例tikz

\documentclass{article}
\usepackage[margin=0.5in]{geometry}
\usepackage{tikz}
\usetikzlibrary{calc}
\pagestyle{empty}
\usepackage{lipsum}
\begin{document}

\fbox{\begin{minipage}[t][4in]{3in}
  \lipsum[1-3]
\end{minipage}}
%%
\hspace*{\fill}vs.\hspace*{\fill}
%%
\begin{tikzpicture}[baseline=(myparbox.base)]
  \node (A) at (0,0)      {};
  \node (B) at (3in,4in)  {};

  %\draw ($(A)-(2pt,2pt)$) rectangle ($(B)+(2pt,2pt)$);
  \clip ($(A)-(2pt,2pt)$) rectangle ($(B)+(2pt,2pt)$);

  \node[below right,
        inner sep=0pt,
        outer sep=0pt,
        text width=+3in,
        align=justify] (myparbox) at (A|-B) 
    {\lipsum[1-3]};
\end{tikzpicture}

\end{document}

enter image description here

下面是一个类似的例子,使用pstricks

\documentclass{article}
\usepackage[margin=0.5in]{geometry}
\usepackage{pstricks,pst-node}
\usepackage{lipsum}
\begin{document}

\fbox{\begin{minipage}[t][4in]{3in}
  \lipsum[1-3]
\end{minipage}}
%%
\hspace*{\fill}vs.\hspace*{\fill}
%%
\begin{psclip}{\psline[linestyle=none](0,3ex)(3in,3ex)(3in,-\dimexpr4in-1ex\relax)(0,-\dimexpr4in-1ex\relax)}
  \begin{minipage}[t]{3in}
    \lipsum[1-3]
   \end{minipage}
\end{psclip}

\end{document}

答案3

我已经做出了自己的解决方案,没有进行迭代。仍然可以通过一些迭代或类似方法进行改进。epsilon用于调整,并\fitfuzz定义警告阈值。

enter image description here

\documentclass{article}

\usepackage[latin]{babel} % demo only: for hyphenation in lipsum
\usepackage{lipsum} % demo only
\usepackage[demo]{graphicx}
\usepackage{lmodern}
\usepackage[nomessages]{fp}

\newsavebox{\mybox}
\newlength{\actheight}
\newlength{\prefwidth}
\newlength{\prefheight}

\def\fitfuzz{1000} % hundredth of a percent

\newlength{\scaleepsilon}
\setlength{\scaleepsilon}{0pt}

\makeatletter
\def\fitbox#1#2#3{%
\setlength{\prefwidth@fitbox}{#1}%
\setlength{\prefheight@fitbox}{#2}%
\sbox{\mybox@fitbox}{\hbadness=10000\parbox[b]{\prefwidth@fitbox}{#3}}%
\setlength{\actheight@fitbox}{\the\dimexpr\ht\mybox@fitbox+\dp\mybox@fitbox}%
\edef\valueA{\strip@pt\prefwidth@fitbox}%
\edef\valueB{\strip@pt\prefheight@fitbox}%
\edef\valueBx{\strip@pt\actheight@fitbox}%
\edef\valueE{\strip@pt\scaleepsilon@fitbox}%
\FPeval\valueAx{pow(0.5,\valueBx*\valueA*\valueA/\valueB)+\valueE}%
\sbox{\mybox@fitbox}{\hbadness=10000\parbox{\valueAx pt}{#3}}%
\setlength{\actheight@fitbox}{\the\dimexpr\ht\mybox@fitbox+\dp\mybox@fitbox}%
\edef\valueBx{\strip@pt\actheight@fitbox}%
\FPeval\badness{round(10000*abs(1-\valueBx/\valueAx/\valueB*\valueA):0)}%
\FPifgt{\badness}{\fitfuzz}%
    \@latex@warning{Notably inaccurate fitting (badness \badness)}%
\fi%
\resizebox{\prefwidth@fitbox}{\prefheight@fitbox}{\parbox[b]{\valueAx pt}{#3}}%
}
\makeatother

\begin{document}

\fitbox{3cm}{5cm}{\lipsum[1]}\includegraphics[width=3cm, height=5cm]{}

\includegraphics[width=3cm, height=5cm]{}

\fitbox{4cm}{3cm}{\lipsum[2]}\includegraphics[width=4cm, height=3cm]{}

\includegraphics[width=4cm, height=3cm]{}

\end{document}

感谢答案

相关内容