Innerhalb der Klasse festgelegte PDF-Infovariablen

Innerhalb der Klasse festgelegte PDF-Infovariablen

Ich habe eine einfache benutzerdefinierte Klasse mycustom.clswie folgt definiert:

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{mycustom}[2019/03/06 My custom class]
\LoadClass{article}
\RequirePackage{hyperxmp}
\RequirePackage[unicode]{hyperref}


\newcommand{\name}[2]{
    \def\@name{#1}
    \def\@surname{#2}
    \def\@fullname{#1 #2}
}

\newcommand{\address}[4]{
    \def\@neighborhood{#1}
    \def\@city{#2}
    \def\@state{#3}
    \def\@country{#4}
}
\endinput

Und eine minimale TeX-Datei mwe.tex:

\documentclass{mycustom}

\name{John}{Smith}
\address{Spring Falls}{Helena-West Helena}{AR}{United States of America}

\makeatletter
\hypersetup{%
    pdftitle={\@fullname \cs{ } title},
    pdfsubject={\@neighborhood},
    pdfauthor={\@fullname},
    pdfcontactcity={\@city},
    pdfcontactcountry={\@country},
    pdfmetalang={en}
}
\makeatother

\begin{document}
    foo bar barz
\end{document}

Dazu habe ich zwei Fragen:

  1. Warum wird das Dokument kompiliert, gibt aber Undefined control sequence. }in Zeile 14 ein zurück?

  2. \hypersetupIst es möglich , sie statt in die Hauptdatei in die Klasse (mit den Variablen) zu verschieben ?

Versucht mit PDFTeX und XeTeX.

Antwort1

Ihr Code enthält zwei undefinierte Befehle:

  1. \phone: Fügen Sie \newcommand{\phone}[1]{\def\@phone{#1}}Ihre Klassendatei hinzu.
  2. \cs{ }: löschen Sie es einfach pdftitleoder korrigieren Sie es, damit es ein gültiger Befehl wird (siehe Punkt 1).

Mit dem folgenden MWE (Paket filecontentswird in diesem MWE nur verwendet, um beide Tex-Codes zu einem kompilierbaren MWE zu verketten, ändern Sie bitte einfach Ihre Klassendatei):

\begin{filecontents*}{mycustom.cls}
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{mycustom}[2019/03/06 My custom class]
\LoadClass{article}
\RequirePackage{hyperxmp}
\RequirePackage[unicode]{hyperref}


\newcommand{\name}[2]{
    \def\@name{#1}
    \def\@surname{#2}
    \def\@fullname{#1 #2}
}

\newcommand{\address}[4]{
    \def\@neighborhood{#1}
    \def\@city{#2}
    \def\@state{#3}
    \def\@country{#4}
}

\newcommand{\phone}[1]{\def\@phone{#1}} % <=============================
\endinput
\end{filecontents*}



\documentclass{mycustom}

\name{John}{Smith}
\phone{+1 123 555-1234}
\address{Spring Falls}{Helena-West Helena}{AR}{United States of America}

\makeatletter
\hypersetup{%
%   pdftitle={\@fullname \cs{ } title}, % <=============================
    pdftitle={\@fullname  title}, % <===================================
    pdfsubject={\@neighborhood},
    pdfauthor={\@fullname},
    pdfcontactcity={\@city},
    pdfcontactcountry={\@country},
    pdfmetalang={en}
}
\makeatother

\begin{document}
    foo bar barz
\end{document}

Sie erhalten keine Fehler und das Ergebnis:

resultierendes PDF

Um den kompletten Befehl \hypersetupin die Klassendatei zu verschieben, kann command verwendet werden \AtBeginDocument{...}. Dadurch wird sichergestellt, dass alle \@nameBefehle usw. definiert sind, wenn \hypersetupaufgerufen wird:

\begin{filecontents*}{mycustom.cls}
% https://tex.stackexchange.com/questions/478520/pdf-info-variables-set-inside-the-class
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{mycustom}[2019/03/06 My custom class]
\LoadClass{article}
\RequirePackage{hyperxmp}
\RequirePackage[unicode]{hyperref}


\newcommand{\name}[2]{%
  \def\@name{#1}%
  \def\@surname{#2}%
}

\def\@fullname{\@name\ \@surname}

\newcommand{\address}[4]{%
  \def\@neighborhood{#1}%
  \def\@city{#2}%
  \def\@state{#3}%
  \def\@country{#4}%
}

\newcommand{\phone}[1]{\def\@phone{#1}}


\AtBeginDocument{% <====================================================
  \hypersetup{%
    pdftitle={\@fullname\ title}, 
    pdfsubject={\@neighborhood},
    pdfauthor={\@fullname},
    pdfcontactcity={\@city},
    pdfcontactcountry={\@country},
    pdfmetalang={en}
  }
} % <===================================================================
\endinput
\end{filecontents*}


\documentclass{mycustom}

\usepackage[T1]{fontenc}

\name{John}{Smith}
\phone{+1 123 555-1234}
\address{Spring Falls}{Helena-West Helena}{AR}{United States of America}


\begin{document}
    foo bar barz \makeatletter\@fullname\makeatother
\end{document}

verwandte Informationen