【问题标题】:Any good postscript drawing libraries?有什么好的后记绘图库吗?
【发布时间】:2012-04-18 09:03:50
【问题描述】:

我需要为我的 LaTeX 文档绘制一些图片,并且我发现手工制作的 PostScript 似乎很合适(我想以编程方式做一些事情,需要数学函数等)。我也尝试过 TikZ,但这似乎过于复杂且难以使用。

但是,使用普通的标准 PostScript 有点痛苦,因为实际上没有任何用于绘制形状的标准函数(例如,甚至没有矩形)。

是否有任何 PostScript 库可以包含常见形状的函数并使生活更轻松一些?在我看来这个问题应该是相当普遍的。

或者我应该跳过 PostScript 并转向一些更高级的系统吗?哪一个?

【问题讨论】:

  • PGF/TikZ 恕我直言,它真的很容易使用,并且有很棒的库,让您只需几行就可以创建出色的绘图。

标签: drawing postscript


【解决方案1】:

少数人和许多 PostScript 驱动程序定义了他们自己的一组绘制形状的过程。 PostScript 驱动程序可能会输出以下快捷方式:

/bd{bind def} bind def
/cp{closepath}bd
/gs{gsave}bd
/gr{grestore}bd
/m{moveto}bd
/rm{rmoveto}bd
/l{lineto}bd
/rl(rlineto}bd
/s{stroke}bd
/f{fill}bd
/sf{gs s gr f}bd
/xx{exch}bd

/rect {4 2 roll m 1 index 0 rl 0 xx rl neg 0 rl cp} bd

然后,会像这样绘制一个矩形:

0 0 100 100 rect sf

这种繁琐性确实使 PostScript 特别难以处理。如果您的绘图是以编程/数学方式生成的,MetaPost 可能更合适。 MetaPost 生成封装的 PostScript(您可以将其包含在您的 LaTeX 文档中),但它更适合绘制具有代数定义的图像。

【讨论】:

  • 是的,我已经为形状定义了自己的函数。我只是有一种不好的感觉,我正在重新发明轮子,因为现在必须有数千种不同的矩形实现。有人将自己的功能打包并提供给其他人使用,这是有道理的。感谢 MetaPost 的提示。看起来很有趣,把我带到了 Asymptote,它似乎是 MetaPost 的现代化版本。
【解决方案2】:

我喜欢使用 matplotlib。它可以直接生成 postscript 和 PDF,它是在 python 中的,它还可以做非常复杂的绘图(因此得名)。如果你想直接破解 PostScript,你可以在 LaTeX 中使用 psticks,但是你需要通过 dvi2ps 和 ps2pdf 运行所有东西来制作 PDF。你真的想要 PostScript 或 PDF 吗?我想你想要 PDF,对吧?

【讨论】:

  • 是的,PDF 是我的最终目标。我使用 PostScript 的唯一原因是它很好地结合了绘图和数学。我不确定 matplotlib 是我正在寻找的东西,因为我想做的是绘制仅部分数学生成的数字。我需要用于绘制函数的库可能难以实现的框和箭头以及可能的任意形状?此外,Python 代码往往非常冗长。不过,我也会仔细研究一下 matplotlib。
  • 如果你只需要方框和箭头以及任意形状,你应该使用graphviz并获得自动布局。
  • 我特别需要手动布局。顾名思义,Graphviz 是用于图形的。我想画一般的数字。
【解决方案3】:

好的,我决定Asymptote 是自切片面包以来最好的东西。可以很好地处理图形和任意图形的绘制,并且有大量的扩展模块(如果你关心的话,包括 MetaPost 兼容性)。此外,它使用 LaTeX 排版文本,这非常酷。作为额外的奖励,它甚至可以直接输出到 PDF(或 EPS)。

我仍然觉得有点遗憾,但没有用于好的 PostScript 的好的例程库。

【讨论】:

    【解决方案4】:

    我使用过Asymptote(虽然用于图表),但我发现学习另一种自定义语言很烦人。如果你熟悉 Python,可以试试PyX。它的特征集类似于 Asymptote。例如,它还可以使用 LaTeX 来排版文本/数学。

    另一个选项是 Enthought Enable,但这可能不太适合。

    【讨论】:

      【解决方案5】:

      我在 postscript 中直接构建图像取得了很好的效果。我发现的一个有用的约定是将对象视为字体中的字形。因此,每个对象都希望将当前点设置在左下角,并将当前点留在右下角。您可以将它们放在一个数组中并遍历它:每个对象都将当前点留给下一个对象。

      【讨论】:

        【解决方案6】:

        生成SVG,然后使用iText 和/或Inkscape 以编程方式转换为PDF/PS。我以这种方式构建了一个发布堆栈,效果非常好。

        【讨论】:

          【解决方案7】:
          猜你喜欢
          • 2017-07-01
          • 2010-09-14
          • 1970-01-01
          • 2010-09-05
          • 1970-01-01
          • 1970-01-01
          • 2023-03-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多