方程式和数学环境中的 lstinputlisting 环境?

方程式和数学环境中的 lstinputlisting 环境?

我正在尝试将 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

相关内容