Я хочу создать (графическое) представление для пользовательского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}
Процедура выше очень проста, однако ее можно легко изменить, чтобы лучше раскрасить код, отсортировать поля и добавить заметки и т. д. В качестве бонуса не нужны никакие catcodes. Если вас интересует решение 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}