我正在编写一个宏,它接受一个 4 位十六进制值并根据输入执行某些操作。我希望实现用户可以对十六进制代码使用大写或小写字符。已经起作用的是:
\documentclass{article}
\usepackage{expl3,xparse}
\ExplSyntaxOn
\NewDocumentCommand{\actionForHEX}{m}{%
\str_case:nnF {#1}
{
{E085} {This is E085}
{E086} {This is E086}
}
{Unknown}
}
\ExplSyntaxOff
\begin{document}
Works: \actionForHEX{E085}
Does not work: \actionForHEX{e085}
\end{document}
因此,原则上我可以定义动作,但我不明白如何使用\str_flipcase:n
以允许大小写同样适用于小写。
基于用于字符串比较的可扩展不区分大小写的开关大小写我尝试了一些方法,但根本没有成功:
\ExplSyntaxOn
\NewDocumentCommand{\actionForHEX}{m}{%
\str_case_e:nn { \str_foldcase:e { #1 } }
{
{E085} {This is E085}
{E086} {This is E086}
}
}
\ExplSyntaxOff
好的,根据您的意见,我再次尝试了运气,但似乎我仍然不明白一些事情。这是我的新方法:
\documentclass{article}
\usepackage{expl3,xparse}
\ExplSyntaxOn
\NewDocumentCommand{\actionForHEX}{m}{%
\str_case:nnF { \str_foldcase:n { #1 } }
{
{e085} {This~is~E085}
{e086} {This~is~E086}
}
{Cannot~find~it}
}
\ExplSyntaxOff
\begin{document}
Does not work: \actionForHEX{E085}
Does not work: \actionForHEX{e085}
\end{document}
这导致Canot find it
两次调用\actionForHEX
答案1
正如评论中所解释的那样克尼德您需要分别与e085
和进行比较e086
,因为您要与大小写折叠的输入 ( \str_foldcase:n { #1 }
) 进行比较。广义上讲,大小写折叠是基于小写的,因此输入E085
会被折叠成e085
,这就是您需要与之进行比较的内容。
因为我们对输入应用了宏,所以我们不能直接将字符串与普通n
参数进行比较。我们需要确保\str_foldcase:n { #1 }
首先对其进行扩展。
可以按如下方式完成Skillmon 喜欢 topanswers.xyz的回答到用于字符串比较的可扩展不区分大小写的开关大小写和\str_case_e:nn
\ExplSyntaxOn
\NewDocumentCommand{\actionForHEX}{m}{%
\str_case_e:nn { \str_foldcase:n { #1 } }
{
{e085} {This~is~E085}
{e086} {This~is~E086}
}
}
\ExplSyntaxOff
该命令将使用新的e
-type 扩展完全扩展所有相关字符串。(因此\str_foldcase:n { #1 }
被扩展,这很好。并且e085
和e086
也被扩展,这有点毫无意义)。
我们可以通过生成 的变体来避免e085
和的扩展,这只会扩展e086
en
\str_case:nn
\str_foldcase:n { #1 }
\ExplSyntaxOn
\cs_generate_variant:Nn \str_case:nn { e }
\NewDocumentCommand{\actionForHEX}{m}{%
\str_case:en { \str_foldcase:n { #1 } }
{
{e085} {This~is~E085}
{e086} {This~is~E086}
}
}
\ExplSyntaxOff
如果您使用的是不具备 -type 扩展的旧系统e
,则可以尝试x
-type 扩展。
\documentclass{article}
\usepackage{expl3,xparse}
\ExplSyntaxOn
\cs_generate_variant:Nn \str_case:nn { x }
\NewDocumentCommand{\actionForHEX}{m}{%
\str_case:xn { \str_foldcase:n { #1 } }
{
{e085} {This~is~E085}
{e086} {This~is~E086}
}
}
\ExplSyntaxOff
\begin{document}
\actionForHEX{E085}
\actionForHEX{e085}
\actionForHEX{E086}
\actionForHEX{e086}
\end{document}
在较旧的系统上\str_fold_case:n
(2016 年 11 月之前推出,请参阅l3news10
) 可能可以代替\str_foldcase:n
(于 2019-11-26 被取代\str_fold_case
)。
如果要F
在最后包含不匹配的分支,最好使用以下命令生成变体\prg_generate_conditional_variant:Nnn
(感谢菲利佩·奥莱尼克在评论中解释这一点)。对于e
-type 扩展,如下所示
\documentclass{article}
\usepackage{expl3,xparse}
\ExplSyntaxOn
\prg_generate_conditional_variant:Nnn \str_case:nn { e } { F }
\NewDocumentCommand{\actionForHEX}{m}{%
\str_case:enF { \str_foldcase:n { #1 } }
{
{e085} {This~is~E085}
{e086} {This~is~E086}
}
{Not~matched}
}
\ExplSyntaxOff
\begin{document}
\actionForHEX{E085}
\actionForHEX{e085}
\actionForHEX{E086}
\actionForHEX{e086}
\actionForHEX{E087}
\end{document}
它类似于x
-type 扩展(可能\str_fold_case:n
在较旧的系统上)。