将 xkeyval 键预设为 \thetitle 或 \theauthor

将 xkeyval 键预设为 \thetitle 或 \theauthor

我正在编写一个 LaTeX 模板,几乎完成了(!!!)但我很难理解xkeyval\presetkeys行为。我设法设置了一些默认值,但当将它们设置为\theauthor和时\thetitle,键被设置为空字符串,即使它们是在\author{}\title{}命令之后设置的。

这是一个 mwe:

我的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
}

麦格

\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

您明确设置了默认值,如果您传入没有值的authortitle键,则使用该默认值为空

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

相关内容