![检测宏的参数是否只是一个字符串](https://linux22.com/image/457098/%E6%A3%80%E6%B5%8B%E5%AE%8F%E7%9A%84%E5%8F%82%E6%95%B0%E6%98%AF%E5%90%A6%E5%8F%AA%E6%98%AF%E4%B8%80%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
假设我构造了一个宏,例如 \keywords{this, that, other},它接受一个参数,但我想拒绝任何包含宏或空格、换行符和字符以外的任何内容的参数(这意味着我会引发 \ClassError)。据推测,这意味着我会拒绝任何包含除 5、10、11、12 以外的 catcode 的内容。似乎应该可以实现这一点,但我一点也不知道该怎么做。
答案1
“弦”这个概念相当模糊。此外,你可能不想拒绝诸如“étale cohomology”之类的东西,这在数学论文中是一个非常好的关键词。
您可能希望确保作者输入étale
而不是\'etale
,以便于提取以供其他用途。
expl3
具有您想要的功能,即\text_purify:n
。这会删除命令,但对 UTF-8 字符也很友好pdflatex
。然后,您可以将应用于参数的结果\text_purify:n
与参数本身进行比较。
\documentclass{article}
% this would go in the class file
\ExplSyntaxOn
\NewDocumentCommand{\keywords}{m}
{
\mccurleyclass_keywords:n { #1 }
}
\prg_generate_conditional_variant:Nnn \tl_if_eq:nn { e } { T,F,TF }
\cs_new_protected:Nn \mccurleyclass_keywords:n
{
% check whether the argument only contains standard text
\tl_if_eq:enTF { \text_purify:n { #1 } } { #1 }
{% good!
\__mccurleyclass_keywords_print:n { #1 }
}
{%
\msg_error:nn { mccurleyclass } { invalid-keywords }
}
}
\prop_gput:Nnn \g_msg_module_type_prop { mccurleyclass } { Class }
\msg_new:nnnn { mccurleyclass } { invalid-keywords }
{
Illegal~keywords
}
{
Please~use~only~standard~text~in~keywords
}
\cs_new_protected:Nn \__mccurleyclass_keywords_print:n
{
\par\addvspace{\topsep}
\noindent\textbf{Keywords}\quad #1
\par\addvspace{\topsep}
}
\ExplSyntaxOff
\begin{document}
\keywords{this, that, other} % good
\keywords{étale cohomology, something else} % good
\keywords{\'etale cohomology, something else} % bad
\keywords{\textit{étale} cohomology, something else} % bad
\end{document}
前两个通过测试,后两个没有通过并发出消息
! Class mccurleyclass Error: Illegal keywords
For immediate help type H <return>.
...
l.52 ...textit{étale} cohomology, something else}
% bad
? h
Please use only standard text in keywords