假设我想将一小段文字排版为徽标/座右铭/口号或其他内容。文本不会比“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
这也许不是直接相关的,但你可以尝试调整我的荒谬解决方案有点类似的问题。不过它只涉及字体大小(和居中,但你可以删除它)。