
Ich schreibe eine LaTeX-Vorlage und bin fast fertig (!!!), aber es fällt mir sehr schwer, xkeyval
das Verhalten von zu verstehen. Ich habe es geschafft, einige Standardwerte festzulegen, aber wenn ich sie auf und \presetkeys
setze, werden die Schlüssel auf leere Zeichenfolgen gesetzt, obwohl sie nach den Befehlen und gesetzt werden .\theauthor
\thetitle
\author{}
\title{}
Hier ist ein MWE:
my_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}
Ich erwarte, dass der grundlegende Aufruf MWECommand
dasselbe bewirkt wie der argumentierte Aufruf, aber stattdessen werden die \theauthor
und \thetitle
-Zeichenfolgen nur im zweiten Aufruf gedruckt. Was mache ich falsch?
Antwort1
Sie legen den Standardwert, der verwendet wird, wenn Sie die Schlüssel author
oder title
ohne Wert übergeben, explizit auf leer fest mit
\define@key{my_mwe}{author}[]{\def\my_mwe@author{#1}}
Der in Klammern angegebene Wert wäre der Standardwert (der in diesem Fall leer ist). Das \presetkeys
Makro legt einen Anfangswert fest, d. h. einen Wert, der verwendet wird, wenn der Schlüssel überhaupt nicht explizit festgelegt wird.
Jetzt geben Sie in Ihrem Makro author, title, #1
Ihr ein \setkeys
, sodass die Standardwerte und nicht die Anfangswerte verwendet werden. Und die Standardwerte sind leer.
Der einfachste Weg wäre also, author, title
aus Ihrer Definition zu entfernen (ich habe auch die leere Zeile in der Definition entfernt, da ich bezweifle, dass Sie dort ein haben möchten \par
, was das Ergebnis wäre):
\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
}