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