如何从 LATEX 中的文件读取变量?

如何从 LATEX 中的文件读取变量?

如何从文件中读取变量,假设文本文件var.txt包含以下内容:

foo = 10
bar = 20

现在我正在寻找一个\missingcommand扫描文件的命令,它可以在我的 Latex 代码中使用,如下所示:

The first value \missingcommand{foo} and the second value \missingcommand{bar}.

编译为:

The first value 10 and the second value 20.

任何帮助都将不胜感激

答案1

这使用了我的readarray包。它依赖于字段之间的空格分隔符,并且每行恰好有 3 个字段:<variable> = <value>。请参阅附录以获得改进版本。

已编辑(2016 年 12 月),使用升级readarray包的首选语法,即\MyDat[\arabic{datacount},3]代替已弃用的\arrayij{MyDat}{\arabic{datacount}}{3}。同样,\readarray\data\MyDat[-,3]代替\readArrayij{\data}{MyDat}{3}

还要注意,原始答案也\value{datacount}必须修改为。\arabic{datacount}

\documentclass{article}
\usepackage{readarray}[2016-11-07]
\usepackage{filecontents}
\begin{filecontents*}{mydata.dat}
foo = 10
bar = 20
\end{filecontents*}
\newcommand\missingcommand[1]{\csname DATA#1\endcsname}
\begin{document}
\readdef{mydata.dat}{\data}
\readarray\data\MyDat[-,3]
\MyDatROWS{} rows of data read.

\newcounter{datacount}
\setcounter{datacount}{0}%
\whiledo{\value{datacount} < \MyDatROWS}{%
  \stepcounter{datacount}%
  \expandafter\xdef\csname DATA\MyDat[\arabic{datacount},1]\endcsname{%
    \MyDat[\arabic{datacount},3]}%
}

The first value \missingcommand{foo} and the second value \missingcommand{bar}.
\end{document}

在此处输入图片描述

附录

请注意,使用最新的readarray软件包版本,可以将字段分隔符设置为其他字符或字符串。因此,对于此应用程序,最好将字段分隔符设置为字符=(使用\readarraysepchar{=}),这样=符号周围的空格就不是必需的了。然后,使用带星号的新/改进的版本\readarray,可以自动从数据中删除前导/尾随空格。因此,产生相同结果的上述代码的最佳版本可以给出为

\documentclass{article}
\usepackage{readarray}[2016-11-07]
\usepackage{filecontents}
\begin{filecontents*}{mydata.dat}
foo = 10
bar=20
\end{filecontents*}
\newcommand\missingcommand[1]{\csname DATA#1\endcsname}
\readarraysepchar{=}
\begin{document}
\readdef{mydata.dat}{\data}
\readarray*\data\MyDat[-,2]
\MyDatROWS{} rows of data read.

\newcounter{datacount}
\setcounter{datacount}{0}%
\whiledo{\value{datacount} < \MyDatROWS}{%
  \stepcounter{datacount}%
  \expandafter\xdef\csname DATA\MyDat[\arabic{datacount},1]\endcsname{%
    \MyDat[\arabic{datacount},2]}%
}

The first value \missingcommand{foo} and the second value \missingcommand{bar}.
\end{document}

答案2

您可以使用datatool。它是为 LaTeX 内部的数据库结构而制作的。我按照您喜欢的方式在类似的上下文中使用它。

\documentclass{article}
\usepackage{datatool, filecontents}
\DTLsetseparator{ = }% Set the separator between the columns. Could be
% anything you like. Whitespaces are not trimmed, so you have to set
%them as part of the separator.

\begin{filecontents*}{mydata.dat}
foo = 10
bar = 20
"x" = 30
\end{filecontents*}

\begin{document}
\DTLloaddb[noheader, keys={thekey,thevalue}]{mydata}{mydata.dat}
% Loads mydata.dat with column headers 'thekey' and 'thevalue'

\newcommand{\missingcommand}[1]{\DTLfetch{mydata}{thekey}{#1}{thevalue}}

The first value \missingcommand{foo} and the second value \missingcommand{bar}.

\end{document}

如果thekey是单个字符,则必须用引号引起来。

读取值

相关内容