Predefinindo chaves xkeyval para \thetitle ou \theauthor

Predefinindo chaves xkeyval para \thetitle ou \theauthor

Estou escrevendo um modelo LaTeX e estou quase terminando (!!!), mas estou tendo muita dificuldade em entender o comportamento xkeyvalde \presetkeys. Consegui definir alguns padrões, mas quando se trata de configurá-los \theauthore \thetitleas chaves são definidas como strings vazias, mesmo que sejam definidas após os comandos \author{}e .\title{}

Aqui está um mwe:

meu_mwe.cls

\RequirePackage{expl3}

\ProvidesExplClass{my_mwe}
                  {2020/09/08}
                  {1.0}
                  {Minimal working example}

\LoadClass{report}

\RequirePackage{xkeyval}
\RequirePackage{xparse}

\AtBeginDocument{%
    \define@key{my_mwe} {author} [] {\def\my_mwe@author{#1}}
    \define@key{my_mwe} {title}  [] {\def\my_mwe@title{#1}}
    \presetkeys{my_mwe} {author}    {author={\theauthor}}
    \presetkeys{my_mwe} {title}     {title=\thetitle}
}

\NewDocumentCommand{\MWECommand}{O{}}{%
    \setkeys{my_mwe}{author, title, #1}%

    Here's~the~output:\\
    \my_mwe@title \\
    \my_mwe@author
}

mwe.tex

\documentclass[10pt, a4paper]{my_mwe}

\usepackage{titling}
    \author{The poor crying author}
    \title{A sad mwe}

\begin{document}

\MWECommand%

\MWECommand[title=\thetitle, author=\theauthor]

\end{document}

O que espero é que a chamada básica MWECommandfaça o mesmo que a argumentada, mas em vez disso as \theauthorstrings \thetitlee sejam impressas apenas na segunda. O que estou fazendo de errado?

Responder1

Você está definindo explicitamente o valor padrão, que será usado se você passar as chaves authorou titlesem um valor, para ficar vazio com

\define@key{my_mwe}{author}[]{\def\my_mwe@author{#1}}

O valor especificado entre colchetes seria o padrão (que neste caso está vazio). A \presetkeysmacro define um valor inicial, que é um valor que será usado se a chave não for definida explicitamente.

Agora na sua macro você coloca author, title, #1o seu \setkeys, então o padrão e não os valores iniciais serão usados. E os padrões estão vazios.

Então a maneira mais fácil seria remover author, titleda sua definição (também removi a linha vazia na definição, pois duvido que você queira ter um \paraí, qual seria o resultado):

\RequirePackage{expl3}

\ProvidesExplClass{my_mwe}
                  {2020/09/08}
                  {1.0}
                  {Minimal working example}

\LoadClass{report}

\RequirePackage{xkeyval}
\RequirePackage{xparse}

\AtBeginDocument{%
    \define@key{my_mwe} {author} [] {\def\my_mwe@author{#1}}
    \define@key{my_mwe} {title}  [] {\def\my_mwe@title{#1}}
    \presetkeys{my_mwe} {author}    {author={\theauthor}}
    \presetkeys{my_mwe} {title}     {title=\thetitle}
}

\NewDocumentCommand{\MWECommand}{O{}}{%
    \setkeys{my_mwe}{#1}%
    Here's~the~output:\\
    \my_mwe@title \\
    \my_mwe@author
}

informação relacionada