
新頁面有一些奇怪的行為(感謝大衛卡萊爾指出這不僅僅是\clearpage
)\hypersetup
這會破壞文檔後面的能力。
我在新頁面後產生元數據,因此我需要以某種方式儲存這些數據以供下次運行。
詳細資訊請參考下面的演示。
程式碼
\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
輸出(已註\clearpage
)
預期輸出。
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
輸出(未註記\clearpage
)
意外的輸出。
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
答案1
您可以透過多種方式簡化您的設定。
\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}
pdfinfo
這是我第一次運行後得到的結果
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
這是我第二次運行後得到的結果:
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
答案2
AUX 檔案解決方案
這可能會被簡化,並且可能存在弱點。我剛開始嘗試寫入/讀取 AUX 檔案。
值得注意的是,某些事情必須在文件的早期設定:
\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
}
- 這會將元資料寫入 aux 文件,如下所示:
例如
\mysetproducer{Tester Schmoe}
- 下次運行會立即解析 aux
\begin{document}
並執行:
例如
\mysetproducer{Tester Schmoe}
這又創建了一個my@pdfproducer
包含以下內容的命令Tester Schmoe
例如
\expandafter\xdef\csname my@pdfproducer\endcsname{#1}}
- 如果巨集存在,使用者層級指令
\myproducer
會取得該值(僅在建立 aux 檔案之後-也就是至少運行一次之後)
例如
\expandafter\ifx\csname my@pdfproducer\endcsname\relax This baby needs extra TLC, run it again.\else
\csname my@pdfproducer\endcsname\fi}
完整程式碼
\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}