检测宏的参数是否只是一个字符串

检测宏的参数是否只是一个字符串

假设我构造了一个宏,例如 \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

相关内容