Предварительная установка ключей xkeyval на \thetitle или \theauthor

Предварительная установка ключей xkeyval на \thetitle или \theauthor

Я пишу шаблон LaTeX и почти закончил (!!!), но мне очень трудно понять xkeyvalповедение \presetkeys. Мне удалось установить некоторые значения по умолчанию, но когда дело доходит до их установки в \theauthorи \thetitleключи устанавливаются в пустые строки, хотя они устанавливаются после команд \author{}и \title{}.

Вот пример:

мой_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}

Я ожидаю, что базовый вызов MWECommandделает то же самое, что и аргументированный, но вместо этого строки \theauthorи \thetitleпечатаются только во втором. Что я делаю не так?

решение1

Вы явно устанавливаете пустое значение по умолчанию, которое используется, если вы передаете ключи authorили titleбез значения.

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

Значение, указанное в скобках, будет значением по умолчанию (которое в данном случае пусто). Макрос \presetkeysзадает начальное значение, то есть значение, которое будет использоваться, если ключ вообще не задан явно.

Теперь в вашем макросе вы вставляете author, title, #1свой \setkeys, поэтому будут использоваться значения по умолчанию, а не начальные значения. А значения по умолчанию пустые.

Поэтому самым простым способом будет удалить author, titleиз вашего определения (я также удалил пустую строку в определении, так как сомневаюсь, что вы хотите иметь \parтам, что было бы результатом):

\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
}

Связанный контент