断位的 MWE

断位的 MWE

我想LaTeX使用创建一个带有可选参数的类LaTeX3。但我在将保存参数值的标记列表转换为字符串时遇到了问题。我想知道如何正确地做到这一点,即使我处理类选项的整个策略都是错误的。我发现学习expl3非常非常困难。

无论我如何尝试将标记列表转换为字符串,它似乎只是返回 LaTeX 源代码。我觉得我已经尝试了\tl_to_str:n和的每:V一个排列组合\str_set:Nn:NV但我可能没有,否则我就不需要问这个问题了。

对于我正在创建的类,一个可选参数将允许最终用户选择底层文档类。article如果没有class提供任何参数,则默认为:

  • \documentclass{apple}将使用默认类article,而
  • \documentclass[class=book]{apple}将使用指定的类book

我认为这是一个好策略

  1. 定义一个字符串常量作为默认值\str_const:Nn \c__apple_base_class_str { article }
  2. 使用字符串常量作为参数值的种子
  3. 处理完类选项后,使用字符串保存最终值

编辑:使用字符串的原因是,如果我理解正确的话,标记列表用于将要排版的内容,而字符串(例如 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 }

相关内容