如何从文件中读取变量,假设文本文件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
是单个字符,则必须用引号引起来。