答案1
这不完全是你想要的,但有些人可能会感兴趣。(你已将问题标记为分享乳胶,我不确定是否可以在 ShareLaTeX 上使用此解决方案。不过在 Overleaf 上绝对可以,请参阅https://www.overleaf.com/read/byrgzftndfmq它需要使用自定义latexmkrc
文件,我从https://www.overleaf.com/latex/examples/using-pythontex-on-overleaf/qfjttkyfdtyt)
使用 Python 解析这样的文件非常容易。我确信可以使用 Lua 等语言来完成,因此使用 LuaTeX 的解决方案是可行的。如果也可以使用纯 (La)TeX 来完成,我也不会感到惊讶。
不过,我更喜欢用 Python,所以下面的代码使用该pythontex
包来实现这一点。当然,安装 Python 也是必需的。
我制作了一个名为的示例数据文件mydata.dat
,如下所示:
================================
======== Time = 0Sec ==========
Distance = 0
speed = 0
temperature = 0
================================
======== Time = 2Sec ==========
Distance = 1
speed = 2
temperature = 0.1
================================
======== Time = 4Sec ==========
Distance = 3
speed = 5
temperature = 0.3
据我所知,这与您的数据文件的格式相匹配,尽管我不知道时间步之间发生了什么。我假设时间步之间的唯一分隔符是所有行=
。
因为这使用了pythontex
,所以需要额外的编译步骤。即,您需要运行
pdflatex test
pythontex test
pdflatex test
您的.tex
文件名为test.tex
。以下代码的输出为
因此,我首先要做的是将整个数据文件读入名为 的字典中data
。然后我定义一个 Python 函数,该函数打印出\addplot coordinates {(x1,y1)(x2,y2)...};
,其中包含基于数据的坐标。我在 的axis
环境中使用此函数pgfplots
,如\py|printplot('xvar','yvar')|
。
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{pgfplots}
\pgfplotsset{
compat=1.14,
width=6cm,
height=5cm
}
\usepackage{pythontex}
\begin{document}
\begin{pycode}
from collections import defaultdict
data = defaultdict(list)
with open('mydata.dat') as dd:
for line in dd:
if line.startswith('='):
if 'Time' in line:
data['Time'] += [line.split()[3][:-3]]
else:
key, _, val = line.split()
data[key] += [val]
def printplot(key1,key2,plotargs=None):
coords = ''.join(['({0},{1})'.format(x,y)
for x,y in zip(data[key1],data[key2])])
if plotargs is None:
plot = r'\addplot coordinates {' + coords + '};'
else:
plot = r'\addplot' + plotargs + ' coordinates {' + coords + '};'
print(plot)
\end{pycode}
\begin{tikzpicture}
\begin{axis}[
xlabel=Distance,
ylabel=Speed,
title={Speed vs.\@ distance},
]
\py|printplot('Distance','speed')|
\end{axis}
\end{tikzpicture}
\begin{tikzpicture}
\begin{axis}[
xlabel=Time,
ylabel=Temperature,
title={Temperature vs.\@ time}
]
\py|printplot('Time','temperature',plotargs='+[red,thick,mark=x]')|
\end{axis}
\end{tikzpicture}
\end{document}