
Я пишу шаблон 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
}