请帮助我在 LyX 文档中嵌入 plantUML 图。
我是 LyX 的新手,我不知道如何在将文档转换为 PDF 时动态生成图表。
让我高层次地写下我想要实现的目标。
- 添加文件格式
.plantuml
- 添加此文件格式的转换器,将其转换
.plantuml
为 PNG - 将该文件包含
.plantuml
在主 LyX 文档中。 - 当我运行导出到 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
这样,PlantUML和Inkscape 使用相同的特定字体,布局没有错误。但是,这种策略的一个警告是字体依赖于系统。这意味着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 机器有一个名为的字体8514fix
,8514oem
类似于 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 转换器如下所示:
注意命令如下:
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 系统上,情况就是这样)。
使用 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
这是它在 Adobe 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 中会出现如下错误:
答案2
这是我从 Rainer 那里获得的信息,在他的帮助下我能够显示包含的 .plantuml 文件。
步骤摘要如下:
- 安装 PlantUML (及其所需的 GraphViz)
- 创建脚本(例如
plantuml.bat
在 Windows 上),以便 PlantUML 可以从命令行运行以创建 SVG 文件。通过手动测试确保其正常工作,因为 LyX 不会轻易发现任何问题。 - 确保 LyX 的 PATH 设置中包含上一步中脚本的目录,这:
- 设置 LyX 以识别 PlantUML 文本文件 (.plantuml) 作为新格式,这:
- 设置 LyX 将这些文件转换为 SVG,使用上面创建的脚本,这:
笔记:为了在 PlantUML 中支持非 ASCII 字符,您需要指定以下内容:
plantuml.bat -tsvg -charset UTF-8 $$i $$o
- 插入 PlantUML 图(例如
MyDiagram.plantuml
)使用插入 > 图形:
LyX 应该将图像转换为屏幕上可见的内容。如果不行,您可能需要验证 LyX 中的 SVG 转换设置,包括SVG -> PNG和SVG -> PDF(图形)这可能应该使用 LyX Converters 设置中的命令来完成inkscape
。在 Windows 中,我必须使用 LyX工具 > 重新配置功能使其识别最新版本的 Inkscape,以便 SVG 转换正常工作。运行该功能后,您还必须重新启动 LyX。 - 将图像导入 LyX 后,您可以
.plantuml
使用外部编辑器编辑源代码,方法是右键单击图像并选择外部编辑...: - 在 Windows 下的 LyX 中,您可以设置
.plantuml
要用 Notepad++(或您喜欢的编辑器)编辑的格式:
希望这可以帮助。