使用 SVG 而不是 PNG 或 EPS

使用 SVG 而不是 PNG 或 EPS

请帮助我在 LyX 文档中嵌入 plantUML 图。

我是 LyX 的新手,我不知道如何在将文档转换为 PDF 时动态生成图表。

让我高层次地写下我想要实现的目标。

  1. 添加文件格式.plantuml
  2. 添加此文件格式的转换器,将其转换.plantuml为 PNG
  3. 将该文件包含.plantuml在主 LyX 文档中。
  4. 当我运行导出到 PDF 时,我应该看到 PDF 文件中包含的图像。

请指导我如何实现这一点。

答案1

我正在写一个单独的答案,因为在将 PlantUML 转换为 PDF 时,很多因素最终都很重要:

使用 SVG 而不是 PNG 或 EPS

SVG 作为中间格式比 PNG 和 EPS 更具优势。PDF 可以包含 PlantUML 图中原始的文本元素(例如,类名、方法、注释等),这对于在 PDF 中进行搜索、索引、复制等非常有用。使用 PNG 不仅会丢失清晰度(它是光栅而不是矢量),还会丢失文本信息。尽管 EPS 是矢量,但我在 PDF 中使用 LyX 中的 EPS 的经验是,我会丢失文本,因为它似乎被转换为轮廓。

然而,SVG 在 LyX 中也并非没有麻烦。Inkscape必须正确安装并通过 LyX 可见。LyX可能会或可能不会这样做,具体取决于平台。验证它的一个好方法是在 LyX 中运行“重新配置”命令并查看“消息”窗口。您应该看到它在它正在寻找的环境列表中找到了 inkscape。如果 LyX 找不到它,请确保您已将 inkscape 可执行文件添加到 LyX 首选项中的路径中。在我的 Windows 8.1 系统上,它不是默认安装的。

我发现 SVG 的另一个问题(至少在 Windows 中)是字体映射。在我的 Windows 8.1 PC 上,PlantUML 默认使用在 Inkscape 中显示为“sans-serif”的字体生成 SVG 文件。Inkscape 用于“sans-serif”的字体看起来像 Lucida 或可能是 MS Sans Serif,实际上更宽的比 PlantUML 在生成 SVG 之前用于布局图表的那个要宽。这会导致 SVG(以及之后的 PDF)中的文本太宽,例如:

在此处输入图片描述

我发现的一个解决方案是在我的 PlantUML 图中指定字体,如下所示:

@startuml
skinparam defaultFontName Arial Unicode MS
...
@enduml

这样,PlantUMLInkscape 使用相同的特定字体,布局没有错误。但是,这种策略的一个警告是字体依赖于系统。这意味着Arial Unicode MS我的 Windows 8.1 机器上安装了一种字体,上面的 PlantUML 语句可能无法在 Linux 系统或 MacOS 上使用。PlantUML 网站的建议最后是:

请注意,字体名称高度依赖于系统,因此如果您追求可移植性,请不要过度使用它。Helvetica 和 Courier 应该适用于所有系统。

PlantUML 的一个很酷的功能是listfonts声明。将它作为 PlantUML 文件的第一行@startuml,您将获得 PlantUML 可以找到的所有字体的列表。

可能有一个更好的解决方案,即告诉 Inkscape 如何将“sans-serif”映射到 PlantUML 默认使用的适当字体(例如 Arial)。但我找不到那个答案。这可能是 Windows Inkscape 的一个错误;可能是缺少的功能。我想我在 Windows 7 下没有遇到这个问题,也许是因为默认字体和 Inkscape 选择“sans-serif”等效字体的方式。我的 Windows 8.1 机器有一个名为的字体8514fix8514oem类似于 Lucida Sans,并且位于字体列表的顶部。我猜 Inkscape 正在选择一种字体作为“sans-serif”的等效字体,但 PlantUML 正在使用另一种字体。您的里程可能会有所不同。请参阅获取更多提示。

为 PlantUML -> SVG -> PDF 配置 LyX

如果您激活 PlantUML -> PNG 和/或 PlantUML -> EPS,当您生成 PDF 文件时,LyX 可能会使用其中一种中间格式,这意味着您将在 PDF 转换中失去图表的保真度。

因此,我仅有的启用了 LyX 内部的 PlantUML -> SVG 转换器。这意味着我删除了 Rajender 的回答中提到的 PlantUML -> PNG 和 PlantUML -> EPS 转换器。我使用的单个 PlantUML -> SVG 转换器如下所示:

LyX 中的 PlantUML 到 SVG 转换器

注意命令如下:

plantuml.bat -tsvg -charset UTF-8 $$i $$o
  • plantuml.bat是批处理文件Rajender 描述
  • -tsvg告诉 PlantUML 转换为 SVG
  • -charset UTF-8如果您在源文件中使用外语字符(重音符号等),则在 Windows 下这一点很重要.plantuml,尤其是当您与其他系统上的人员共享它时。Windows PlantUML 中的默认编码不是 UTF-8。

要将 SVG 转换为 PDF,LyX 在其上述的“重新配置”命令期间找到 inkscape 时应该会自动安装一个转换器。但请验证以下设置。如果未安装 inkscape,您将收到各种奇怪的错误,并且 LyX 将尝试将 SVG 转换为.ppm(至少在我的 Windows 8.1 系统上,情况就是这样)。

LyX 中的 SVG 到 PDF 转换器

使用 Inkscape 的 SVG -> PDF 转换命令如下。非常简单:

inkscape --file=$$i --export-area-drawing --without-gui --export-pdf=$$o

结果

这是最终结果,其中保存了以下 PlantUML 代码UseCase.plantuml并将其插入到 LyX 文档中,方法是使用“插入”>“图形”:

@startuml
skinparam style strictuml
skinparam handwritten true
' the font below is installed on Windows, may not work on other systems
skinparam defaultFontName Segoe Print
left to right direction
skinparam packageStyle rect
actor Customer as C
actor "Credit\nAuthorization\nService" as CA
rectangle "Bike Rental System" {
  (Process\nMembership) as (PM)
  (Borrow Bike) as (BB)
  (Return Bike) as (RB)
  (Request\nExtension) as (RE)
  (Request New\nAccess Code) as (NC)
  C -- (PM)
  PM -- CA
  C -- (BB)
  C -- (RB)
  C -- (RE)
  C -- (NC)
}
@enduml

这是它在 Adob​​e Acrobat 中的样子。请注意,PlantUML 文本是 PDF 文本(参见选择):

在此处输入图片描述

查看 PlantUML 错误(在 Windows 中)

我按照 Rajender 的出色解释,在 LyX 中制作适用于 Windows 的批处理文件以转换 PlantUML 文件。有一个麻烦的问题:如果您的 PlantUML 文件中有语法错误,转换将失败,并且 LyX 只会抱怨Error converting to loadable format.

我在 Windows 中找到的解决方案是:

  • 启用 PlantUML -> PNG 转换器(如上所述)。语法错误仅出现在 .PNG 图像中,而不出现在 .SVG 中。
  • 防止PlantUML.bat文件返回失败(因此 LyX 认为转换已成功完成)。这可以通过添加几行代码来捕获%ERRORLEVEL%

    java -jar "%~dp0plantuml.jar" %*
    set exitcode = %ERRORLEVEL%
    echo %exitcode%
    

实际上,您可能只需在命令echo "hello"后面放置java即可使 .bat 文件始终成功。

因此,PNG 中会出现如下错误:

LyX 中 PNG 图像内的 PlantUML 错误

答案2

这是我从 Rainer 那里获得的信息,在他的帮助下我能够显示包含的 .plantuml 文件。

帮助使用 plantUML 配置 lyx

步骤摘要如下:

  • 安装 PlantUML (及其所需的 GraphViz)
  • 创建脚本(例如plantuml.bat在 Windows 上),以便 PlantUML 可以从命令行运行以创建 SVG 文件。通过手动测试确保其正常工作,因为 LyX 不会轻易发现任何问题。
  • 确保 LyX 的 PATH 设置中包含上一步中脚本的目录,在 LyX 中配置 PATH 以查找 PlantUML 命令脚本
  • 设置 LyX 以识别 PlantUML 文本文件 (.plantuml) 作为新格式,在 LyX 中配置 PlantUML 文件格式
  • 设置 LyX 将这些文件转换为 SVG,使用上面创建的脚本,在 LyX 中配置 PlantUML 到 SVG 的转换 笔记:为了在 PlantUML 中支持非 ASCII 字符,您需要指定以下内容:plantuml.bat -tsvg -charset UTF-8 $$i $$o
  • 插入 PlantUML 图(例如MyDiagram.plantuml)使用插入 > 图形插入 PlantUML 图
    LyX 应该将图像转换为屏幕上可见的内容。如果不行,您可能需要验证 LyX 中的 SVG 转换设置,包括SVG -> PNGSVG -> PDF(图形)这可能应该使用 LyX Converters 设置中的命令来完成inkscape。在 Windows 中,我必须使用 LyX工具 > 重新配置功能使其识别最新版本的 Inkscape,以便 SVG 转换正常工作。运行该功能后,您还必须重新启动 LyX。
  • 将图像导入 LyX 后,您可以.plantuml使用外部编辑器编辑源代码,方法是右键单击图像并选择外部编辑...通过 LyX 中的外部编辑器打开 .plantuml 源
  • 在 Windows 下的 LyX 中,您可以设置.plantuml要用 Notepad++(或您喜欢的编辑器)编辑的格式: 在 LyX 中为 PlantUML 文件配置自定义编辑器

希望这可以帮助。

相关内容