我有一个包含一些文本的 tex 文档和一个包含 plantuml 图表的文件夹。
我需要将图表导入文档。
我尝试使用 plantuml 包 -https://ctan.org/pkg/plantuml?lang=en对我来说它工作得很好。但是,只有当我手动将 uml 文本粘贴到文档中时它才有效。
是否可以使用该包按路径导入文件?或者,我应该使用其他包?或者,也许我应该使用 Lua 来完成我的任务?
我对 TeX 还很陌生 %)
我的限制:
路径包含空格,例如“../文件夹名称/带空格的文件名.md”
plantuml 文件是注入了 uml 语法的 markdown 文件,例如(当然,原始文件中的破折号没有空格)
` ` `plantuml
@startuml
skinparam BoxPadding 30
...
@enduml
` ` `
包括或导入都对我没有帮助 :/ 也许,我对 TeX 做错了什么。
答案1
您没有提供测试文件,而是从手册中获取了一个......
您可以让 lua 获取带有标记的文件,将 latex 环境保存到临时文件中,然后输入(使用临时文件只是简化了 catcode 处理)
主文件
\documentclass{scrartcl}
\usepackage{plantuml}
\def\pumlfile#1{%
\directlua{%
local f = assert(io.open("#1", "rb"))
local content = f:read("*all")
f:close()
local f2 = io.open("#1" .. ".ltx","w")
f2:write("\string\\begin{plantuml}\string\n" .. content .. "\string\\end{plantuml}")
f2:close()
}%
\input{"#1.ltx"}}
\begin{document}
\pumlfile{p1.txt}
\end{document}
p1.txt
@startuml
Alice -> Bob: test
@enduml
答案2
谢谢你,大卫!https://tex.stackexchange.com/a/483873/185331
效果不错。我做了一些修改
\usepackage{plantuml}
\def\pumlfile#1{%
\directlua{%
%texio.write_nl("Filename: \luatexluaescapestring{#1}")
%texio.write_nl("Filename: " .. \luastring{#1})
local srcname = \luastring{#1}
srcname = srcname:sub(2,-2)
% trick with quotes in filename
%texio.write_nl("srcname=[" .. srcname .. "]")
local f = assert(io.open(srcname, "rb"))
local content = f:read("*all")
f:close()
tmpfile = "temp-plantuml.uml"
os.remove(tmpfile)
local f2 = io.open(tmpfile, "w")
f2:write("\string\\begin{plantuml}\string\n" .. content .. "\string\\end{plantuml}")
f2:close()
}%
\input{"temp-plantuml.uml"}}
并以此方式使用它
\pumlfile{"../workflow diagrams/02. Keys.Activation Request.md"}
如您所见,我的路径中有空格。而且,这是一个未解决的技巧——如果我的 UML 中有西里尔字母,那么 plantuml 就无法处理图表。然而,文件编码是 UTF8 :/