有没有办法创建一个具有固定宽度和高度的框?我尝试了\parbox
一些类似的东西,但有时文本会溢出。
如果插入的文本溢出:应调整其大小以适应文本,或对其进行裁剪(并发出警告)。这些方法可行吗?
我们可以假设插入的文本是一个连续的段落。
有关的:游戏/扑克牌包装(不仅仅是扑克)
答案1
您可以使用包fitting
的库tcolorbox
。它提供了一个名为的宏\tcboxfit
,可使内容的字体大小与框的尺寸相匹配。或者,选项fit
也tcolorbox
可以达到同样的效果。
请注意,所使用的字体必须能够调整为所有尺寸(矢量字体)才能实现正确的调整大小。
第一个例子显示了一个有框架的框(可以以多种方式调整),第二个例子显示了一个没有框架的框(红色边框只是为了显示大小),第三个例子显示了一个有标题和固定高度的框。
\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}
答案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}
下面是一个类似的例子,使用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
定义警告阈值。
\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}
感谢答案。