![代码](https://linux22.com/image/326494/%E4%BB%A3%E7%A0%81.png)
我有一个字符串检查宏\IfBeginsWith
,它xstring
被包装在非用户级宏中。我了解到这里错误的方法是在用户看不到的包装器中使用用户级命令。我应该使用低级 TeX 内容(这对于理解基础知识很有帮助)或 LaTeX 3 语法。
我想检查文件名是否以 UserManual、DVD 或 Interface 开头。如果是,那么我应该做点什么(例如将宏重新定义为 true),否则我应该做其他事情(例如将宏重新定义为 false,尽管这可能是默认设置)。
只需使用半用户级方式即可:
由于\jobname
导出的是catcode 12
标记(这是有意义的,因为它必须扩展到任何未转义的受支持的文件系统字符)而不是catcode 11
标记,因此很容易用 with 转换等式的两边catcode 12
(\detokenize
将空格转换为 catcode 10 并将字符转换为 12)。
\IfBeginWith{\detokenize\expandafter{\jobname}}{\detokenize\expandafter{DVD}}{TRUE}{FALSE}
代码
\documentclass{article}
\usepackage{xparse}
\def\whatever{false}
\NewDocumentCommand{\setwhatever}{m}{\def\whatever{#1}}
\ExplSyntaxOn
\tl_new:N \g_jobname_tl
\tl_gset:Nn \g_jobname_tl {\jobname}
\IfBeginWith{\g_jobname_tl}{UserManual} %something like \str_case_beginswith:nn
{\setwhatever{true}}
{\setwhatever{false}}
\IfBeginWith{\g_jobname_tl}{DVD} %something like \str_case_beginswith:nn
{\setwhatever{true}}
{\setwhatever{false}}
\IfBeginWith{\g_jobname_tl}{Interface} %something like \str_case_beginswith:nn
{\setwhatever{true}}
{\setwhatever{false}}
\ExplSyntaxOff
\begin{document}
\whatever{}
\end{document}
答案1
没有“如果标记列表以...开头”的预定义函数。您可以使用以下代码轻松构建它l3regex
:
\documentclass{article}
\usepackage{xparse,l3regex}
\ExplSyntaxOn
\DeclareExpandableDocumentCommand{\whatever}{}
{
\tl_use:N \g_macmadness_whatever_tl
}
\tl_new:N \g_macmadness_whatever_tl
\cs_generate_variant:Nn \regex_match:nnTF { nV }
\regex_match:nVTF { \A (UserManual|DVD|Interface) } \c_sys_jobname_str
{
\tl_gset:Nn \g_macmadness_whatever_tl {true}
}
{
\tl_gset:Nn \g_macmadness_whatever_tl {false}
}
\ExplSyntaxOff
\begin{document}
\whatever{}
\end{document}
请注意,\jobname
已经可以作为字符串使用\c_sys_jobname_str
,因此不需要为其分配变量。
标记\A
将搜索字符串锚定在开始处;搜索是针对 、或中的一个UserManual
,并且根据是否找到匹配项来设置标记列表。DVD
Interface