具有 keyval 选项的类,由 keyval 对列表组成

具有 keyval 选项的类,由 keyval 对列表组成

我正在尝试弄清楚如何编写一个允许使用键值选项的类,其中键被称为people,它将获取分组键值对的列表(例如, nametitlerole),然后处理该信息并将其排版到列表中。如果role存在,列表的格式应如下:

  • title namerole

如果role不存在的话:

  • title name

我知道我可以这样做,只需在将数据作为值传递时手动格式化数据,就像下面的最小示例一样,但我希望能够拥有像这样的界面:

所需接口

\documentclass[
  people={
    {title={Doctor},name={John Smith},role={Role}},
    {title={Doctor},name={Jane Smith},role={}}}
]{myclass}

姆韦

我的类名.cls

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{myclass}

\LoadClass[oneside,letterpaper]{memoir}

\RequirePackage{kvoptions}
\DeclareStringOption[]{people}
\ProcessKeyvalOptions*

\RequirePackage{etoolbox}
\newcommand*{\mypeople}[1]{%
  \begin{itemize}
    \expandafter\forcsvlist\expandafter\item\expandafter{#1}
  \end{itemize}}

\newcommand{\makemypage}{%
  \pagestyle{empty}
  \thispagestyle{empty}
  \begin{titlingpage}
    \begin{center}
      \mypeople{\myclass@people}
    \end{center}
  \end{titlingpage}}

\endinput

我的文件.tex

\documentclass[people={{Mr. John Smith, Role}, {Mrs. Jane Smith}}]{myclass}

\begin{document}
  \makemypage
\end{document}

是否有一个好的方法来编写类文件以便它可以提供所需的接口?

答案1

下面的方法可以工作(请注意,出于个人喜好,我使用expkv和朋友实现了以下步骤;免责声明:我是包作者)。

它循环遍历您的列表并使用另一个 key=value 集来解析单个人的密钥。role通过将 和 进行比较来检查 是否存在\@empty,如果它不为空(\unless),我们输出role(对 也执行相同的操作,title以便让那些没有头衔的可怜人被命名)。

类文件:

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{myclass}

\LoadClass[oneside,letterpaper]{memoir}

\RequirePackage{expkv-def}

\ekvdefinekeys{myclass/people}
  {
     long store title = \myclass@people@title
    ,long store role  = \myclass@people@role
    ,long store name  = \myclass@people@name
  }
\ekvsetdef\myclass@people@options{myclass/people}
\newcommand*\myclass@people{}% <- WAS MISSING
\newcommand\people[1]{\edef\myclass@people{\unexpanded{#1}}}

\newcommand*\mypeople[1]
  {%
    \unless\ifx\myclass@people\@empty
      \begin{itemize}
        \expandafter\ekvcsvloop\expandafter\mypeople@aux\expandafter{#1}%
      \end{itemize}%
    \fi
  }
\newcommand\mypeople@aux[1]
  {%
    \item
    \begingroup
      \myclass@people@options{#1}%
      \unless\ifx\myclass@people@title\@empty
        \myclass@people@title\space
      \fi
      \myclass@people@name
      \unless\ifx\myclass@people@role\@empty
        , \myclass@people@role
      \fi
    \endgroup
  }

\newcommand{\makemypage}{%
  \pagestyle{empty}
  \thispagestyle{empty}
  \begin{titlingpage}
    \begin{center}
      \mypeople{\myclass@people}
    \end{center}
  \end{titlingpage}}

\endinput

文档:

\documentclass[]{myclass}
\people{
  {title={Doctor},name={John Smith},role={Role}},
  {title={Doctor},name={Jane Smith},role={}}}

\begin{document}
  \makemypage
\end{document}

输出:

在此处输入图片描述


笔记:

上面根本没有使用类选项(因为对于这个例子来说它不再是必要的),你当然可以使用kvoptions类选项,或者使用expkv-opt及其\ekvoProcessLocalOptions

相关内容