과학적인 주제에 대해 작업하는 동안 다음이 가능한지 궁금했습니다. 명령을 사용하여 여러 지수 곡선을 플롯하고 싶습니다 \addplot
. 특기는 하드 코딩되지 않고 텍스트 파일에서 읽어야 하는 지수가 필요하다는 사실에 있습니다! 이것이 어떻게 이루어질 수 있습니까? 내가 원하는 것을 명확히 하기 위해 MWE를 만들었습니다.
%% MWE for SX: Defining variables with numbers taken from a file
\documentclass{standalone}
\usepackage[utf8]{inputenx}
\usepackage[T1]{fontenc}
%% Use only sans-serif fonts; change to serif if desired
\renewcommand*\sfdefault{phv}
\renewcommand*{\familydefault}{\sfdefault}
\usepackage{arevmath}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usepgfplotslibrary{units}
\usetikzlibrary{spy, backgrounds}
\usepackage{pgfplotstable}
\usepackage{xcolor}
\usepackage{amsmath}
%% To read variables from file
\usepackage{datatool}
\usepackage{filecontents}
\newlength\figurewidth
\newlength\figureheight
\newlength\marksize
\begin{document}
%% Width and height of the output figure, adapt as necessary
\setlength{\figurewidth}{13cm}
\setlength{\figureheight}{8cm}
\setlength{\marksize}{2.4pt}
\setlength{\linewidth}{1pt}
%% Define the file in here, as whole files cannot be uploaded to Tex.SE
\begin{filecontents}{LsqExponents.csv}
4.012,3.456,2.345
\end{filecontents}
%% Now read these three values from the file
\DTLloaddb[noheader, keys={b_annu, b_rest, b_stra}]{LsqExponents}{LsqExponents.csv}
%\DTLdisplaydb{LsqExponents}
\begin{tikzpicture}[font=\large]
\begin{axis}[%
width=\figurewidth,
height=\figureheight,
scale only axis,
xmin=0.05,
xmax=0.5,
xtick={0.1,0.2,0.3,0.4,0.5},
xlabel={$\text{T G S } \gamma_\mathrm{g} \text{ (-)}$},
%xmajorgrids,
ymin=0,
ymax=0.12,
ylabel={$\text{G R P } h_\mathrm{g} \text{ (-)}$},
yticklabel style={/pgf/number format/fixed,
/pgf/number format/precision=2,
/pgf/number format/fixed zerofill},
%ymajorgrids,
name=plot1,
legend pos=north west,
legend style={anchor=north west,draw=black,fill=white,legend cell align=left, rounded corners=2pt, nodes={inner sep=4pt,text depth=0pt}}
]
%% Fits and functions
\addplot [color=cyan, solid, domain=0:0.5] {x^4.567};
\addlegendentry{Original TD Fit};
\addplot [color=magenta, dashed, domain=0:0.5] {x^3.456};
\addlegendentry{TD-like Fit for Rest};
\addplot [color=black, dashed, domain=0:0.5] {x^2.345};
\addlegendentry{TD-like Fit for Stra};
\end{axis}
\end{tikzpicture}
\end{document}
보시다시피 지수는 이제 하드 코딩되어 있지만(65-71행) csv 파일(다른 프로그램에서 미리 생성됨)에서 가져온 부동 변수여야 합니다! 나는 그 위대한 것에 대해 조금 더듬었다.datatool
패키지로 제공되지만 내 필요에 맞게 사용할 수 있는지 또는 어떻게 사용할 수 있는지 잘 모르겠습니다. 명령 \DTLdisplaydb{LsqExponents}
이 실패하므로 MWE에서 주석 처리됩니다.
따라서 솔루션은 두 단계로 구성됩니다.
- LaTeX/Tikz에서 세 개의 숫자를 개별 변수로 가져옵니다.
- 하드 코딩된 지수를 이러한 변수로 대체합니다.
도움을 주시면 감사하겠습니다!
답변1
readarray
여기서는 공백으로 구분된 데이터를 읽는 패키지를 사용하여 구현합니다 . 핵심라인은
\begin{filecontents*}{LsqExponents.ssv}
4.012 3.456 2.345
\end{filecontents*}
%% Now read these three values from the file
\readdef{LsqExponents.ssv}{\mydatadef}
\readArrayij{\mydatadef}{mydata}{1}
이것이 하는 일은 파일 내용을 명명 \def
된 \mydatadef
. 그런 다음 열 너비 = 1로 \mydatadef
명명된 2차원 배열 구조 mydata
(따라서 사실상 1차원 배열) 를 읽고 정렬했습니다 . 데이터 값은 다음을 사용하여 액세스됩니다.\arrayij{mydata}{<row value>}{1}
%% MWE for SX: Defining variables with numbers taken from a file
\documentclass{standalone}
\usepackage[utf8]{inputenx}
\usepackage[T1]{fontenc}
%% Use only sans-serif fonts; change to serif if desired
\renewcommand*\sfdefault{phv}
\renewcommand*{\familydefault}{\sfdefault}
\usepackage{arevmath}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usepgfplotslibrary{units}
\usetikzlibrary{spy, backgrounds}
\usepackage{pgfplotstable}
\usepackage{xcolor}
\usepackage{amsmath}
%% To read variables from file
\usepackage{readarray}
\usepackage{filecontents}
\newlength\figurewidth
\newlength\figureheight
\newlength\marksize
\begin{document}
%% Width and height of the output figure, adapt as necessary
\setlength{\figurewidth}{13cm}
\setlength{\figureheight}{8cm}
\setlength{\marksize}{2.4pt}
\setlength{\linewidth}{1pt}
%% Define the file in here, as whole files cannot be uploaded to Tex.SE
\begin{filecontents*}{LsqExponents.ssv}
4.012 3.456 2.345
\end{filecontents*}
%% Now read these three values from the file
\readdef{LsqExponents.ssv}{\mydatadef}
\readArrayij{\mydatadef}{mydata}{1}
\begin{tikzpicture}[font=\large]
\begin{axis}[%
width=\figurewidth,
height=\figureheight,
scale only axis,
xmin=0.05,
xmax=0.5,
xtick={0.1,0.2,0.3,0.4,0.5},
xlabel={$\text{T G S } \gamma_\mathrm{g} \text{ (-)}$},
%xmajorgrids,
ymin=0,
ymax=0.12,
ylabel={$\text{G R P } h_\mathrm{g} \text{ (-)}$},
yticklabel style={/pgf/number format/fixed,
/pgf/number format/precision=2,
/pgf/number format/fixed zerofill},
%ymajorgrids,
name=plot1,
legend pos=north west,
legend style={anchor=north west,draw=black,fill=white,legend cell align=left, rounded corners=2pt, nodes={inner sep=4pt,text depth=0pt}}
]
%% Fits and functions
\addplot [color=cyan, solid, domain=0:0.5] {x^\arrayij{mydata}{1}{1}};
\addlegendentry{Original TD Fit};
\addplot [color=magenta, dashed, domain=0:0.5] {x^\arrayij{mydata}{2}{1}};
\addlegendentry{TD-like Fit for Rest};
\addplot [color=black, dashed, domain=0:0.5] {x^\arrayij{mydata}{3}{1}};
\addlegendentry{TD-like Fit for Stra};
\end{axis}
\end{tikzpicture}
\end{document}