在数据库中搜索特定条目

在数据库中搜索特定条目

我编写了一个命令,它需要五个参数来在两点之间进行插值。

现在我尝试从一个文件中获取这两个点csv

\documentclass{article}
\usepackage{expl3}
\usepackage[ansinew]{inputenc}
\usepackage{datatool}
\usepackage{filecontents}
\begin{filecontents}{tempdatabb.dat}
10 & 100
20 & 130
30 & 150
40 & 170
50 & 190
60 & 210
70 & 250
80 & 290
90 & 350
100 & 410
120 & 550
140 & 690
\end{filecontents}

\makeatletter
\ExplSyntaxOn
\cs_set_eq:NN \ifinstr \tl_if_in:nnTF
\DeclareRobustCommand*\assignvalues[2]{\@assignvalues{#1}{#2}}
\long \def\@assignvalues#1#2{
  \seq_set_split:Nnn \l_tmpa_seq { | } {#1}
  \seq_set_split:Nnn \l_tmpb_seq { | } {#2}
  \seq_mapthread_function:NNN \l_tmpa_seq \l_tmpb_seq \assignvalues@ii
}
\long \def \assignvalues@ii #1#2 { \protected@csedef{#1}{#2} }
\ExplSyntaxOff
\makeatother

\begin{document}
\assignvalues{suchwert}{35}

\DTLsetseparator{&}
\DTLloaddb[keys={temperatur,dichte},noheader]{scoreAA {tempdatabb.dat}
\begin{table}[htbp]
\centering
\begin{tabular}{llr}
\bfseries Temperatur & \bfseries Dichte %
\DTLforeach[\DTLislt{\temperatur}{\suchwert}]{scoreAA}%
{\temperatur=temperatur,\dichte=dichte}{%
\\\temperatur & \dichte 
}%
\end{tabular}
\end{table}
\end{document}

我想将点数(30,150)(40,170)四个变量作为赋值获取,例如:

\assignvalues{firstx}{30}
\assignvalues{firsty}{150}
\assignvalues{secondx}{40}
\assignvalues{seconxy}{170}

但 MWE 不起作用,因为

\DTLforeach[\DTLislt{\temperatur}{\suchwert}]{scoreAA}%

如果我使用

\DTLforeach[\DTLislt{\dichte}{\suchwert}]{scoreAA}%

它作为 MWE 工作。

对这个任务有什么想法吗?

这个问题已在@ 上提出http://www.mrunix.de/forums/showthread.php?t=74920 (德语)。

有关输入/输出关系的更多示例

功能(输入/输出)

%Example 1
%Input:

\assignvalues{suchwert}{35}

%Output:

\assignvalues{firstx}{30}
\assignvalues{firsty}{150}
\assignvalues{secondx}{40}
\assignvalues{seconxy}{170}


%Example 2
%Input:

\assignvalues{suchwert}{85}

%Output:

\assignvalues{firstx}{80}
\assignvalues{firsty}{290}
\assignvalues{secondx}{90}
\assignvalues{seconxy}{350}


%Example 3
%Input:

\assignvalues{suchwert}{105}

%Output:

\assignvalues{firstx}{100}
\assignvalues{firsty}{410}
\assignvalues{secondx}{120}
\assignvalues{seconxy}{550}



%Example 4
%Input:

\assignvalues{suchwert}{100}

%Output:

\assignvalues{firstx}{100}
\assignvalues{firsty}{410}
\assignvalues{secondx}{120}
\assignvalues{seconxy}{550}

编辑:更多信息

@Steven B. Segletes :在这里您可以看到导致我提出问题的工作。如您所见,我将在两个点之间进行插值,正如您所见,我使用 \assignvalues 将变量设置为更多值。此分配代码最初由 Clemens 编写(查看 @http://www.mrunix.de/forums/showthread.php?t=73700&page=2&highlight=Goldnas)也正如这里提出的问题一样。现在你也许能明白,目标是什么了?

\documentclass{article}

\usepackage{expl3,xparse}
\usepackage[ansinew]{inputenc}
\usepackage{etoolbox}

\usepackage{array}

\newcolumntype{L}[1]{>{\raggedright\arraybackslash}p{#1}}

\makeatletter
\ExplSyntaxOn
\cs_set_eq:NN \ifinstr \tl_if_in:nnTF
\DeclareRobustCommand*\assignvalues[2]{\@assignvalues{#1}{#2}}
\long \def\@assignvalues#1#2{
  \seq_set_split:Nnn \l_tmpa_seq { | } {#1}
  \seq_set_split:Nnn \l_tmpb_seq { | } {#2}
  \seq_mapthread_function:NNN \l_tmpa_seq \l_tmpb_seq \assignvalues@ii
}
\long \def \assignvalues@ii #1#2 { \protected@csedef{#1}{#2} }

\DeclareExpandableDocumentCommand{\fpeval}{om}
  {
    \IfValueTF {#1}
      { \fp_to_tl:n { round(#2,#1) } }
      { \fp_to_tl:n {#2} }
  }

\NewDocumentCommand {\geraden } {r[]r[]}
{
\assignvalues{nachkommastellen}{3}
\assignvalues{#1}{#2}
\fp_set:Nn \kgerade {(\by - \ay) / (\bx - \ax) } % Lineare 
\fp_set:Nn \dgerade {\by - (\bx * \kgerade)}  % Lineare 
\fp_set:Nn \ygesucht {\dgerade + \kgerade * \gesucht}

\begin{table}[htbp]
\centering
\begin{tabular}{|L{3.55cm}|L{2.55cm}|L{2.55cm}|} \hline
\textbf{Punkt} & \textbf{X-Koordinate} & \textbf{Y-Koordinate} \\ \hline
Punkt\  1 & \fpeval[\nachkommastellen]{\ax } & \fpeval[\nachkommastellen]{\ay } \\ \hline
\textit{Gesuchter\ Punkt} & \textit{ \fpeval[\nachkommastellen]{\gesucht }} &   \textit{\fpeval[\nachkommastellen]{\ygesucht }} \\ \hline
Punkt\  2 & \fpeval[\nachkommastellen]{\bx } & \fpeval[\nachkommastellen]{\by } \\ \hline
\end{tabular}
\end{table}
}
\ExplSyntaxOff
\makeatother


\begin{document}

\geraden[ax|ay|bx|by|gesucht][20|190|30|150|22]

%The Question which has to be solved is, that I can Call first

%fst: \determinevalues{22} => Should give =Pax,Pay,Pbx,Pby.

%secondly I want to call:

\assignvalue{suchwert}{22}
%\geraden[ax|ay|bx|by|gesucht][\pax|\pay|\pbx|\pby|\suchwert]

\end{document}

答案1

为了解决您对从数据数组中提取单个元素的担忧,我建议使用这个readarray包。它可以获取一个\def或一个空格分隔的数据文件,并将数据填充到二维或三维数据数组中,然后可以逐个元素地调用这些数据数组。

在最新的编辑中,我输出了一个字符串,其中包含我认为所需的内容\assignvalues。但我不清楚这是否是用户想要的,或者我是否真的创建了一个命令分配。

\documentclass{article}
\usepackage{readarray}
\usepackage{ifthen}
\def\dataB{%
10  100
20  130
30  150
40  170
50  190
60  210
}
\def\firstx#1{\Arrayij{#1}{\suchrow}{1}}
\def\firsty#1{\Arrayij{#1}{\suchrow}{2}}
\def\secondx#1{\Arrayij{#1}{\suchrowp}{1}}
\def\secondy#1{\Arrayij{#1}{\suchrowp}{2}}
\newcounter{index}
\newcounter{rowvalue}
\newcounter{testvalue}
\newcommand\suchwert[2]{%
  \setcounter{index}{0}%
  \setcounter{testvalue}{#2}
  \whiledo{\value{index} < \csname#1ROWS\endcsname}{%
    \addtocounter{index}{1}%
    \edef\tmp{\csname#1X\roman{index}Xi\endcsname}%
    \setcounter{rowvalue}{\tmp}%
    \ifthenelse{\value{rowvalue} > \value{testvalue}}%
    {\edef\suchrowp{\arabic{index}}%
     \addtocounter{index}{-1}%
     \edef\suchrow{\arabic{index}}%
     \setcounter{index}{\csname#1ROWS\endcsname}%
    }
    {\def\suchrow{NOT-FOUND}}
  }
  \bs assignvalues\{firstx\}\{\firstx{dB}\}\\
  \bs assignvalues\{firsty\}\{\firsty{dB}\}\\
  \bs assignvalues\{secondx\}\{\secondx{dB}\}\\
  \bs assignvalues\{secondy\}\{\secondy{dB}\}\\
}
\def\bs{\ttfamily\char'134}
\parindent 0in
\begin{document}
%   Instead of the \def\dataB above, you can read from a 
%   space-separated data file into \dataB with the 
%   following command:
%\readdef{tempdatab.dat}{\dataB}
\readArrayij{\dataB}{dB}{2}

\suchwert{dB}{35}

\suchwert{dB}{55}

\suchwert{dB}{45}

\end{document}

相关内容