这:
\fbox{\makebox[3cm][l]{long text long text long text long text}}
结果是:
我希望它正好停在框的末尾。不换行。这样就看不到“太多”的文本了。
答案1
\documentclass{article}
\usepackage[fit,breakall]{truncate}
\begin{document}
\fbox{\truncate[]{3cm}{long text long text long text long text}}
\end{document}
阅读文档以了解选项。
答案2
这是一个使用在规定长度内尽可能多的文本的解决方案;*-form 只框住适合的文本,而正常形式无论如何都会使用规定的长度。
\documentclass{article}
\usepackage{xparse}
\NewDocumentCommand{\restrict}{smm}{% #2 is a length, #3 is the text
\setbox0=\vbox{\hsize=#2\relax\raggedright#3\par
\setbox2=\lastbox\unskip\unpenalty
\loop
\setbox4=\box2
\setbox2=\lastbox\unskip\unpenalty
\unless\ifvoid2
\repeat
\global\setbox1=\box4
}% end of the \vbox
\fbox{\IfBooleanTF{#1}{\unhbox}{\box}1}%
}
\begin{document}
\restrict{3cm}{A long text that should be cut at 3cm at most}
\restrict*{3cm}{A long text that should be cut at 3cm at most}
\restrict{3cm}{A long text that is cut at 3cm at most}
\restrict*{3cm}{A long text that is cut at 3cm at most}
\end{document}
这个想法是,以规定的长度作为线宽来撰写一个段落,然后拆除生成的框,直到得到最终排版的第一行。
答案3
我的解决方案与 egreg 的解决方案类似,但不需要,\loop
因为我们只有两行内部段落。行由设置\parshape
。第一行具有给定宽度,第二行(如果存在)具有\maxdimen
宽度。
\def\restrict#1#2{\setbox0=\vbox{\parshape 2 0pt #1 0pt \maxdimen
\rightskip=0pt plus1fil\noindent#2\par
\setbox0=\lastbox \unskip\unpenalty \global\setbox2=\lastbox}%
\ifvoid2 #2\else \leavevmode\unhbox2 \unskip \fi
}
test: \restrict{3cm}{A long text that should be cut at 3cm at most}
限制文字周围的边框不在这里明确打印。您可以使用其他工具来完成。