高レベルのデータ構造の視覚化に関するアイデアはありますか?

高レベルのデータ構造の視覚化に関するアイデアはありますか?

カスタムの(グラフィカルな)表現を作成したい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

鉄道ダイヤグラム – プログラミング言語 Pascal で Niklaus Wirth が導入

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

関連情報