Math 字体大小调整的数学逻辑

Math 字体大小调整的数学逻辑,math,resize,Math,Resize,我有一个蓝色的容器,它是我文本的画布。我要做的是调整字体大小,使整个文本尽可能多地填充蓝色容器 我可以访问文本内容的高度,即段落和段落之间的线条。此外,我还有蓝色容器的高度、每行的高度、行数和字数 我尝试使用基于默认字体大小的行高和行数来确定需要增加多少字体才能填充蓝色容器。然而,这样做也会改变线条的数量,在让我头晕目眩的同时破坏我成功的机会 我应该使用什么公式来填充蓝色容器中的字体大小 这是我的电话号码: Content height: 342.46 Content/Container Wi

我有一个蓝色的容器,它是我文本的画布。我要做的是调整字体大小,使整个文本尽可能多地填充蓝色容器

我可以访问文本内容的高度,即段落和段落之间的线条。此外,我还有蓝色容器的高度、每行的高度、行数和字数

我尝试使用基于默认字体大小的行高和行数来确定需要增加多少字体才能填充蓝色容器。然而,这样做也会改变线条的数量,在让我头晕目眩的同时破坏我成功的机会

我应该使用什么公式来填充蓝色容器中的字体大小

这是我的电话号码:

Content height:  342.46
Content/Container Width:  400
Font Size:  11
Line Height:  11 * 1.2 //120% of the font size gives the line height
Number of Lines:  24
Number of Words:  2055
此外,文本内容可能很长,并且可以扩展到容器之外,因此理想情况下,我尝试实现的是增加或减少字体大小的公式(或建议)


如果你能使用固定宽度的字体,事情就会简单得多。然后,像紧排、不同字符宽度等因素消失了

假设您不能(或不会)使用单间距字体,那么问题看起来很像复制浏览器所做的渲染,或者打印机驱动程序的“打印预览”功能。你可以研究一下这种方法

一个应该足够好的快速而肮脏的方案可能是:

  • 在文本末尾追加一个

  • 测量相对于集装箱高度(
    ContainerHeight
    )的跨度偏移量(
    SpanOffset

  • 将字体大小(
    FS
    )设置为:
    FS*=ContainerHeight/SpanOffset

  • 测量新的
    SpanOffset

  • 如果
    SpanOffset
    仍然小于
    ContainerHeight
    ,则在循环中增加
    FS
    一个小增量,直到
    SpanOffset
    刚刚离开容器,然后备份1个增量

  • 同样,如果
    SpanOffset
    ContainerHeight
    之外,则在循环中减少
    FS
    一个微小的增量,直到
    SpanOffset
    刚刚进入容器


  • 如果你能使用固定宽度的字体,事情就会简单得多。然后,像紧排、不同字符宽度等因素消失了

    假设您不能(或不会)使用单间距字体,那么问题看起来很像复制浏览器所做的渲染,或者打印机驱动程序的“打印预览”功能。你可以研究一下这种方法

    一个应该足够好的快速而肮脏的方案可能是:

  • 在文本末尾追加一个

  • 测量相对于集装箱高度(
    ContainerHeight
    )的跨度偏移量(
    SpanOffset

  • 将字体大小(
    FS
    )设置为:
    FS*=ContainerHeight/SpanOffset

  • 测量新的
    SpanOffset

  • 如果
    SpanOffset
    仍然小于
    ContainerHeight
    ,则在循环中增加
    FS
    一个小增量,直到
    SpanOffset
    刚刚离开容器,然后备份1个增量

  • 同样,如果
    SpanOffset
    ContainerHeight
    之外,则在循环中减少
    FS
    一个微小的增量,直到
    SpanOffset
    刚刚进入容器


  • 我认为这个问题没有完美的解决办法

    基本上,每行和每段末尾的“浪费”空间量在很大程度上取决于所讨论的文本。字符宽度和紧排平均会导致微小的差异(但在最坏的情况下会导致较大的差异)

    所以你必须通过一些启发。如果可能,让软件“猜测”字体大小,测试文本是否合适(如何操作取决于您使用的语言/API),如果不合适,则稍微向上或向下调整

    这里有一个可能的启发:

    #numBreaks is the number of line breaks in the text
    #numChars is the number of chars (excluding breaks) in the text
    #avgCharWidth and lineHeight (pixels) are derived from font size
    
    #avgWrapWidth is the width of the container minus a bit to
    #account for the wasted space on the right. I would suggest:
    #avgWrapWidth = realWidth - avgCharWidth * 6
    
    totalLength = numChars * avgCharWidth
    numLines = totalLength / avgWrapWidth + numBreaks
    textHeight = numLines * lineHeight
    

    textHeight是文本在包装到容器中时预期的高度(以像素为单位)。您可以对字体大小进行二进制搜索,以找到具有最佳估计高度的字体。

    我认为没有完美的解决方案

    基本上,每行和每段末尾的“浪费”空间量在很大程度上取决于所讨论的文本。字符宽度和紧排平均会导致微小的差异(但在最坏的情况下会导致较大的差异)

    所以你必须通过一些启发。如果可能,让软件“猜测”字体大小,测试文本是否合适(如何操作取决于您使用的语言/API),如果不合适,则稍微向上或向下调整

    这里有一个可能的启发:

    #numBreaks is the number of line breaks in the text
    #numChars is the number of chars (excluding breaks) in the text
    #avgCharWidth and lineHeight (pixels) are derived from font size
    
    #avgWrapWidth is the width of the container minus a bit to
    #account for the wasted space on the right. I would suggest:
    #avgWrapWidth = realWidth - avgCharWidth * 6
    
    totalLength = numChars * avgCharWidth
    numLines = totalLength / avgWrapWidth + numBreaks
    textHeight = numLines * lineHeight
    

    textHeight是文本在包装到容器中时预期的高度(以像素为单位)。您可以对字体大小进行二进制搜索,以找到具有最佳估计高度的字体。

    这实际上是一个相当困难的问题,因为行会在单词边界处断开,单词长度也会发生变化,字符大小也会发生变化。另外,可以有任意数量的显式换行符。所以要正确地做这件事需要考虑到文本的很多细节,一般的解析解会,嗯,相当复杂

    (在“真实”排版中,也有一些技巧可以通过调整字母和单词间距来稍微调整版面,以便在保持良好外观的同时使内容适合,但我们肯定不会在这里讨论。)

    但是,让我们把精确性放在一边,而不是考虑一个简化模型,它可以帮助你进入正确的轨道。

    可用区域为
    width*height
    。给定一段长度为给定
    的文本,我们希望确定合适的
    字体大小
    
    textArea = A * fontsize * length * B * fontsize
        = A * B * length * fontsize ^ 2
    
    fontsize <= sqrt(width * height/(A * B * length))
    
    def findsize:
        maxsize=100pt
        minsize=8pt
        epsilon=0.5pt
        while (maxsize-minsize>epsilon):
            triedsize=(maxsize+minsize)/2
            setfontsize(triedsize)
            if boxisoverfull():
                maxsize=triedsize
            else:
                minsize=triedsize
        return minsize