
Bei neuen Seiten kommt es zu merkwürdigem Verhalten(danke an David Carlisle für den Hinweis, dass es nicht nur so ist \clearpage
)dadurch wird die Möglichkeit beeinträchtigt, \hypersetup
später im Dokument darauf zuzugreifen.
Ich generiere meine Metadaten nach einer neuen Seite, daher muss ich diese Daten irgendwie für den nächsten Durchlauf speichern.
Weitere Einzelheiten finden Sie in der Demonstration weiter unten.
Code
\documentclass{article}
\usepackage{fontspec} % typeset with xelatex
\usepackage{hyperref}
\newcommand\insertproducer{placeholder}
\hypersetup{pdfproducer=Tester Schmoe (set in preamble)}
\AtEndDocument{%
\renewcommand\insertproducer{Tester Schmidt (set in body just before end)}
\hypersetup{pdfproducer=\insertproducer}
}%
\begin{document}
\null
%\clearpage % <-- uncommenting this results in \hypersetup failure
\end{document}
pdfinfo test.pdf
Ausgabe (kommentiert \clearpage
)
Erwartete Ausgabe.
Creator: LaTeX with hyperref package
Producer: Tester Schmidt (set in body just before end)
CreationDate: Tue Jun 7 12:13:48 2016
Tagged: no
Pages: 1
Encrypted: no
Page size: 612 x 792 pts (letter)
File size: 2149 bytes
Optimized: no
PDF version: 1.5
pdfinfo test.pdf
Ausgabe (unkommentiert \clearpage
)
Unerwartete Ausgabe.
Creator: LaTeX with hyperref package
Producer: Tester Schmoe (set in preamble)
CreationDate: Tue Jun 7 12:16:44 2016
Tagged: no
Pages: 1
Encrypted: no
Page size: 612 x 792 pts (letter)
File size: 2138 bytes
Optimized: no
PDF version: 1.5
Antwort1
Sie können Ihre Einrichtung auf verschiedene Weise vereinfachen.
\documentclass{article}
\usepackage{hyperref}
\hypersetup{pdfproducer=Tester Schmitty (set in preamble)}
\AtBeginDocument{%
\hypersetup{
pdfproducer = \myproducer,
}
}
\makeatletter
\newcommand*\myhypersetuptoaux[1]{% command to tell LaTeX to save the value for the next run
\AtEndDocument{%
\immediate\write\@auxout{\string\my@producer{#1}}%
}%
}
\newcommand*{\my@producer}[1]{\protected@xdef\myproducer{#1}}
\newcommand*{\myproducer}{% initial value
This baby needs extra TLC, run it again.%
}
\makeatother
\begin{document}
\null
\clearpage
\myhypersetuptoaux{Tester Schmoe}
\end{document}
Das ist mein Ergebnis pdfinfo
nach dem ersten Durchlauf
Title:
Subject:
Keywords:
Author:
Creator: LaTeX with hyperref package
Producer: This baby needs extra TLC, run it again.
CreationDate: Thu Jun 9 09:17:16 2016
ModDate: Thu Jun 9 09:17:16 2016
Tagged: no
Form: none
Pages: 1
Encrypted: no
Page size: 612 x 792 pts (letter) (rotated 0 degrees)
File size: 8416 bytes
Optimized: no
PDF version: 1.5
und das ist, was ich nach dem zweiten Durchlauf bekomme:
Title:
Subject:
Keywords:
Author:
Creator: LaTeX with hyperref package
Producer: Tester Schmoe
CreationDate: Thu Jun 9 09:20:39 2016
ModDate: Thu Jun 9 09:20:39 2016
Tagged: no
Form: none
Pages: 1
Encrypted: no
Page size: 612 x 792 pts (letter) (rotated 0 degrees)
File size: 8389 bytes
Optimized: no
PDF version: 1.5
Antwort2
AUX-Dateilösung
Dies könnte möglicherweise vereinfacht werden und möglicherweise Schwächen aufweisen. Ich fange gerade an, mit dem Schreiben/Lesen von AUX-Dateien zu experimentieren.
Es ist sehr wichtig zu beachten, dass bestimmte Dinge schon früh im Dokument festgelegt werden MÜSSEN:
\hypersetup{
colorlinks=true,
linkcolor=red,
urlcolor=red,
hyperfootnotes=false,
hypertexnames,
bookmarks=true % Causes clash if hyperref parameters loaded before bookmark, because bookmark loads hyperref without any parameters
}
- Dadurch werden die Metadaten wie folgt in die AUX-Datei geschrieben:
z.B
\mysetproducer{Tester Schmoe}
- Der nächste Lauf analysiert aux unmittelbar danach
\begin{document}
und führt aus:
z.B
\mysetproducer{Tester Schmoe}
was wiederum einen Befehl erzeugt, my@pdfproducer
der enthältTester Schmoe
z.B
\expandafter\xdef\csname my@pdfproducer\endcsname{#1}}
- Der Befehl auf Benutzerebene
\myproducer
greift auf diesen Wert zu, wenn das Makro vorhanden ist (nur nachdem die AUX-Datei erstellt wurde, also nach mindestens einem Durchlauf).
z.B
\expandafter\ifx\csname my@pdfproducer\endcsname\relax This baby needs extra TLC, run it again.\else
\csname my@pdfproducer\endcsname\fi}
Vollständiger Code
\documentclass{article}
\usepackage{fontspec} % typeset with xelatex
\usepackage{hyperref}
\usepackage{atveryend}
\hypersetup{pdfproducer=Tester Schmitty (set in preamble)}
\AtBeginDocument{%
\hypersetup{
pdfproducer = \myproducer{}
}
}
\makeatletter
\newcommand*\myhypersetuptoaux[1]{% command to tell LaTeX to save the value for the next run
%\AfterLastShipout{%
\immediate\write\@auxout{%
%\protected@write\@mainaux{}{%
\string\mysetproducer{#1}%
%}%
}%
%}%
}
\makeatother
\makeatletter
\newcommand*{\mysetproducer}[1]{% called by the aux file and creates command my@producer that expands to input of myhypersetuptoaux
\expandafter\xdef\csname my@pdfproducer\endcsname{#1}}
\makeatother
\makeatletter
\newcommand*{\myproducer}{% user-level command to retrieve value of my@pdfproducer
\expandafter\ifx\csname my@pdfproducer\endcsname\relax This baby needs extra TLC, run it again.\else
\csname my@pdfproducer\endcsname\fi}
% \@ifundefined{stored@#1}{???}{\csname stored@#1\endcsname}%
\makeatother
\begin{document}
\null
\clearpage
\myhypersetuptoaux{Tester Schmoe}
\end{document}