下面的expl3
类,提供了一个选项(mykeyword
)l3keys2e
,效果非常好:
\begin{filecontents*}{myclass.cls}
\RequirePackage{l3keys2e}
\RequirePackage{expl3}
\ExplSyntaxOn
\ProvidesExplClass
{myclass}
{2019/01/05}
{0.1}
{
My Nice Class.%
}
\NeedsTeXFormat{LaTeX2e}
\LoadClass { report }
\RequirePackage[utf8]{inputenc} % Useless nowadays
%
\tl_set:Nn \l__myclass_my_keyword_tl {Café}
\keys_define:nn { myclass }
{
mykeyword .tl_set:N = \l__myclass_my_keyword_tl,%
}%
\ProcessKeysOptions { myclass }
\AtEndDocument{\l__myclass_my_keyword_tl}
\end{filecontents*}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\documentclass{myclass}
% \documentclass[mykeyword=Bar]{myclass}
% \documentclass[mykeyword=Café]{myclass}
\begin{document}
Foo and
\end{document}
可以看出:
- 默认值选项包含重音符号(“Café”),这没有问题,
- 可以为此选项赋予一些值,例如“Bar”,
- 一些价值观不能可以给此选项赋值,例如“Café”(实际上,与默认值相同!),更一般地,任何包含重音的值。在这种情况下,编译失败并出现以下错误:
! 未定义控制序列。\UseTextAccent ...up @firstofone \let @curr@enc \cf@encoding @use@text@en...
我该如何修复此问题?
编辑
作为一种解决方法,可以在不是级别\documentclass
而是在“设置”命令中使用此选项,如以下 MWE 所示:
\begin{filecontents*}{myclass.cls}
\RequirePackage{l3keys2e}
\RequirePackage{xparse}
\ExplSyntaxOn
\ProvidesExplClass
{myclass}
{2019/01/05}
{0.1}
{
My~Nice~Class.%
}
\NeedsTeXFormat{LaTeX2e}
\LoadClass { report }
\RequirePackage[utf8]{inputenc}
%
\tl_set:Nn \l__myclass_my_keyword_tl {Café}
\keys_define:nn { myclass }
{
mykeyword .tl_set:N = \l__myclass_my_keyword_tl
}%
\NewDocumentCommand \myclasssetup { m } {
\keys_set:nn { myclass } { #1 }
}
\ProcessKeysOptions { myclass }
\AtEndDocument{\l__myclass_my_keyword_tl}
\end{filecontents*}
\documentclass{myclass}
\myclasssetup{mykeyword=blé}
\begin{document}
Foo and
\end{document}
答案1
这是一个非常普遍的问题,例如:
\RequirePackage{xstring}
\StrBehind*{Café}{f}[\var]
确实生成,使用 pdflatex:
This is pdfTeX, Version 3.14159265-2.6-1.40.19 (TeX Live 2018/Arch Linux) (preloaded format=pdflatex)
restricted \write18 enabled.
entering extended mode
(./b.tex
LaTeX2e <2018-12-01>
(/usr/share/texmf-dist/tex/generic/xstring/xstring.sty
(/usr/share/texmf-dist/tex/generic/xstring/xstring.tex))
! Undefined control sequence.
\UseTextAccent ...up \@firstofone \let \@curr@enc
\cf@encoding \@use@text@en...
l.2 \StrBehind*{Café}{f}
[\var]
! ==> Fatal error occurred, no output PDF file produced!
这最簡單解决方法是使用 XeLaTeX。
答案2
要解决此问题,请在使用任何重音之前使用包 [T1]fontenc。pdflatex
在 Linux 中运行时,这不会造成特别大的问题,但在使用 MacTeX 的 Mac Mojave 上运行时,这很重要。
\RequirePackage[T1]{fontenc}
\ProvidesClass{myclass}[Using accent: Café]
此答案基于丹尼斯·比图泽斯评论。