我想为自定义创建(图形)表示HL7 v2消息结构。在这种情况下,我只关心高级消息结构 - 消息段的排列和使用。官方文档(据我所知,除非您付费,否则无法获得)使用如下表格符号:
在这个结构中,不同的括号表示可选[]
和可重复的{}
段以及替代段<x|y|z>
。我们的自定义结构建立在此标准之上,基本上附加了一些段并声明我们永远不会使用某些其他段。到目前为止,我们只是模仿了表格结构,但我发现这很难阅读,尤其是在有多个嵌套级别的条件组的情况下。我当时正在考虑将TikZ 文件树示例来表示数据结构,但对于所有child [missing]
条目和其他特性,我想知道是否还有其他(更好的?)选项。
答案1
我完全同意你现在使用的格式很尴尬,也许它揭示了医疗软件项目失败的诸多原因;在我看来,这是由于官僚主义的复杂化。为格式付费简直是雪上加霜。
我建议使用 Lua。如果您以编程方式生成用于排版的数据,我会直接使用 Lua 表。如果它们是从数据库生成的,请将它们导出为 XML 或最好是 json。这是一个简化的程序来演示这一点。不需要任何铁路或箱子,您可以像从书中读取段落一样读取数据。
\documentclass{article}
\usepackage{fontspec,luacode, xcolor}
\newfontfamily{\arial}{Arial}
\begin{document}
\arial
\begin{luacode}
if type(tex)=='table' then local print = tex.print end
local patientVisit = {
patientClass = "CON",
assignedPatientLocation = {
pointOfCare = "8152879"
},
visitNumber = {
idNumber = 16164813
}
}
function inspect_table (tab, offset)
offset = offset or "\\mbox{~~}"
for k, v in pairs (tab) do
local newoffset = offset .. offset
if type(v) == "table" then
print(offset..k .. " = \\{\\par ")
inspect_table(v, newoffset)
print(offset.."\\}\\par")
else
if k=="patientClass" then print(offset .. '{\\color{red}'.. k .. "} = " .. tostring(v), "\\par")
else
print(offset..k.."="..v.."\\par")
end
end
end
end
inspect_table(patientVisit)
\end{luacode}
上面的例程非常简单,但可以轻松修改以更好地进行颜色编码、对字段进行排序和添加注释等。作为奖励,不需要任何 catcode。如果您对 json 解决方案感兴趣,请留言,我会发布一个。
答案2
一个例子:找到它 http://ddi.uni-wuppertal.de/material/materialsammlung/
软件包位于 CTAN 上:http://ctan.org/pkg/schule
\documentclass{schulein}
\usepackage[utf8]{inputenc}
\usepackage{schulinf}
\begin{document}
\begin{tikzpicture}[syntaxdiagramm]
\node [] {};
\node [terminal] {public};
\node [terminal] {class};
\node [nonterminal] {Klassenname};
\node [terminal] {\{};
\node (endstart) [point] {};
\node [point, below=of endstart] {};
\node [point, xshift=-75mm] {};
\node (endAttribute) [endpoint, continue chain=going below] {};
\node (startAttribute) [point] {};
{[start chain=attribute going right]
\chainin (startAttribute);
\node [point, xshift=25mm] {};
\node [point, continue chain=going above] {};
\node [nonterminal, continue chain=going left] {Attribut};
\node [point, join,join=with endAttribute] {};
}
\node (startKonstruktor) [point] {};
\node (endKonstruktor) [endpoint] {};
{[start chain=konstruktor going right]
\chainin (startKonstruktor);
\node [point, xshift=30mm] {};
\node [point, continue chain=going below] {};
\node [nonterminal, continue chain=going left] {Konstruktor};
\node [point, join,join=with endKonstruktor] {};
}
\node (endMethode) [endpoint] {};
\node (startMethode) [point] {};
{[start chain=methode going right]
\chainin (startMethode);
\node [point, xshift=25mm] {};
\node [point, continue chain=going above] {};
\node [nonterminal, continue chain=going left] {Methode};
\node [point, join,join=with endMethode] {};
}
\node [point] {};
\node [terminal, continue chain=going left] {\}};
\end{tikzpicture}
\end{document}