如何将 JSON 文件中的嵌套数组转换为 LaTeX 中的矩阵和表格

如何将 JSON 文件中的嵌套数组转换为 LaTeX 中的矩阵和表格

我想将 json 文件中如下所示的嵌套数组读入 LaTeX,并将其转换为矩阵,其中每个基本数组成为一行,每个基本数组成为一列。

"G": [
            [
                0.6170212765957448,
                0.3829787234042552,
                0.0,
                0.0,
                -0.0062734226435906225,
                0.0
            ],
            [
                0.23404255319148953,
                0.7659574468085104,
                0.0,
                0.0,
                -0.006077066178884076,
                0.0
            ],
            [
                0.0,
                0.9075630252100839,
                0.09243697478991603,
                0.0,
                -0.004923272683698053,
                -0.002819495369518709
            ]
  ]

我想我需要使用 LuaTeX。但我不知道具体如何实现。

答案1

LuaTeX 有一个内置的 JSON 解析器,可以通过 访问utilities.json。它提供了一个函数,该函数接受一个文件名并返回一个包含 JSON 数据的 Lua 表。然后,您只需使用嵌套的 for 循环来迭代您的数据并将其打印到文档中load即可。tex.sprint

不过,在开始之前,你必须将文件转换为有效的 JSON。为此,你必须将其包装成一个对象:

{
    "G": [
        ...
    ]
}

我将其保存为test.json

\documentclass{article}
\usepackage{amsmath}
\usepackage{luacode}
\begin{luacode*}
userdata = utilities.json.load("test.json")
\end{luacode*}
\begin{document}

\[
\begin{luacode*}
local G = userdata.G
tex.sprint("\\begin{pmatrix}")
for i = 1, #G do
    for j = 1, #G[i] do
        tex.sprint(G[i][j] .. (j == #G[i] and " \\\\" or " & "))
    end
end
tex.sprint("\\end{pmatrix}")
\end{luacode*}
\]

\begin{luacode*}
local G = userdata.G
tex.sprint("\\begin{tabular}{" .. string.rep("c", #G) .. "}")
for i = 1, #G[1] do
    for j = 1, #G do
        tex.sprint(G[j][i] .. (j == #G and " \\\\" or " & "))
    end
end
tex.sprint("\\end{tabular}")
\end{luacode*}

\end{document}

在此处输入图片描述

答案2

我的解决方案主要基于 TeX 基元。首先,我们通过宏扫描矩阵数据。数据以以下形式\scanmatrix存储在宏中:\matrixdata

0.6170212765957448&0.3829787234042552&0.0&0.0&-0.0062734226435906225&0.0\cr 0.23404255319148953&...\cr ...

\maxitemwidth扫描数据时保存数据项的最大宽度。

然后我们可以使用\matrixdata内部\halign基元将数据行打印到行。或者我们可以使用\valign基元将数据列打印到列。\matrixdata两种情况下使用相同的方法。

\newdimen\maxitemwidth
\def\iscomma#1,#2\iffalse{\ifx^#2^}
\long\def\addto#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}}    

\def\scanmatrix#1[{\maxitemwidth=0pt \def\matrixdata{}\scanmatrixrow}
\def\scanmatrixrow #1[{\scanmatrixitem}
\def\scanmatrixitem #1#2 {\iscomma #1#2,\iffalse
   \savematrixitem #1#2,\addto\matrixdata{\cr}\expandafter\closematrixrow
   \else \savematrixitem #1#2\addto\matrixdata{&}\expandafter\scanmatrixitem \fi}
\def\closematrixrow #1]{\futurelet\next\closematrixrowA}
\def\closematrixrowA{\ifx\next,\expandafter\scanmatrixrow
   \else\expandafter\closematrix\fi}
\def\closematrix #1]{}
\def\savematrixitem #1,{\setbox0=\hbox{$#1$}%
   \ifdim\maxitemwidth<\wd0 \maxitemwidth=\wd0 \fi
   \addto\matrixdata{#1}}

\scanmatrix
"G": [
            [
                0.6170212765957448,
                0.3829787234042552,
                0.0,
                0.0,
                -0.0062734226435906225,
                0.0
            ],
            [
                0.23404255319148953,
                0.7659574468085104,
                0.0,
                0.0,
                -0.006077066178884076,
                0.0
            ],
            [
                0.0,
                0.9075630252100839,
                0.09243697478991603,
                0.0,
                -0.004923272683698053,
                -0.002819495369518709
            ]
  ]

% print matrix row to row:

\halign{\hfil$#$\hfil&&\quad\hfil$#$\hfil\cr \matrixdata}

\bigskip

% print transposed matrix:

\valign{&\hsize=\dimexpr\maxitemwidth+5pt \leftskip=0pt plus1fil 
   \noindent\strut $#$\cr \matrixdata}

相关内容