Передача возвращаемого значения команды в другую функцию

Передача возвращаемого значения команды в другую функцию

Я пытаюсь передать значение команды в другую функцию, но безуспешно. Например, у меня есть некоторые данные, \DTLloaddb[noheader, keys={key,value}]{definitions}{\data.def}к которым я обращаюсь с помощью \DTLfetch{definitions}{key}{MyFromDate}{value}.

Теперь я хочу передать это значение из data.def(например, 1990-10-09) в\printdate{} чтобы я мог отформатировать эту дату в предпочитаемом мной языковом формате:9 октября 1990 г..

Я думал, что смогу легко передать свое возвращаемое значение, которое хранится в \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>.

Я не нашел способа сделать это легко с помощьюизодатапакет.
Поэтому я предлагаю не использоватьизодатапакет, но с использованием пакетовдатавремя2иdatetime2-calcкоторые исходят от автора, который также написалинструмент данныхупаковка,Доктор Никола Тэлбот.

Используя эти пакеты, вы можете легко определить новые стили даты в соответствии со своими предпочтениями:

\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}

введите описание изображения здесь

Связанный контент