Ich möchte eine (grafische) Darstellung für eine benutzerdefinierteHL7 v2Nachrichtenstruktur. In diesem Szenario beschäftige ich mich nur mit der Nachrichtenstruktur auf hoher Ebene – der Anordnung und Verwendung der Segmente einer Nachricht. Die offiziellen Dokumente (die meines Wissens nach nur gegen Bezahlung erhältlich sind) verwenden eine Tabellennotation wie diese:
In dieser Struktur bezeichnen die verschiedenen Klammern optionale []
und wiederholbare {}
Segmente sowie Alternativen <x|y|z>
. Unsere benutzerdefinierte Struktur basiert auf diesem Standard und hängt im Wesentlichen einige Segmente an und erklärt, dass wir bestimmte andere Segmente niemals verwenden werden. Bisher haben wir einfach die tabellenartige Struktur nachgeahmt, aber ich finde, dass diese schwer zu lesen ist, insbesondere bei mehreren verschachtelten Ebenen bedingter Gruppen. Ich dachte darüber nach, dieBeispiel für einen TikZ-Dateibaumum die Datenstruktur darzustellen, aber mit all den child [missing]
Einträgen und anderen Besonderheiten habe ich mich gefragt, ob es andere (bessere?) Optionen gibt.
Antwort1
Ich stimme voll und ganz zu, dass das von Ihnen verwendete aktuelle Format umständlich ist und möglicherweise ein Licht auf die vielen Gründe wirft, warum Projekte im Bereich Gesundheitssoftware scheitern. Meiner Meinung nach liegt das an der bürokratischen Komplexität. Dass man für die Formate bezahlen muss, macht das Ganze noch schlimmer.
Ich würde empfehlen, Lua zu verwenden. Wenn Sie die Daten für den Satz programmgesteuert generieren, würde ich direkt Lua-Tabellen verwenden. Wenn sie aus einer Datenbank generiert werden, exportieren Sie sie entweder als XML oder vorzugsweise als JSON. Hier ist ein vereinfachtes Programm, das dies demonstriert. Sie brauchen keine Eisenbahnen oder Kästchen, Sie können die Daten wie einen Absatz aus einem Buch lesen.
\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}
Die obige Routine ist sehr einfach, kann jedoch leicht geändert werden, um die Farbcodierung zu verbessern, die Felder zu sortieren und Notizen hinzuzufügen usw. Als Bonus sind keine Catcodes erforderlich. Wenn Sie an einer JSON-Lösung interessiert sind, schreiben Sie mir eine Nachricht und ich werde eine veröffentlichen.
Antwort2
Ein Beispiel: finden Sie unter http://ddi.uni-wuppertal.de/material/materialsammlung/
Paket ist auf 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}