在\usepackage
级别上,xkeyval
允许我们在逗号分隔的值列表的值中插入逗号:将包含逗号的值括在括号中就足够了。例如,以下 MCE 效果很好。
\begin{filecontents*}{mypackage.sty}
\NeedsTeXFormat{LaTeX2e}[1999/12/01]%
\ProvidesClass{mypackage}[2013/11/17 v0.1 A test package]%
%
\RequirePackage{xkeyval}%
%
\def\@separator{}%
%
\DeclareOptionX{separator}[]{\def\@separator{#1}}%
\ExecuteOptionsX{separator}%
\ProcessOptionsX\relax%
%
\newcommand{\twoseparatedvalues}[2]{#1\@separator#2}%
%
\end{filecontents*}
%
\documentclass{article}
\usepackage[separator={,}]{mypackage}
%
\begin{document}
\twoseparatedvalues{foo}{bar}
\end{document}
但 AFAICS,在\documentclass
级别上,将值括在括号中是不可能的。例如,编译以下 MCE:
\begin{filecontents*}{myclass.cls}
\NeedsTeXFormat{LaTeX2e}[1999/12/01]%
\ProvidesClass{myclass}[2013/11/17 v0.1 A test class]%
%
\RequirePackage{xkeyval}%
%
\def\@separator{}%
%
\DeclareOptionX{separator}[]{\def\@separator{#1}}%
\ExecuteOptionsX{separator}%
\ProcessOptionsX\relax%
%
\newcommand{\twoseparatedvalues}[2]{#1\@separator#2}%
%
\LoadClass{article}%
\end{filecontents*}
%
\documentclass[separator={,}]{myclass}
%
\begin{document}
\twoseparatedvalues{foo}{bar}
\end{document}
引发错误:
! LaTeX Error: Missing \begin{document}.
顺便说一句,在级别上传递没有逗号的值\documentclass
,然后在括号中传递带有逗号的值,效果很好,如下面的 MCE 所示。
\begin{filecontents*}{myclass.cls}
\NeedsTeXFormat{LaTeX2e}[1999/12/01]%
\ProvidesClass{myclass}[2013/11/17 v0.1 A test class]%
%
\RequirePackage{xkeyval}%
%
\def\@separator{}%
%
\DeclareOptionX{separator}[]{\def\@separator{#1}}%
\ExecuteOptionsX{separator}%
\ProcessOptionsX\relax%
%
\newcommand{\twoseparatedvalues}[2]{#1\@separator#2}%
%
\LoadClass{article}%
\end{filecontents*}
%
\documentclass[separator=--]{myclass}
%
\begin{document}
\twoseparatedvalues{foo}{bar}
\setkeys{myclass.cls}{separator={,}}{}%
\twoseparatedvalues{foo}{bar}
\end{document}
因此我的问题是:如何在\documentclass
级别上传递(xkeyval)逗号分隔的值列表中的逗号值?
答案1
在 keyval 包的文档中,kvoptions
separat 包kvoptions-patch
也有文档记录。
LATEX 的包/类选项系统有一些严重的限制,如果选项用作键和值对,则尤其会影响值部分。
因此,为了解决一些限制,您可以加载包kvoptions-patch
而不会失去 -- 的功能,xkeyval
但您也可以切换到kvoptions
;-)
\begin{filecontents*}{myclass.cls}
\NeedsTeXFormat{LaTeX2e}[1999/12/01]%
\ProvidesClass{myclass}[2013/11/17 v0.1 A test class]%
%
\RequirePackage{kvoptions-patch}%%%NEW
\RequirePackage{xkeyval}%
%
\def\@separator{}%
%
\DeclareOptionX{separator}[]{\def\@separator{#1}}%
\ExecuteOptionsX{separator}%
\ProcessOptionsX\relax%
%
\newcommand{\twoseparatedvalues}[2]{#1\@separator#2}%
%
\LoadClass{article}%
\end{filecontents*}
%
\documentclass[separator={,}]{myclass}
%
\begin{document}
\twoseparatedvalues{foo}{bar}
\end{document}