高階資料結構可視化的想法?

高階資料結構可視化的想法?

我想為自訂創建一個(圖形)表示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}

上面的例程非常簡單,但可以輕鬆修改為更好的顏色代碼、對欄位進行排序並添加註解等。如果您對 json 解決方案感興趣,請留言,我將發布一個。

答案2

一個例子:找到它 http://ddi.uni-wuppertal.de/material/materialsammlung/

包裹在 CTAN 上:http://ctan.org/pkg/schule

鐵路圖 – 由 Niklaus Wirth 使用程式語言 Pascal 引入

\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}

相關內容