我在用xkeyval 包设置键“名称”。然后该值用于hyperref 包。请参见下面的示例代码:
文件:mysuperclass.cls
\ProvidesClass{mysuperclass}
\LoadClass{article}
\RequirePackage{xkeyval}%
\def\docauthorname{A. U. Thor}%
\def\docname{\jobname.tex}%
\def\docdate{\today}%
\define@key{mysuperclass.cls}{docdate}[\today]{%
\def\docdate{#1}%
}
\define@key{mysuperclass.cls}{author}[A. U. Thor]{%
\def\docauthorname{#1}%
}
\define@key{mysuperclass.cls}{docname}[]{%
\def\docname{#1}%
}
\ExecuteOptionsX{author,docdate}
\ProcessOptionsX%
\RequirePackage{fancyhdr}
\AtBeginDocument{%
\lhead[\docauthorname]{{\docauthorname}}%
\chead[\docdate]{\docdate}%
\rhead[]{\docname}%
\pagestyle{fancy}%
}
\RequirePackage{hyperref}
\hypersetup{%
pdfauthor={{\docauthorname}}%
}%
\endinput
文件:main.tex
\documentclass[docdate=1/1/2016,author=My Full Name with Spaces,docname=yelostfile]{mysuperclass}
\usepackage{blindtext}
\begin{document}
\blindtext[2]
\end{document}
请注意,以上代码取自这里。下面是生成的PDF的截图:
我发现了类似的问题这里并按照它。不幸的是,它似乎没有按预期工作。
我的问题是如何在 xkeyval 中保留空格?
解决方法
这实际答案给出@Skillmon它需要 TexLive 2021-06-01 并使用expkv-opt 包。@Skillmon,好心地建议了一种解决方法来避免这种依赖关系。我在下面发布了完整的代码以供参考:
\begin{filecontents}{mysuperclass.cls}
\ProvidesClass{mysuperclass}
\LoadClass{article}
\RequirePackage{xkeyval}
\RequirePackage{etoolbox}
\RequirePackage{hyperref}
\RequirePackage{fancyhdr}
\define@key{mysuperclass.cls}{docdate}[\today]{
\def\docdate{#1}
}
\define@key{mysuperclass.cls}{author}[A. U. Thor]{
\def\docauthorname{#1}
}
\define@key{mysuperclass.cls}{docname}[My Document]{
\def\docname{#1}
}
\ExecuteOptionsX{author,docdate,docname}
\ProcessOptionsX
\newcommand\setauthor[1]{
\setkeys{mysuperclass.cls}{author=#1}
}
\newcommand\setdocdate[1]{
\setkeys{mysuperclass.cls}{docdate=#1}
}
\newcommand\setdocname[1]{
\setkeys{mysuperclass.cls}{docname=#1}
}
\AtEndPreamble{
\hypersetup{
pdfauthor={{\docauthorname}}
}
\AtBeginDocument{
\lhead[\docauthorname]{{\docauthorname}}
\chead[\docdate]{\docdate}
\rhead[]{\docname}
\pagestyle{fancy}
}
}
\endinput
\end{filecontents}
\documentclass{mysuperclass}
\setauthor{My Full Name with Spaces}
\setdocdate{1/1/2016}
\setdocname{yelostfile}
\usepackage{blindtext}
\begin{document}
\blindtext[2]
\end{document}
答案1
喜欢@UlrikeFischer 说,LaTeX 的原始类/包选项解析会急切地删除空格。在最近的版本中,有一个原始选项列表,其中的空格不会被删除,但大多数包尚不支持解析此列表。
据我所知,目前唯一解析原始选项的包是expkv-opt
(免责声明:我是那篇文章的作者。)
以下用于直接expkv-opt
解析给定的选项列表mysuperclass.cls
(如果是通过加载的,则不会查看类选项,\LoadClass
为此您还必须添加\ekvoProcessGlobalOptions
)。要定义键,expkv-opt
您可以使用提供的低级接口expkv
,也可以使用使用expkv-def
带有一些预定义键类型的 key=value 接口来定义键。这个答案是后者。
\begin{filecontents}{mysuperclass.cls}
\ProvidesClass{mysuperclass}
\LoadClass{article}
\RequirePackage{expkv-def,expkv-opt}
\ekvdefinekeys{mysuperclass.cls}
{
store docdate = \docdate
,default docdate = \today
,initial docdate = \today
,store author = \docauthorname
,default author = A. U. Thor
,initial author = A. U. Thor
,store docname = \docname
,default docname = {}
,initial docname = \jobname.tex
}
\ekvoProcessLocalOptions{mysuperclass.cls}
\RequirePackage{fancyhdr}
\AtBeginDocument{%
\lhead[\docauthorname]{{\docauthorname}}%
\chead[\docdate]{\docdate}%
\rhead[]{\docname}%
\pagestyle{fancy}%
}
\RequirePackage{hyperref}
\hypersetup{%
pdfauthor={{\docauthorname}}%
}%
\endinput
\end{filecontents}
\documentclass[docdate=1/1/2016,author=My Full Name with Spaces,docname=yelostfile]{mysuperclass}
\usepackage{blindtext}
\begin{document}
\blindtext[2]
\end{document}
输出: