我正在尝试将 Excel(通过 .txt)文件中的多个参数/变量半自动导入 (share)latex 中的方程环境和 $$ = 数学环境。
它是半自动化的,因为我仍然需要手动将.txt文件导入(共享)latex。
我的方法包括以下例如test.txt
文件:
2: The old conversion coefficient k_{roe,Sv}
9.329664
4: The new conversion coefficient {K_{roe,Sv}}_{new}
0
6: r_{worst}
817278.6
8: r_{best}
81727.9
并使用以下/类似的乳胶线导入数字:
\item $K_{sh} = \lstinputlisting[firstline=28,lastline=28]{data_input/test.txt}$
firstline=4
通过改变和中的行号(例如 4 到 6)来选择数据点/编号lastline=4
。
它在普通 (share)latex 环境中运行良好。但是,如果我在 $$ 环境中应用该命令,则会收到以下错误:
missing $ inserted
如果我在命令后添加一个额外的 $ 符号,例如
\item $K_{sh} = \lstinputlisting[firstline=28,lastline=28]{data_input/test.txt}$$
它仍然会出现同样的错误。
因此我尝试将其放入数学环境中:
\item $K_{sh} = \ensuremath{\lstinputlisting[firstline=28,lastline=28]{data_input/test.txt}}$
和
\item $K_{sh} = \ensuremath{\lstinputlisting[firstline=28,lastline=28]{data_input/test.txt}}$$
正如本文所建议的那样问题。但是,缺少$的错误仍然存在。
我担心这可能是一个重复的问题,但使用我所知道的搜索词,我无法找到可行的解决方案。你知道解决方案吗?
为了遵守 BambOo 的提示/评论,我创建了以下 MWE,其中K_{sh..
通过注释掉其他 3 行来单独测试每行K_{sh..
。
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{listings}
\title{MWE import data}
\author{A.T.}
\date{April 2018}
\begin{document}
\maketitle
\section{Introduction}
\ensuremath{test} %Testing whether the \ensuremath command requires a package; it does not.
% $K_{sh} = \lstinputlisting[firstline=2,lastline=2]{test.txt}$
% $K_{sh} = \lstinputlisting[firstline=2,lastline=2]{test.txt}$$
% $K_{sh} = \ensuremath{\lstinputlisting[firstline=2,lastline=2]{test.txt}}$
$K_{sh} = \ensuremath{\lstinputlisting[firstline=2,lastline=2]{test.txt}}$$
\end{document}
它使用test.txt
与同一文件夹中的以下文件main.tex
:
2: The old conversion coefficient k_{roe,Sv}
9.329664
4: The new conversion coefficient {K_{roe,Sv}}_{new}
0
6: r_{worst}
817278.6
8: r_{best}
81727.9
我没有发现将 MWE 作为代码发布在这里是否是惯例,或者是否链接到外部文件,我猜测当外部源离线时可用性会降低,尽管重新创建需要更多时间,但代码是首选。
答案1
我不确定listings
这是否是完成这项工作的最佳工具:
\begin{filecontents*}{\jobname.txt}
2: The old conversion coefficient k_{roe,Sv}
9.329664
4: The new conversion coefficient {K_{roe,Sv}}_{new}
0
6: r_{worst}
817278.6
8: r_{best}
81727.9
\end{filecontents*}
\documentclass{article}
\usepackage{datatool,siunitx}
\DTLloaddb[noheader]{data}{\jobname.txt}
\newcommand{\mydatavalue}[1]{%
\begingroup
\dtlgetrow{data}{#1}%
\dtlgetentryfromcurrentrow{\temp}{1}%
\num{\temp}%
\endgroup
}
\begin{document}
\begin{itemize}
\item $K_{sh} = \mydatavalue{2}$
\item $K_{sh} = \mydatavalue{4}$
\item $K_{sh} = \mydatavalue{6}$
\end{itemize}
\end{document}
可能有更好的方法datatool
。
不同的实现方式,可能datatool
看起来有些矫枉过正。
\begin{filecontents*}{\jobname.txt}
2: The old conversion coefficient k_{roe,Sv}
9.329664
4: The new conversion coefficient {K_{roe,Sv}}_{new}
0
6: r_{worst}
817278.6
8: r_{best}
81727.9
\end{filecontents*}
\documentclass{article}
\usepackage{xparse,siunitx}
\ExplSyntaxOn
\NewDocumentCommand{\loaddatafile}{O{default}m}
{% #1 = symbolic name, #2 = file name
\at_datafile_load:nn { #1 } { #2 }
}
\NewExpandableDocumentCommand{\getdataline}{O{default}m}
{
\seq_item:cn { g_at_datafile_#1_seq } { #2 }
}
\ior_new:N \g_at_datafile_stream
\cs_new_protected:Nn \at_datafile_load:nn
{
\seq_gclear_new:c { g_at_datafile_#1_seq }
\ior_open:Nn \g_at_datafile_stream { #2 }
\ior_map_inline:Nn \g_at_datafile_stream
{
\seq_put_right:cx { g_at_datafile_#1_seq } { \tl_trim_spaces:n { ##1 } }
}
\ior_close:N \g_at_datafile_stream
}
\ExplSyntaxOff
\loaddatafile{\jobname.txt}
\begin{document}
\begin{itemize}
\item $K_{sh} = \num{\getdataline{2}}$
\item $K_{sh} = \num{\getdataline{4}}$
\item $K_{sh} = \num{\getdataline{6}}$
\end{itemize}
\end{document}
答案2
因此,对于遇到同样问题的未来用户,这里是@egreg 提供的解决方案的实现(包括一个将您的 excel 参数导出到 .txt 的脚本,以方便您使用):
首先将包添加到 main.tex:
\usepackage{datatool,siunitx} %To import data from a textfile
然后
%Make own commands to import variable parameters in main.tex:
\DTLloaddb[noheader]{data0}{data_input/excel_output_L.txt}
\newcommand{\inl}[1]{%
\begingroup
\dtlgetrow{data0}{#1}%
\dtlgetentryfromcurrentrow{\temp}{1}%
\num{\temp}%
\endgroup
}
\DTLloaddb[noheader]{data1}{data_input/excel_output_M_G.txt}
\newcommand{\inmg}[1]{%
\begingroup
\dtlgetrow{data1}{#1}%
\dtlgetentryfromcurrentrow{\temp}{1}%
\num{\temp}%
\endgroup
}
\DTLloaddb[noheader]{data2}{data_input/excel_output_H.txt}
\newcommand{\inh}[1]{%
\begingroup
\dtlgetrow{data2}{#1}%
\dtlgetentryfromcurrentrow{\temp}{1}%
\num{\temp}%
\endgroup
}
之后将 txt 文件添加到 (share)latex 文件夹中的 data_input
继续调用参数(例如 excel_output_H.txt 第 6 行中的数字):
\inmg{6}
(可以在 itemize/enumerate 环境内的数学环境中调用:
\item $K_{shielding} = \inmg{6}$
为了完整性,这是将 Excel 列 E3:E100 导出为“该”工作簿中 3 张工作表的 .txt 代码:
Sub export_to_txt()
Dim myFile As String, rng As Range, cellValue As Variant, i As Integer, j As Integer
For nr_sheets = 1 To 3
If nr_sheets = 1 Then
sheetname = "L"
End If
If nr_sheets = 2 Then
sheetname = "M_G"
End If
If nr_sheets = 3 Then
sheetname = "H"
End If
myFile = ThisWorkbook.Path & "\excel_output_" & sheetname & ".txt"
'MsgBox (sheetname)
ThisWorkbook.Worksheets(sheetname).Activate
Set rng = ThisWorkbook.Worksheets(sheetname).Range("E3:E100")
Open myFile For Output As #1
For i = 1 To rng.Rows.Count
For j = 1 To rng.Columns.Count
cellValue = rng.Cells(i, j).Value
If j = rng.Columns.Count Then
Write #1, cellValue
Else
Write #1, cellValue,
End If
Next j
Next i
Close #1
Next nr_sheets
End Sub