考虑以下:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\demo}{m}{
\str_case:nnF{#1}
{
{a} {Run case 1\\ % Actually super long code
}
{b} {Run case 1\\ % Actually super long code
}
}
{
% False code
}
}
\ExplSyntaxOff
\begin{document}
\demo{a}
\demo{b}
\end{document}
有什么方法可以定义“ b
”案例而不必复制所有“实际上超长的代码”?
答案1
使用提供非常长代码的函数。建议\New(Expandable)DocumentCommand
仅用于解析参数,然后将控制权传递给函数。
当您拥有作为其他代码一部分的长代码时,最好制作辅助函数。
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\demo}{m}
{
\clement_code_cases:n { #1 }
}
\cs_new:Nn \clement_code_cases:n
{
\str_case:nnF{#1}
{
{a} { \__clement_code_superlong: }
{b} { \__clement_code_superlong: }
{c} { Simpler~code }
}
{
False~code
}
}
\cs_new:Nn \__clement_code_superlong: { Some~very~long~code }
\ExplSyntaxOff
\begin{document}
\demo{a}
\demo{b}
\demo{c}
\demo{d}
\end{document}
\cs_new_protected:(...)
当代码包含不可扩展的功能时记得使用。
答案2
更改b
为a
测试之前
\documentclass{article}
\ExplSyntaxOn
\cs_generate_variant:Nn\str_case:nnF{e}
\NewDocumentCommand{\demo}{m}{
\str_case:enF{
\str_case:enF{#1}{
{b}{a}
}
{#1}
}
{
{a} {Run case 1\par % Actually super long code
}
}
{
% False code
}
}
\ExplSyntaxOff
\begin{document}
\demo{a}
\demo{b}
\end{document}
答案3
\regex_match_case:nnF
您可以尝试正则表达式,如以下示例所示(请注意,和之间两个前参数的顺序不同\str_case:nnF
):
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\demo}{m}{
\regex_match_case:nnF{
{\A[ab]\Z} {Run case 1\\ % Actually super long code
}
}{#1}{
% false code
}
}
\ExplSyntaxOff
\begin{document}
\demo{a}
\demo{b}
\end{document}
答案4
我发现的最简单的解决方案是使用另一个参数再次调用该宏,如下所示:
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\demo}{m}{
\str_case:nnF{#1}
{
{a} {Run case 1\\ % Actually super long code
}
{b} {
\demo{a}
}
}
{
% False code
}
}
\ExplSyntaxOff
\begin{document}
\demo{a}
\demo{b}
\end{document}
它可能仅限于我的特定用例,但它运行良好。