无法保留 xkeyval 中的空格

无法保留 xkeyval 中的空格

我在用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的截图: 在此处输入图片描述

请参阅下面的 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}

输出:

在此处输入图片描述

相关内容