PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie aktuellen Timestamp für pdfinfo (CreationDate) generieren?



casualcoder
01-09-2015, 17:51
Hallo LaTeX-Experten,

für ein Xelatex-Dokument setze ich mit \hypersetup, pdfinfo { CreationDate={D:yyyymmddhhmmss} } momentan noch händisch einen Zeitpunkt für die Pdf-Generierung. Das würde ich gern automatisch vom Compiler erledigen lassen.
Es klappt aber nur zur Hälfte, sprich, für das Datum - "20150901" - nicht für den Rest.
Gebe ich die Variablen später im Dokument aus, sind diese korrekt.

Dazu ein Minibeispiel:

%!TEX TS-program = xelatex
%!TEX encoding = UTF-8

\documentclass[fontsize=11pt]{scrartcl}

\newcommand{\SumOne}{John Doe}
\usepackage{xltxtra}

% ----Versuch------------
\usepackage{datetime}
\settimeformat{hhmmsstime}
\renewcommand{\timeseparator}{}
% Cf. http://tex.stackexchange.com/a/237251
\def\datestamp{\leavevmode\hbox{\the\year\twodigit s\month\twodigits\day}}
\def\twodigits#1{\ifnum#1<10 0\fi\the#1}
\newcommand{\ModStamp}{\datestamp\currenttime}
% ---- bis hier ---------

\setmainfont{Consolas}

\usepackage{hyperref}
\hypersetup{
pdfauthor={\SumOne},
pdfinfo={
CreationDate={D:20150901200000}, % Inhalt von \ModStamp
ModDate={D:\datestamp\currenttime} % klappt auch nicht, "\datestamp" allein schon
},
pdftitle={Minibeispiel}
}
\setlength{\parindent}{0pt}

%---------------BEGIN DOCUMENT-----------
\begin{document}
\textbackslash ModStamp: "{}\ModStamp"{}
\newline
\textbackslash currenttime: "{}\currenttime"{}
\end{document}

Ich teste die Eigenschaften mit SumatraPDF 3.0.

Wo liegt der (Denk-)Fehler?
Danke für eure Unterstützung!

rais
02-09-2015, 20:36
für ein Xelatex-Dokument setze ich mit \hypersetup, pdfinfo { CreationDate={D:yyyymmddhhmmss} } momentan noch händisch einen Zeitpunkt für die Pdf-Generierung. Das würde ich gern automatisch vom Compiler erledigen lassen.

Ja warum lässt Du den Compiler denn nicht? CreationDate wird AFAICS bereits korrekt belegt, wenn Du pdfinfo={...} aus dem \hpersetup einfach weglässt ...


Es klappt aber nur zur Hälfte, sprich, für das Datum - "20150901" - nicht für den Rest.
Gebe ich die Variablen später im Dokument aus, sind diese korrekt.

Sieht so aus, als wäre \currenttime nicht expandierbar, was die ganzen `Token not allowed in a PDF string'-Meldungen erklären würde, die Du bekommen dürftest.
Du könntest es mit dem datetime-Nachfolger datetime2 versuchen (NB: das stellt übrigens auch einen \DTMtwodigits-Befehl zur Verfügung, d.h. einen eigenen \twodigits bräuchtest Du damit nicht), dessen Makros sind größtenteils als expandierbar definiert, AFAICS.

VG

casualcoder
03-09-2015, 13:09
Noch bin ich nicht so weit, aber später würde ich CreationDate gern auf ein früheres Datum und ModDate auf den exakten Kompilier-Zeitpunkt setzen.

Mit datetime2 tue ich mir schwer, mir fehlen Praxisbeispiele (anders als für datetime) da ich kein Experte bin. (Und so etwas (http://tex.stackexchange.com/a/251829) ist mir noch zu weit weg.)
Ich habe im Dokumenten-Kopf so etwas

\usepackage{datetime2}
\DTMsetup{
datesep={},
timesep={}
}stehen, um im Dokumenten-Körper testweise
\DTMnow00auszugeben.
XeTeX gibt keine Sekunden aus! Diese auf "00" zu setzen stört mich nicht, frage mich nur, ob man das eleganter hinbekommt...

Was ich auch noch nicht herausbekommen habe: Wie erzeuge ich Ausgaben wie 20150903130100 ohne \today zu ändern?
Eigentlich will ich ja nur für eine Variable die Darstellung YYYYMMDDHHmmss erhalten.

Im Zieldokument soll für \today weiterhin erscheinen: 3. September 2015
:confused:

u_fischer
03-09-2015, 14:40
Die datetime-Befehle sind nicht expandierbar und deine \hbox ist auch ziemlich seltsam. Du solltest dir eigene Befehle bauen. Z.B:


\documentclass[fontsize=11pt]{scrartcl}
\usepackage{expl3}
\ExplSyntaxOn

\int_new:N\g_my_curhour_int
\int_new:N\g_my_curmin_int


\int_gset:Nn\g_my_curhour_int{\int_div_truncate:nn {\time}{60}}
\int_gset:Nn\g_my_curmin_int{\int_mod:nn{\time}{60 }}


\cs_new:Npn\mycurrenttime
{
\int_use:N\g_my_curhour_int
:
\int_compare:nNnT{\g_my_curmin_int}<{10}{0}
\int_use:N\g_my_curmin_int
:00
}


\cs_new:Npn\mydatestamp
{
\int_use:N\year
\int_compare:nNnT{\month}<{10}{0}
\int_use:N\month
\int_compare:nNnT{\day}<{10}{0}
\int_use:N\day
}
\ExplSyntaxOff

\usepackage{hyperref}
\hypersetup{
pdfinfo={
CreationDate={D:20150901200000}, %
ModDate={D:\mydatestamp--\mycurrenttime}
},
pdftitle={Minibeispiel}
}
\begin{document}
\mydatestamp--\mycurrenttime
\end{document}