newcommand 将文本变量更改为数字

newcommand 将文本变量更改为数字

来自主题:使用 excel 中的变量定位 newcommand 并出现错误缺少 begin{document}

如何使用带有文本变量列表的 newcommand 来更改数字列表?

例子:

AX - 1、AY - 0.5、AZ - 2.0、AA - 4

BY - 1, BB - 2, BZ - 2.4, BX -1

最小代码:

   \RequirePackage{filecontents}
\begin{filecontents*}{test.csv}
Acol, Bcol, NoCol
AX,BY,1
AY,BB,2
AZ,BX,3
AX,BB,4
AZ,BZ,5
\end{filecontents*}

\documentclass{article}
\usepackage{datatool}
\usepackage[absolute,overlay]{textpos}
\DTLloaddb{mydata}{test.csv}
\newcommand{\A}[1]{\ifcase#1
\or1\or2\or4\or2.5\or0.5\fi}
\newcommand{\B}[1]{\ifcase#1
\or2\or3\or1\or3.5\or7\fi}

\begin{document}

\DTLforeach*{mydata}{\A=Acol, \B=Bcol, \No=NoCol}%
{%
\begin{textblock*}{5cm}(\A cm,\B cm)
\No
\end{textblock*}A
\pagebreak
\newpage
}%

\end{document}

非常感谢

答案1

有多种方法可以做到这一点。既然你已经加载了datatool,那么使用它来做这件事可能更有意义。我有点依赖这个帖子,它解释了如何使用此工具创建关联数组。因此,您可以添加另一个数据库(我将其存储在中)distances.csv,然后您可以使用

\getDist{<macro>}{<key>}%

其中<macro>是存储结果的宏,<key>是标识符,即AX或 之类的东西BY。这可以在您的循环中构建。

\RequirePackage{filecontents}
\begin{filecontents*}{test.csv}
Acol, Bcol, NoCol
AX,BY,1
AY,BB,2
AZ,BX,3
AX,BB,4
AZ,BZ,5
\end{filecontents*}

\begin{filecontents*}{distances.csv}
ID,dist
Ax,1
AY,0.5
AZ,2.0
AA,4
BY,1
BB,2
BZ,2.4
BX,1
\end{filecontents*}

\documentclass{article}
\usepackage{datatool}
\usepackage[absolute,overlay]{textpos}
\DTLloaddb{mydata}{test.csv}
\DTLloaddb{distdata}{distances.csv}

\begin{document}
\newcommand*{\getDist}[2]{%
\DTLgetvalueforkey{#1}{dist}{distdata}{ID}{#2}%
}
% 
\DTLforeach*{mydata}{\A=Acol, \B=Bcol, \No=NoCol}%
{%
\getDist{\tmpA}{\A}%
\getDist{\tmpB}{\B}%
\begin{textblock*}{5cm}(\tmpA cm,\tmpB cm)
\No
\end{textblock*}A
\pagebreak
\newpage
}%
% 
\end{document}

请注意,这绝不是唯一的方法。我添加了一些功能相同但不依赖于任何包的东西,在这种情况下结果是可扩展的。您可以使用以下代码获取“in”中的值

  \AssignValues{{AX,1},{AY,0.5},{AZ,2.0},{AA,4},{BY,1},{BB,2},{BZ,2.4},{BX,1}}

并使用 读出它们\getpftnum{<key>}。这也可以(通过或多或少地复制例如 pgf 键所做的事情)。

\RequirePackage{filecontents}
\begin{filecontents*}{test.csv}
Acol, Bcol, NoCol
AX,BY,1
AY,BB,2
AZ,BX,3
AX,BB,4
AZ,BZ,5
\end{filecontents*}
\documentclass{article}
\usepackage{datatool}
\usepackage[absolute,overlay]{textpos}
\DTLloaddb{mydata}{test.csv}
\makeatletter
\def\assign@value#1,#2;{\expandafter\edef\csname pft@num#1\endcsname{#2}}
\newcommand{\AssignValues}[1]{\@for\next:=#1\do{\expandafter\assign@value\next;}}
\newcommand{\getpftnum}[1]{\csname pft@num#1\endcsname}
\makeatother
\begin{document}
\AssignValues{{AX,1},{AY,0.5},{AZ,2.0},{AA,4},{BY,1},{BB,2},{BZ,2.4},{BX,1}}

\DTLforeach*{mydata}{\A=Acol, \B=Bcol, \No=NoCol}%
{%
\begin{textblock*}{5cm}(\getpftnum{\A}cm,\getpftnum{\B}cm)
\No
\end{textblock*}A
\pagebreak
\newpage
}%
% 
\end{document}

相关内容