我在我的文档类中使用它kvoptions
,到目前为止它运行良好,但在进行重大重写之后,我开始收到奇怪的错误,我能够将其追溯到包中babel
。
梅威瑟:
%% myclass.cls
\NeedsTeXFormat{LaTeX2e}[2018/04/01]
\ProvidesClass{myclass}
\RequirePackage[patch]{kvoptions}
\DeclareStringOption{title}
\ProcessKeyvalOptions*
\LoadClass{article}
\title{\myclass@title}
\RequirePackage[english]{babel}
\endinput
\documentclass[title={Here be dragons}]{myclass}
\begin{document}
Lorem Ipsum
\end{document}
日志摘录(为简洁起见省略了路径):
babel.sty:460: LaTeX Error: Missing \begin{document}. [ {}}]
babel.sty:460: Too many }'s. [ {}}]
babel.sty:475: LaTeX Error: Missing \begin{document}. [ \ifin@\edef\bbl@tempc{\bbl@tempb}\fi}]
如果没有kvoptions
补丁,错误会变得更加严重:
babel.sty:339: LaTeX Error: Missing \begin{document}. [\ProcessOptions*]
babel.sty:339: You can't use `macro parameter character #' in horizontal mode. [\ProcessOptions*]
TeX STOPPED: File ended while scanning use of \reserved@{##1,##2\reserved@b }\def \reserved@b ##1,\reserved@b ##2\reserved@b
TeX reports the error was in file:3
myclass.cls:13: LaTeX Error: Unknown option `english' for package `babel'. []
分析:问题是我在全局选项 ( title
) 中使用了空格(和括号),而这个选项显然被传递给了babel
。如果没有空格,就不会发生错误。
问题:我可以防止文档类选项被包用作全局选项吗?或者是否有一些类似的解决方法\hypersetup{}
供我使用,而不是选项?我可以接受。
答案1
我通过从中汲取灵感来解决这个问题对另一个问题的回答。应用到上面的 MWE 上,它看起来会像这样:
%% myclass.cls
\NeedsTeXFormat{LaTeX2e}[2018/04/01]
\ProvidesClass{myclass}
\RequirePackage{kvoptions}
\DeclareStringOption{title}
\ProcessKeyvalOptions*
\LoadClass{article}
\newcommand*{\docsetup}[1]{
\kvsetkeys{myclass}{#1}
\title{\myclass@title}
\RequirePackage[english]{babel}
}
\endinput
\documentclass{myclass}
\docsetup{title={An awesome title}}
\begin{document}
Lorem Ipsum
\end{document}