将返回的命令值传递给另一个函数

将返回的命令值传递给另一个函数

我尝试将命令的值传递给另一个函数,但没有成功。例如,我有一些数据,\DTLloaddb[noheader, keys={key,value}]{definitions}{\data.def}我可以使用 访问\DTLfetch{definitions}{key}{MyFromDate}{value}

现在我想将这个值从data.def(例如 1990-10-09)传递到,以便\printdate{}我可以将该日期格式化为我的语言首选格式:1990 年 10 月 9 日

我以为我可以轻松地将存储在中的返回值传递\DTLfetch{}\printdate{}但没有成功:\printdate{\DTLfetch{definitions}{key}{MyFromDate}{value}}会引发类似以下错误:! Illegal parameter number in definition of \iso@date.\DTLfetch{definitions}{key}{MyFromDate}单独调用将打印未格式化的(原始)日期值而不会出现任何问题。

不幸的是,我找不到有关将函数值传递给另一个函数的任何帮助资源。如果有人能为我提供有关此主题的附加信息,我将非常高兴。谢谢!

答案1

缺少一个最小(非)工作示例,展示您使用的包/文档类以及调用宏的方式。

我认为\DTLfetch来自数据工具包并\printdate来自异酸包裹。


一方面,该命令\DTLfetch本身并不是一个完全可扩展的命令。这意味着,只要调用该命令,就会执行(临时)赋值等操作。

另一方面,\printdate期望它的参数只包含

  • 两者都是完全可扩展的,并且在某个阶段的扩展只会产生属于形成日期的字符序列的标记
  • 或属于构成日期的字符序列。

但是该命令\DTLfetch不仅仅是打印/返回一个值,它还将该值保存到宏中\dtlcurrentvalue
\dtlcurrentvalue进而完全可扩展。

因此,调用之后您可以立即在 的参数中\DTLfetch使用该宏。\dtlcurrentvalue\printdate

正如刚才所说,\DTLfetch也打印返回值。

如果您不希望打印该值,请不要使用该命令\DTLfetch,而是使用该命令\DTLgetvalueforkey(在另一个参数内),该命令允许您指定要(重新)定义以扩展为所需返回值的宏的名称。

\documentclass[english]{article}
\usepackage{datatool}
\usepackage[num]{isodate}
\usepackage{filecontents}

\begin{filecontents*}{MyDataFile.def}
WhatsoeverKeyA,WhatsoeverValueA
WhatsoeverKeyB,WhatsoeverValueB
MyFromDate,1990-10-09
WhatsoeverKeyC,WhatsoeverValueC
\end{filecontents*}


\newcommand\data{MyDataFile}
\DTLloaddb[noheader, keys={key,value}]{definitions}{\data.def}

\begin{document}

This does both print the return-value and save the return-value to
\verb|\dtlcurrentvalue|:

\verb|\DTLfetch{definitions}{key}{MyFromDate}{value}|:
\DTLfetch{definitions}{key}{MyFromDate}{value}\\
\begingroup\footnotesize
\verb|% use the database "definitions".|\\
\verb|% use the column whose name is "value".|\\
\verb|% use the row which in the column "key" holds the item "MyFromData".|
\endgroup

\verb|\dtlcurrentvalue| yields: \dtlcurrentvalue

Now you can use \verb|\dtlcurrentvalue| within the argument of 
\verb|\printdate|.

\verb|\printdate{\dtlcurrentvalue}| yields: \printdate{\dtlcurrentvalue}

\hrulefill

This does just save the return-value to the macro \verb|\MyCommand|:


\verb|\DTLgetvalueforkey{\MyCommand}{value}{definitions}{key}{MyFromDate}|\\
\begingroup\footnotesize
\verb|% define the macro "\MyCommand".|\\
\verb|% use the database "definitions".|\\
\verb|% use the column whose name is "value".|\\
\verb|% use the row which in the column "key" holds the item "MyFromData".|
\endgroup

\DTLgetvalueforkey{\MyCommand}{value}{definitions}{key}{MyFromDate}        

\verb|\MyCommand| yields: \MyCommand

Now you can use \verb|\MyCommand| within the argument of
\verb|\printdate|.

\verb|\printdate{\MyCommand}| yields: \printdate{\MyCommand}

\end{document}

在此处输入图片描述


您希望将日期格式化为:
<name of the month><non-break-space><day>,<space><year>

我没有找到一种方法来轻松实现这一点异酸包。
因此我建议不要使用异酸包,但使用包datetime2datetime2-计算这些都出自于数据工具包裹,尼古拉·塔尔博特博士

使用这些包,您可以根据自己的喜好轻松定义新的日期样式:

\documentclass[english]{article}
\usepackage{datatool, datetime2, datetime2-calc}
\usepackage{filecontents}

\DTMnewdatestyle{MyDatestyle}{% definitions
  % the \number does remove leading zeros from the "day"-element of the date.
  \renewcommand*{\DTMdisplaydate}[4]{\DTMmonthname{##2}~\number##3, ##1}%
  \renewcommand*{\DTMDisplaydate}{\DTMdisplaydate}%
}

\begin{filecontents*}{MyDataFile.def}
WhatsoeverKeyA,WhatsoeverValueA
WhatsoeverKeyB,WhatsoeverValueB
MyFromDate,1990-10-09
WhatsoeverKeyC,WhatsoeverValueC
\end{filecontents*}

\newcommand\data{MyDataFile}
\DTLloaddb[noheader, keys={key,value}]{definitions}{\data.def}

\begin{document}

A new date-style can be defined using \textbf{datetime2 and datetime2-calc}:
\begin{verbatim}
\DTMnewdatestyle{MyDatestyle}{% definitions
  % the \number does remove leading zeros from the "day"-element of the date.
  \renewcommand*{\DTMdisplaydate}[4]{\DTMmonthname{##2}~\number##3, ##1}%
  \renewcommand*{\DTMDisplaydate}{\DTMdisplaydate}%
}
\end{verbatim}

\hrulefill

This does both print the return-value and save the return-value to
\verb|\dtlcurrentvalue|:

\verb|\DTLfetch{definitions}{key}{MyFromDate}{value}|:
\DTLfetch{definitions}{key}{MyFromDate}{value}\\
\begingroup\footnotesize
\verb|% use the database "definitions".|\\
\verb|% use the column whose name is "value".|\\
\verb|% use the row which in the column "key" holds the item "MyFromData".|
\endgroup

\verb|\dtlcurrentvalue| yields: \dtlcurrentvalue

Now you can use \verb|\dtlcurrentvalue| within the argument of
\verb|\DTMdate| and \verb|\DTMDate|.
\begin{verbatim}
\begingroup
\DTMsetdatestyle{MyDatestyle}
\DTMdate{\dtlcurrentvalue}

\DTMDate{\dtlcurrentvalue}
\endgroup
\end{verbatim}%
yields:

\begingroup
\DTMsetdatestyle{MyDatestyle}
\DTMdate{\dtlcurrentvalue}

\DTMDate{\dtlcurrentvalue}
\endgroup

\hrulefill

This does just save the return-value to the macro \verb|\MyCommand|:

\verb|\DTLgetvalueforkey{\MyCommand}{value}{definitions}{key}{MyFromDate}|\\
\begingroup\footnotesize
\verb|% define the macro "\MyCommand".|\\
\verb|% use the database "definitions".|\\
\verb|% use the column whose name is "value".|\\
\verb|% use the row which in the column "key" holds the item "MyFromData".|
\endgroup

\DTLgetvalueforkey{\MyCommand}{value}{definitions}{key}{MyFromDate}

\verb|\MyCommand| yields: \MyCommand


Now you can use \verb|\MyCommand| within the argument of
\verb|\DTMdate| and \verb|\DTMDate|.
\begin{verbatim}
\begingroup
\DTMsetdatestyle{MyDatestyle}
\DTMdate{\MyCommand}

\DTMDate{\MyCommand}
\endgroup
\end{verbatim}%
yields:

\begingroup
\DTMsetdatestyle{MyDatestyle}
\DTMdate{\MyCommand}

\DTMDate{\MyCommand}
\endgroup

\end{document}

在此处输入图片描述

相关内容