Haskell 图表:为什么文本没有长度或宽度?

Haskell Diagrams: Why does text not have length or width?

我想创建一个可以设置为具有特定宽度和高度的文本框。但是,我创建的文本框一开始似乎没有宽度和高度。例如。以下代码:

main = do
  putStrLn $ show $ width $ myText
  putStrLn $ show $ height $ myText
  mainWith myText

myText :: Diagram B
myText = text "here" # lw 1 # fontSizeL 0.2 # fc grey # scaleX 1

生成一个空白图表(没有文本),并打印“0.0”作为文本框的宽度和高度:

ghc --make Main.hs && ./Main -o circle.svg -w 400
[1 of 1] Compiling Main             ( Main.hs, Main.o )
Linking Main ...
0.0
0.0

为了让文本显示出来,我似乎需要将它放在其他东西之上。例如。以下代码:

main = do
  putStrLn $ show $ width $ myDiagram 
  putStrLn $ show $ height $ myDiagram
  mainWith myDiagram

myDiagram :: Diagram B
myDiagram = myText <> myBackground

myText :: Diagram B
myText = text "here" # lw 1 # fontSizeL 0.2 # fc grey # scaleX 1

myBackground :: Diagram B
myBackground = rect 1 1 # fc black

按预期在黑色背景中生成灰色文本。


为什么文本框没有大小?

如何将文本框的长度和宽度设置为特定值?

Why does the text box not have a size?

因为文本处理不仅高度依赖于用于呈现图表的后端(参见 the User's Guide),而且还可能依赖于用于 运行程序。

How can I set the length and width of a text box to a certain value?

  1. 使用您选择的后端提供的文本处理函数(如果存在)。例如,diagrams-cairo 提供 functions 使用 Pango 自行呈现文本,尽管它们的显着烦恼是 IO 函数,因为它们需要从系统查询字体信息。

  2. 使用SVGFonts 独立于后端对文本进行描边。这种方法也有一些不便之处(字体选择有限,除非您按照文档中的说明自己将所选字体转换为 SVGFonts 格式;具有大量字符的字体可能会导致小但明显的延迟首先由您的程序使用,因为它们必须经过初始处理),但至少您不必为 IO 或后端特定的怪癖而烦恼。