Я пытаюсь передать значение команды в другую функцию, но безуспешно. Например, у меня есть некоторые данные, \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}