我正在创建一个具有不同内部函数的包,这些函数可以在包初始化期间使用提供的令牌进行设置。包内部的所有内容均使用 latex3 语法编写。
我在使用类似“switch-case”的命令(特别是使用 \tl_case:NnTF)评估标记时偶然发现了一个问题。调用我的命令 \checkStyle 时,我无法让它以正确的大小写输入,文档中的输出应该是 A、B 或 C。
我怀疑这是非常简单的事情,但是我对 latex3 的了解很少,无法找到来源。我在下面提供了一个最小的工作示例。
希望您能帮上忙。提前致谢。
排版.sty
\NeedsTeXFormat{LaTeX2e}[1994/06/01]
\ProvidesPackage{typeset}[2021/12/16 Typesetting Package]
% ------------------------ Load required packages
\RequirePackage{l3keys2e}
% ----------Trial
\ExplSyntaxOn
% Definition of the package options
\keys_define:nn { typeset }
{
% Create token list with opts
opt .tl_set:N = \l_typeset_opt_tl ,
deg .tl_set:N = \l_typeset_deg_tl ,
opt .initial:n = altern ,
deg .initial:n = other ,
}
\ExplSyntaxOff
% Process package options
\ExplSyntaxOn
\ProcessKeysOptions{ typeset }
\ExplSyntaxOff
% Create test case
\ExplSyntaxOn
\newcommand{ \test }
{
Content:~ \l_typeset_opt_tl , ~is~type~ \checkStyle{ \l_typeset_opt_tl }
\\
Content:~ \l_typeset_deg_tl , ~is~type~ \checkStyle{ \l_typeset_deg_tl }
}
\ExplSyntaxOff
% Token list switch-case
\ExplSyntaxOn
\tl_new:N \l_mytoken_tl
\tl_const:Nn \c__altern_tl { altern }
\tl_const:Nn \c__nomin_tl { nomin }
\tl_const:Nn \c__other_tl { other }
\cs_new_protected:Npn \checkStyle #1
{
\tl_set:Nn \l_mytoken_tl { #1 }
\tl_case:NnTF \l_mytoken_tl
{
\c__altern_tl {A}
\c__nomin_tl {B}
\c__other_tl {C}
}
{}
{None}
\\
Input~to ~checkstyle~was: {#1}
}
\ExplSyntaxOff
\endinput
主文本
\documentclass{article}
\usepackage[opt=nomin]{typeset}
\begin{document}
\test
\end{document}
输出:
答案1
你的问题是一个扩展问题。当你调用\checkStyle{\l_typeset_opt_tl}
这个时会创建一个如下的 token 列表:
\tl_set:Nn \l_mytoken_tl { \l_typeset_opt_tl }
这会与包含 或类似内容的内容进行比较altern
,这显然是不一样的。相反,您应该在转发之前扩展您的令牌列表。但总而言之,我认为对于您的用例,您不应该使用\tl_case:Nn
but \str_case:nn
。
此外,你的包使用了相当混乱的命名风格。在expl3
-syntax中全部您的变量、常量和宏应该遵循的命名约定expl3
,即不要使用\l_mytoken_tl
而是使用\l_typeset_mytoken_tl
或类似的名称(始终包含模块名称)。
我将使用以下代码来处理您的包:
\NeedsTeXFormat{LaTeX2e}
\ProvidesExplPackage{typeset}{2021/12/16}{0.0}{Typesetting Package}
% ------------------------ Load required packages
\RequirePackage{l3keys2e}
% ----------Trial
% Definition of the package options
\keys_define:nn { typeset }
{
% Create string with opts
opt .str_set:N = \l__typeset_opt_str ,
deg .str_set:N = \l__typeset_deg_str ,
opt .initial:n = altern ,
deg .initial:n = other ,
}
% Process package options
\ProcessKeysOptions{ typeset }
% Create test case
\NewDocumentCommand \test {}
{
Content:~ \str_use:N \l__typeset_opt_str , ~is~type~
\typeset_check_style:V \l__typeset_opt_str
\\
Content:~ \str_use:N \l__typeset_deg_str , ~is~type~
\typeset_check_style:V \l__typeset_deg_str
}
\cs_new_protected:Npn \typeset_check_style:n #1
{
\str_case:nnF {#1}
{
{ altern } {A}
{ nomin } {B}
{ other } {C}
}
{None}
\\
Input~to ~checkstyle~was: #1
}
\cs_generate_variant:Nn \typeset_check_style:n { V }
\endinput
答案2
你想测试内容变量,而不是变量。
typeset.sty
\NeedsTeXFormat{LaTeX2e}[1994/06/01]
\ProvidesPackage{typeset}[2021/12/16 Typesetting Package]
% ------------------------ Load required packages
\RequirePackage{l3keys2e}
% ----------Trial
\ExplSyntaxOn
% Definition of the package options
\keys_define:nn { typeset }
{
% Create token list with opts
opt .tl_set:N = \l_typeset_opt_tl ,
deg .tl_set:N = \l_typeset_deg_tl ,
opt .initial:n = altern ,
deg .initial:n = other ,
}
\ExplSyntaxOff
% Process package options
\ExplSyntaxOn
\ProcessKeysOptions{ typeset }
\ExplSyntaxOff
% Create test case
\ExplSyntaxOn
\newcommand{ \test }
{
Content:~ \l_typeset_opt_tl , ~is~type~ \typeset_checkstyle:V \l_typeset_opt_tl
\\
Content:~ \l_typeset_deg_tl , ~is~type~ \typeset_checkstyle:V \l_typeset_deg_tl
}
\ExplSyntaxOff
% Token list switch-case
\ExplSyntaxOn
\tl_new:N \l_mytoken_tl
\tl_const:Nn \c__altern_tl { altern }
\tl_const:Nn \c__nomin_tl { nomin }
\tl_const:Nn \c__other_tl { other }
\cs_new_protected:Npn \typeset_checkstyle:n #1
{
\tl_set:Nn \l_mytoken_tl { #1 }
\tl_case:NnF \l_mytoken_tl
{
\c__altern_tl {A}
\c__nomin_tl {B}
\c__other_tl {C}
}
{None}
\\
Input~to ~checkstyle~was: {#1}
}
\cs_generate_variant:Nn \typeset_checkstyle:n { V }
\ExplSyntaxOff
\endinput
`测试.tex
\documentclass{article}
\usepackage[opt=nomin]{typeset}
\begin{document}
\test
\end{document}