用xkeyval给文档类设置选项会报错?

发布于 2022-03-25 12:00:57

testclass.cls:

\ProvidesClass{testclass}
\NeedsTeXFormat{LaTeX2e}

\RequirePackage{xkeyval}

\define@key{family}{key1}[]{\def\mytext{#1}}
\define@key{family}{key2}[]{\def\MyText{#1}}
\presetkeys{family}{key1=12345, key2=abcde}{}

\DeclareOptionX{text}{\setkeys{family}{#1}}
\ProcessOptionsX
\ExecuteOptionsX{text={key1=12345, key2=abcde}}

\LoadClass{ctexbook}

main.tex,不会报错:

\documentclass{testclass}
\begin{document}
    \mytext

    \MyText
\end{document}

main.tex,会报错:

\documentclass[text={key1=67890}]{testclass}
\begin{document}
    \mytext

    \MyText
\end{document}

错误信息如下:

main.tex:
\RequirePackage or \LoadClass in Options Section.

The font size command \normalsize is not defined:

Unused global option(s):
    [text={key1=67890}].

testclass.cls:
Missing \begin{document}.

You can't use `macro parameter character #' in horizontal mode.
\@removeelement #1#2#3->\def \reserved@a ##1,#1,##

Paragraph ended before \reserved@a was complete.
<to be read again> 

请问有什么办法能解决?

查看更多

关注者
0
被浏览
1.4k
鱼香肉丝没有鱼先生
脾气不好,别来惹我!!!
  • 很抱歉,我不熟悉 xkeyval 包的使用方法,短时间内我不愿意花时间去阅读这个包
  • 我将以 l3keys 为您演示,给您提供另一个方案

testclass.cls

\ProvidesClass{testclass}
\NeedsTeXFormat{LaTeX2e}

\RequirePackage{l3keys2e}
\ExplSyntaxOn
%定义 keyval,第一个参数为模块名,第二个参数为所要设置的 keyval 列表
\keys_define:nn{family} 
{
  name.tl_set:N = \l_name_tl,
  age.int_set:N = \l_age_int,
}


\def\myname{\textbf{\tl_use:N \l_name_tl}}
\def\myage{\textbf{\int_use:N \l_age_int}} 
% 设置默认值
\keys_set:nn{family}
{
  name = ljguo,
  age  = 21,
}
\ExplSyntaxOff
% 传递 family 模块的 keyval list 给 class
\ProcessKeysOptions{family}
\LoadClass{ctexbook}

main.tex

\documentclass{testclass}
\begin{document}
my name is \myname, and i am \myage ~years old.
\end{document}

这将得到:
2.png

\documentclass[name = zhangsan,age = 81]{testclass}
\begin{document}
my name is \myname, and i am \myage ~years old.
\end{document}

这将得到:
1.png

  • 请使用 texdoc interface3 了解更详细的用法
2 个回答
Sagittarius Rover
Sagittarius Rover 2024-12-07
我要成为TikZ糕手/(ㄒoㄒ)/~~

不建议使用xkeyval宏包了,latex2e kernel setup (based on l3keys)已经足够支持键值对的选项。

从你的代码来说,只要删除testclass.cls\ExecuteOptionsX{text={key1=12345, key2=abcde}}的命令即可,\ExecuteOptionsX用于声明默认选项,不应该放在\ProcessOptionsX之后。但即使如此做,虽然可以传递option,但仍会导致出现LaTeX Warning: Unused global option(s):[text={key1=67890}]的提示,这也是不推荐使用的原因。

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览