在 kvoptions 中使用 utf8 字符

在 kvoptions 中使用 utf8 字符

这个问题实际上很简单,但我还没有找到可行的解决方案。

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 文件看起来真的很奇怪 奇怪的 PDF

有什么方法可以解决这个问题,例如让kvoptions我们理解utf8输入吗?


实际上,这里已经有人问过类似的问题了。

我可以将 kvoptions - DeclareStringOption 与西班牙语字符一起使用吗?

问题是给出的两种解决方案都不再起作用(至少对我来说):

  1. 原包作者@海科·奥伯迪克提供了kvoptions-patch包,可以在之前加载mysty(有关详细信息,请参阅帖子)。此包可以解决所有问题,但自 3.14 版以来kvoptions,此包不再支持 2020 年 10 月或更新版本的 LaTeX(请参阅kvoptions' 文档,第 4.1 章,第 12 页)。
  2. 用户@埃格尔通过使用提供了另一种解决方案\scantokens,在我的例子中可以转化为
    % Right after `\ProcessKeyvalOptions*`
    \@ifundefined{mysty@sometitle}{}{%
        \scantokens\expandafter{\expandafter\def\expandafter\mysty@sometitle\expandafter{\mysty@sometitle}}%
    }
    
    我不太了解低级 TeX/LaTex 命令等,但提供的解决方案不起作用。即使没有(在给选项赋值后\@ifundefined...不会定义??),只有单词\mysty@sometitle即时将从 PDF 中消失(见上图)。
  3. 受到@egreg的启发,我尝试了类似的方法:
    % After `\ProcessKeyvalOptions*`
    \renewcommand{\mysty@sometitle}{\scantokens{\mysty@sometitle\empty}}
    
    但是 PDF 中只包含标题,而不是@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所示,将产生没有错误的输出。

相关内容