我正在编写一个 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
您明确设置了默认值,如果您传入没有值的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
}