將 xkeyval 鍵預設為 \thetitle 或 \theauthor

將 xkeyval 鍵預設為 \thetitle 或 \theauthor

我正在編寫一個 LaTeX 模板,並且即將完成(!!!),但我很難理解xkeyval\presetkeys行為。我已經設法設置了一些預設值,但是當涉及到將它們設置為\theauthor和鍵時,即使它們是在和命令\thetitle之後設置的,但鍵也設置為空字串。\author{}\title{}

這是一個 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
}

特克斯

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

相關內容