Übergeben des zurückgegebenen Befehlswerts an eine andere Funktion

Übergeben des zurückgegebenen Befehlswerts an eine andere Funktion

Ich versuche, den Wert eines Befehls an eine andere Funktion zu übergeben, aber ohne Erfolg. Ich habe beispielsweise einige Daten, \DTLloaddb[noheader, keys={key,value}]{definitions}{\data.def}auf die ich mit zugreife \DTLfetch{definitions}{key}{MyFromDate}{value}.

Jetzt möchte ich diesen Wert von data.def(z. B. 09.10.1990) an übergeben \printdate{}, damit ich dieses Datum in das von mir bevorzugte Format in meiner Sprache formatieren kann:9. Oktober 1990.

Ich dachte, ich könnte meinen zurückgegebenen Wert, der in gespeichert ist, einfach übergeben, aber \DTLfetch{}ohne \printdate{}Erfolg: \printdate{\DTLfetch{definitions}{key}{MyFromDate}{value}}erzeugt einen Fehler wie: ! Illegal parameter number in definition of \iso@date.aber der \DTLfetch{definitions}{key}{MyFromDate}alleinige Aufruf druckt den unformatierten (rohen) Datumswert ohne Probleme.

Leider konnte ich keine Hilferessourcen zum Übergeben von Funktionswerten an eine andere Funktion finden. Ich würde mich freuen, wenn mir jemand weitere Informationen zu diesem Thema geben könnte. Danke!

Antwort1

Es fehlt ein minimales (nicht) funktionierendes Beispiel, das zeigt, welche Pakete/Dokumentklassen Sie verwenden und auf welche Weise Makros aufgerufen werden.

Ich nehme an, \DTLfetchkommt von derDatentoolPaket und \printdatekommt aus demIsodatPaket.


Einerseits \DTLfetchhandelt es sich bei dem Befehl selbst nicht um einen vollständig erweiterbaren Befehl. Das bedeutet, dass (temporäre) Zuweisungen und dergleichen immer dann ausgeführt werden, wenn dieser Befehl aufgerufen wird.

Andererseits \printdateerwartet er, dass sein Argument nur Token enthält, die

  • entweder vollständig erweiterbar sind und deren Erweiterung irgendwann nur noch Tokens ergibt, die zur Zeichenfolge gehören, die das Datum bildet
  • oder zu der das Datum bildenden Zeichenfolge gehören.

Der Befehl \DTLfetchdruckt/gibt aber nicht nur einen Wert zurück, sondern speichert diesen Wert auch im Makro \dtlcurrentvalue.
\dtlcurrentvalueist wiederum vollständig erweiterbar.

Daher können Sie das Makro direkt nach dem Aufruf innerhalb des Arguments von \DTLfetchverwenden .\dtlcurrentvalue\printdate

Wie gerade gesagt, \DTLfetchdruckt es auch den zurückgegebenen Wert.

Wenn Sie nicht möchten, dass der Wert gedruckt wird, verwenden Sie nicht den Befehl \DTLfetch, sondern stattdessen den Befehl, \DTLgetvalueforkeymit dem Sie – innerhalb eines anderen Arguments – den Namen eines Makros angeben können, das (neu) definiert werden soll, um es auf den gewünschten Rückgabewert zu erweitern.

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

Bildbeschreibung hier eingeben


Sie möchten das Datum wie folgt formatieren:
<name of the month><non-break-space><day>,<space><year>.

Ich habe keine Möglichkeit gefunden, dies einfach mit demIsodatPaket.
Daher empfehle ich, nicht dasIsodatPaket, aber mit den PaketenDatum/Uhrzeit2Unddatetime2-calcdie vom Autor stammen, der auch dasDatentoolPaket,Nicola Talbot.

Mit diesen Paketen können Sie ganz einfach neue Datumsstile nach Ihren Wünschen definieren:

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

Bildbeschreibung hier eingeben

verwandte Informationen