如何将文本放入给定大小的框中?

如何将文本放入给定大小的框中?

假设我想将一小段文字排版为徽标/座右铭/口号或其他内容。文本不会比“Lorem Ipsum Dolor”长很多。我希望它能紧密地装进特定尺寸的框中(例如 7x2cm)。这里有两个问题,可能相关:

How can I typeset it so that the text fits a box with certain width? 
Assume fixed typeface size, and only the inter-word and inter-glyph 
distance is allowed to change.

(可能) 更高级的版本:

How can I fit the same text in a box with a given width AND height? 
Possibly also adjusting spacing and typeface size?

为了显示:

原始版本:

修改后的间距,Q1。

修改间距加缩放,Q2。

大小、字体类型等都假定为任意的。我很好奇从概念上如何做到这一点。使用参数化宏进行实验可获得加分。

另外:我知道有很多方法可以在不使用 TeX 和朋友的情况下做到这一点(例如图像、矢量图形等等),但我只对如何使用 TeX 或流行的宏包进行排版感兴趣。

答案1

复制我在 LaTeX 社区网站上给出的答案......

您可以尝试 \resizebox图形包。请参阅其文档第 7 页:

\resizebox{1in}{!}{Some text}

这将给出长度恰好为 1 英寸的“一些文本”。!第二个参数表示根据需要改变高度以保持纵横比。如果这样做,{!}{1in}它将改为 1 英寸高。如果同时指定两个参数,它将不成比例地拉伸,以便它正好是该大小的矩形,依此类推。

答案2

一下子问了这么多问题。我会回答一些简单的问题,把比较棘手的问题留给其他人。

要在给定宽度的框中排版文本,请使用

\makebox[width][s]{lorem ipsum dolor} % latex, or
\hbox to width{lorem ipsum dolor} % plain tex

当然,其中width将被替换为所需的宽度。但它只会拉伸单词之间的空间,而不会拉伸字形之间的空间。后者在标准 TeX 中是不可能的,除非使用一些宏技巧(这可能涉及将文本分开并在字形之间粘贴可拉伸的空间,然后再将其重新组合在一起)。

如果您运行 TeX 引擎(例如 pdftex),其中图形包支持这种调整大小,那么 frabjous(刚刚发布)的答案是好的。否则,一种可能性是测量在标准框中设置的文本,然后计算要放入的框的适当字体大小,然后使用该大小的字体进行排版。但同样,标准 TeX 不允许您在水平和垂直方向上以不同的方式缩放字体。计算需要将一个长度除以另一个长度:我知道的唯一方法需要一点普通的 TeX:将两个长度分配给计数寄存器(将接收缩放点(sp)的长度)并将一个除以另一个。但这会产生一个整数,因此如果您希望更准确,则需要重新缩放。它很快就会参与其中,特别是因为如果过度重新缩放可能会导致溢出。这是一个快速破解,使用一些 latex 的内置临时寄存器:

\documentclass{article}
\makeatletter
\newcommand{\scalehelper}[4][64]{%
  \@tempdima=#3\relax
  \multiply\@tempdima by #1
  \@tempcnta=\@tempdima
  \@tempdimb=#4\relax
  \@tempcntb=\@tempdimb
  \divide\@tempcnta by \@tempcntb
  \multiply#2 by \@tempcnta
  \divide#2 by #1
}
\makeatother
\begin{document}
\newlength{\foo}
\setlength{\foo}{12pt}
\scalehelper[128]{\foo}{80pt}{30pt}
\showthe\foo
\end{document}

理想情况下,的新值\foo应为 32pt;实际上,它是 31.96875pt。如果将可选参数\scalehelper调高,则可以提高精度。如果将其调高太多,则会导致算术溢出。但百分比级的精度应该足以选择合适的字体大小。(您可以通过在指定宽度的框中排版来获得其余部分,让单词之间的空间弥补任何不准确性。)

这只是一个想法。需要组装。不含电池。

答案3

几个 ConTeXt 解决方案:

  • 如果你愿意手动换行,你可以说

    \hbox to 7cm {\stretched{Some Text}}
    

    并尝试各种设置

    \def\stretchedspacefactor{4}
    \def\stretchedspaceamount{.25em}
    \def\stretchedbreaktokens{.@/}
    

    改变字间和词间的间隔量。

  • 如果你想要换行符,并且只对矩形框感兴趣,Wolfgang Schuster 在 ConTeXt 上发布了一个解决方案邮件列表循环遍历字体大小的值,直到高度等于所需高度

  • 如果你还希望在任何位置(而不仅仅是单词边界)出现换行符,ConTeXt维基百科有一个解决方案。

  • 如果你想要非矩形形状并带有换行符,Hans Hagen 发布了解决方案这边走杂志。

答案4

这也许不是直接相关的,但你可以尝试调整我的荒谬解决方案有点类似的问题。不过它只涉及字体大小(和居中,但你可以删除它)。

相关内容