【问题标题】:Using symbol font / math notation in graphviz在 graphviz 中使用符号字体/数学符号
【发布时间】:2025-11-28 01:55:02
【问题描述】:

[环境:graphviz 2.38 / Windows 7]

使用dot,我想生成如下所示的路径图来表示结构方程模型(好吧,这里只是一个简单的单因素测量模型)。我想对一些节点和边使用希腊字母,如果我可以在点文件中使用类似 LaTeX 的符号,如\ksi\lambda_1\delta_1

,我会更喜欢

这个图应该代表三个方程

\begin{eqnarray*}
x_{1i} & = & \lambda_1 \xi_{i} + \delta_{1i} \\
x_{2i} & = & \lambda_2 \xi_{i} + \delta_{2i} \\
x_{3i} & = & \lambda_3 \xi_{i} + \delta_{3i} 
\end{eqnarray*}

我最接近的是以下 .dot 文件 kludge,我在其中 选择 font="Symbol" 并将希腊字母替换为对应的罗马字母。

但是,这不适用于 dot -Tpdf 或 AFAICS 任何其他设备 比 Postscript dot -Tps,给我一个 .eps 文件,我必须转换为 PDF 或 PNG。

问题:这种情况有什么更好的办法吗?

digraph threevar {
  rankdir=LR;
  size="8,4";
  node [fontname="Helvetica" fontsize=14 shape=box];
  edge [fontname="Symbol" fontsize=10];
  center=1;
  {rank=min k }
  {rank=same X1 X2 X3 }
  {rank=max z1 z2 z3 }
  z1 [shape=circle fontname="Symbol" label="d1"];
  z2 [shape=circle fontname="Symbol" label="d2"];
  z3 [shape=circle fontname="Symbol" label="d3"];
  k [fontname="Symbol" label="x" shape="ellipse"];
  k -> X1 [label="l1"];
  k -> X2 [label="l2"];
  k -> X3 [label="l3"];
  z1 -> X1;
  z2 -> X2;
  z3 -> X3;
}

【问题讨论】:

  • 愚蠢的问题:为什么不直接将 δ₁、δ₂ 等写为文字文本,并使用 utf8 编码保存文件?希腊语和下标 0 到 9 在 Unicode 中都可用于无限下标标签,因此不要使用 (Xe)(La)TeX 表示法,而是尝试直接使用 δ₁、δ₂、δ₃、λ₁、λ₂ 和 λ₃,然后查看如果 dot 接受这些?
  • 我希望有一种我在某处错过的简单直接的方法;此外,Unicode 字符很难输入。
  • “直接使用你想看的文字”是最简单的,但是如果你不使用任何东西来创造你的生活,“输入的痛苦”部分是真的更轻松。在 Windows 上,我使用免费的babelstone.co.uk/Software/BabelMap.html 几乎可以立即找到我需要但无法输入的任何字符。多亏了它,我多年来一直没有输入疼痛。
  • 感谢您的指点 --- 我尝试了其他一些字符映射应用程序,但 BabelMap 更有用。

标签: math fonts graphviz dot


【解决方案1】:

好的,直接在 .dot 文件中使用 UTF8 字符,我现在可以避免符号字体 kludge(但我尝试了下标,例如下标一, x2081 只是有一个包含 '2081' 的小盒子)

这是修改后的文件,现在可以同时使用 -Tpdf-Tpng。 (UTF8 字符在这篇文章中没有正确显示。)

    digraph threevar {
      rankdir=LR;
      size="8,4";
      node [fontsize=14 shape=box];
      edge [fontsize=10];
      center=1;
      {rank=min k }
      {rank=same X1 X2 X3 }
      {rank=max z1 z2 z3 }
      z1 [shape=circle label="d1"];
      z2 [shape=circle label="d2"];
      z3 [shape=circle label="d3"];
      k [label="?" shape="ellipse"];
      k -> X1 [label="?1"];
      k -> X2 [label="?2"];
      k -> X3 [label="?3"];
      z1 -> X1;
      z2 -> X2;
      z3 -> X3;
    }

结果是:

【讨论】:

    最近更新 更多