我想将 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}