这个问题实际上很简单,但我还没有找到可行的解决方案。
在kvoptions
包中,您可以为以字符串作为值的自定义包定义选项键,例如
% `mysty.sty`, assuming it is correctly saved in `$TEXMFHOME` and indexed
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{mysty}
% Preload input encoding and language, I'm German
\RequirePackage[utf8]{inputenc}
\RequirePackage[T1]{fontenc}
\RequirePackage[ngerman]{babel}
% Declare option, the value is then saved in `\mysty@sometitle`
\RequirePackage{kvoptions}
\DeclareStringOption{sometitle}
\ProcessKeyvalOptions*
\title{\mysty@sometitle}
\author{me}
\date{\today}
\endinput
% `myfile.tex`
\documentclass{article}
% Note the German *umlaut* `ü`, a non-ASCII character
\usepackage[sometitle={Programmiervorkurs für Erstis}]{mysty}
\begin{document}
\maketitle
\end{document}
这将产生错误消息,大部分形式为Missing } inserted
(就在之前\maketitle
)和To many }'s
,而(令人惊讶的是)编译后的 PDF 文件看起来真的很奇怪
有什么方法可以解决这个问题,例如让kvoptions
我们理解utf8
输入吗?
实际上,这里已经有人问过类似的问题了。
问题是给出的两种解决方案都不再起作用(至少对我来说):
- 原包作者@海科·奥伯迪克提供了
kvoptions-patch
包,可以在之前加载mysty
(有关详细信息,请参阅帖子)。此包可以解决所有问题,但自 3.14 版以来kvoptions
,此包不再支持 2020 年 10 月或更新版本的 LaTeX(请参阅kvoptions
' 文档,第 4.1 章,第 12 页)。 - 用户@埃格尔通过使用提供了另一种解决方案
\scantokens
,在我的例子中可以转化为
我不太了解低级 TeX/LaTex 命令等,但提供的解决方案不起作用。即使没有(在给选项赋值后% Right after `\ProcessKeyvalOptions*` \@ifundefined{mysty@sometitle}{}{% \scantokens\expandafter{\expandafter\def\expandafter\mysty@sometitle\expandafter{\mysty@sometitle}}% }
\@ifundefined...
不会定义??),只有单词\mysty@sometitle
即时将从 PDF 中消失(见上图)。 - 受到@egreg的启发,我尝试了类似的方法:
但是 PDF 中只包含标题,而不是% After `\ProcessKeyvalOptions*` \renewcommand{\mysty@sometitle}{\scantokens{\mysty@sometitle\empty}}
@sometitle
标题。我猜这个@
符号结束了标记列表(我不想要)。存储在临时变量中也无济于事。我不知道如何解决这个问题。
答案1
这应该“很快”就会起作用,但需要一些更新。
kvoptions
尚未更新为使用从文档传递的“原始”选项,经典选项参数通过 edef 传递,并且 utf-8 字符被破坏,如您所见。
所以现在添加
\expandafter\let\csname [email protected]\expandafter\endcsname
\csname @raw@[email protected]\endcsname
在mysty.sty
处理参数之前。
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{mysty}
% replace the option string by the raw option string (requires a newish latex)
\expandafter\let\csname [email protected]\expandafter\endcsname
\csname @raw@[email protected]\endcsname
% Preload input encoding and language, I'm German
\RequirePackage[utf8]{inputenc} % not required unless you have an old latex.
\RequirePackage[T1]{fontenc}
\RequirePackage[ngerman]{babel}
% Declare option, the value is then saved in `\mysty@sometitle`
\RequirePackage{kvoptions}
\DeclareStringOption{sometitle}
\ProcessKeyvalOptions*
\title{\mysty@sometitle}
\author{me}
\date{\today}
\endinput
这应该足够了,但不幸的是,原始选项字符串仍然会在某一时刻被处理,从而产生错误。这个问题已在下一个 LaTeX 版本(将于 2021 年 11 月发布)的源代码中得到修复,但您已经可以使用pdflatex-dev
包含此修复的预发布版本。
因此,pdflatex-dev myfile
如上mysty.sty
所示,将产生没有错误的输出。