Ich habe eine einfache benutzerdefinierte Klasse mycustom.cls
wie 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:
Warum wird das Dokument kompiliert, gibt aber
Undefined control sequence. }
in Zeile 14 ein zurück?\hypersetup
Ist 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:
\phone
: Fügen Sie\newcommand{\phone}[1]{\def\@phone{#1}}
Ihre Klassendatei hinzu.\cs{ }
: löschen Sie es einfachpdftitle
oder korrigieren Sie es, damit es ein gültiger Befehl wird (siehe Punkt 1).
Mit dem folgenden MWE (Paket filecontents
wird 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:
Um den kompletten Befehl \hypersetup
in die Klassendatei zu verschieben, kann command verwendet werden \AtBeginDocument{...}
. Dadurch wird sichergestellt, dass alle \@name
Befehle usw. definiert sind, wenn \hypersetup
aufgerufen 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}