我想LaTeX
使用创建一个带有可选参数的类LaTeX3
。但我在将保存参数值的标记列表转换为字符串时遇到了问题。我想知道如何正确地做到这一点,即使我处理类选项的整个策略都是错误的。我发现学习expl3
非常非常困难。
无论我如何尝试将标记列表转换为字符串,它似乎只是返回 LaTeX 源代码。我觉得我已经尝试了\tl_to_str:n
和的每:V
一个排列组合\str_set:Nn
:NV
但我可能没有,否则我就不需要问这个问题了。
对于我正在创建的类,一个可选参数将允许最终用户选择底层文档类。article
如果没有class
提供任何参数,则默认为:
\documentclass{apple}
将使用默认类article
,而\documentclass[class=book]{apple}
将使用指定的类book
我认为这是一个好策略
- 定义一个字符串常量作为默认值
\str_const:Nn \c__apple_base_class_str { article }
- 使用字符串常量作为参数值的种子
- 处理完类选项后,使用字符串保存最终值
编辑:使用字符串的原因是,如果我理解正确的话,标记列表用于将要排版的内容,而字符串(例如 LaTeX 就有)用于不会排版的内容。来源LaTeX3 中的标记列表与字符串
断位的 MWE
\str_new:N \l__apple_base_class_str
\str_set:Nn \l__apple_base_class_str { \tl_to_str:n \l__apple_class_tl }
完整 MWE
该代码源自已接受的答案如何用 expl3 正确编写初始化部分。我认为这是指定和处理类选项的正确方法。
\NeedsTeXFormat{LaTeX2e}
\RequirePackage{expl3,xparse,l3keys2e}
\ProvidesExplClass{apple}
{2022/06/27} {0.0} {My first class}
\str_const:Nn \c__apple_base_class_str { article }
\keys_define:nn { apple }
{
, class .tl_set:N = \l__apple_class_tl
, class .initial:n = { \c__apple_base_class_str }
, class .value_required:n = true
}
\str_new:N \l__apple_base_class_str
\str_set:Nn \l__apple_base_class_str { \tl_to_str:n \l__apple_class_tl }
\iow_term:x { tl~of~class:~\tl_use:N \l__apple_class_tl }
\iow_term:x { str~of~class:~\str_use:N \l__apple_base_class_str }
\ProcessKeysOptions { apple }
\LoadClass { \str_use:N \l__apple_base_class_str }
输出
Document Class: apple 2022/06/27 v0.0 My first class
tl of class: article
str of class: \tl_to_str:n \l__apple_class_tl
! LaTeX Error: File `\tl_to_str:n \l__apple_class_tl .cls' not found.
LuaHBTeX, Version 1.15.0 (MiKTeX 22.3)
如果重要的话,进行编译。
答案1
你做得过分了。将值存储在 tl-var 中并使用它。
以下需要当前的 latex(它现在具有内置密钥处理器,因此不再需要加载 l3keys2e)。
\begin{filecontents}{apple.cls}
\NeedsTeXFormat{LaTeX2e}
\ProvidesExplClass{apple}
{2022/06/27} {0.0} {My first class}
\keys_define:nn { apple }
{
, class .tl_set:N = \l__apple_class_tl
, class .initial:n = { article }
, class .value_required:n = true
}
\ProcessKeyOptions
\iow_term:x { tl~of~class:~\tl_use:N \l__apple_class_tl }
\LoadClass { \l__apple_class_tl }
\end{filecontents}
\documentclass[class=book]{apple}
\begin{document}
aaa
\end{document}
答案2
如果您想使用字符串,很好,但不要将它们与 tl 变量混合。您在 之前进行转换\ProcessKeyOptions
,因此 的值\l__apple_class_tl
仍然是初始值。
\NeedsTeXFormat{LaTeX2e}
\RequirePackage{expl3,xparse,l3keys2e}
\ProvidesExplClass{apple} {2022/06/27} {0.0} {My first class}
\str_const:Nn \c__apple_base_class_str { article }
\keys_define:nn { apple }
{
class .str_set:N = \l__apple_class_str ,
class .initial:V = \c__apple_base_class_str ,
class .value_required:n = true ,
}
\iow_term:x { tl~of~class:~\str_use:N \l__apple_class_str }
\ProcessKeysOptions { apple }
\LoadClass { \str_use:N \l__apple_class_str }