Quero usar pgfopts (e, portanto, pgfkeys) ao personalizar uma classe com novas opções, mantendo as antigas e usando algumas delas.
Aqui está um exemplo simplificado com uma classe "exa" que estende "artigo" com uma nova opção, e também define a opção "a5paper".
\begin{filecontents}{exa.cls}
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{exa}[2014/03/19 exa]
% As "article" with "a5paper" set, and an extra option "lastword".
\RequirePackage{pgfopts}
\pgfkeys{
/exa/.cd,
lastword/.code=\AtEndDocument{\par The last word is #1.}
}
\ProcessPgfOptions{/exa}
\PassOptionsToClass{a5paper}{article}
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\ProcessOptions
\LoadClass{article}
\end{filecontents}
\documentclass[lastword=bar,twocolumn]{exa}
\usepackage{blindtext}
\begin{document}
\blindtext
\end{document}
As três opções funcionam conforme pretendido aqui; "a5paper" definido pela turma, "twocolumn" enviado para "article" e a nova opção "lastword". Mas dá um aviso sobre a opção global não utilizada ["lastword=bar]".
Como retirar todas as opções que o ProcessPgfOptions cuidou, para que apenas o restante seja enviado para o "artigo"?
Responder1
Você está misturando os dois métodos para definir opções, o que resulta no aviso.
\begin{filecontents}{exa.cls}
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{exa}[2014/03/19 exa]
% As "article" with "a5paper" set, and an extra option "lastword".
\RequirePackage{pgfopts}
%%% initialize the options
\def\exa@classoptions{a5paper}
\pgfkeys{
/exa/.cd,
lastword/.code=\AtEndDocument{\par The last word is #1.},
%%% unknown keys are assumed to be options to be passed to the class
.unknown/.code={\edef\exa@classoptions{\exa@classoptions,\pgfkeyscurrentname}}
}
\ProcessPgfOptions{/exa}
\LoadClass[\exa@classoptions]{article}
\end{filecontents}
\documentclass[lastword=bar,twocolumn]{exa}
\usepackage{lipsum}
\begin{document}
\lipsum[1-10]
\end{document}