如何仅处理包含小写字母的标记?

如何仅处理包含小写字母的标记?

目标是拥有一个带有单个参数的宏,它依次查看所有标记,如果看到小写字母,则将其包装在 中\texttt{<token>}。所有其他标记均不受影响地传递。我做到了:

\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
\cs_new:Npn \lctt:n #1 { \tl_if_in:nnTF {abcdefghijklmnopqrstuvwxyzäüöß} {#1} {\texttt{#1}} {#1} }
\cs_new:Npn \demo:n #1 { \tl_map_function:nN {#1} \lctt:n }
\cs_new_eq:NN \demo \demo:n
\ExplSyntaxOff
\newcommand*{\hello}{hello}
\begin{document}
\demo{AbcDef\hello{\hello}GhiJ}

\demo{SS\texttt{S}Sbεa}

\demo{ }

\demo{}

\demo{\hello}
\end{document}

它在第一种情况下有效,但第二种使用失败

! Argument of \lctt:n has an extra }.

目前我还不清楚这两种用途的区别在哪里。

此外,有没有更好的方法来测试一个标记是否包含小写字母,然后详尽地列出它们?(lccode?)用我的方法,如果我想包含小写希腊字母,我必须扩展列表。

答案1

您可以尝试l3regex

\documentclass{article}
\usepackage{fontspec}
\usepackage{xparse,l3regex}

\setmainfont{FreeSerif}
\setmonofont{FreeMono}

\ExplSyntaxOn
\NewDocumentCommand{\demo}{m}
 {
  \tl_set:Nn \l_uli_demo_tl { #1 }
  \regex_replace_all:NnN \c_uli_demo_repl_regex { \c{texttt}\cB\{\1\cE\} } \l_uli_demo_tl
  \tl_use:N \l_uli_demo_tl
 }
\regex_const:Nn \c_uli_demo_repl_regex { ([a-zäüößε]+) }
\ExplSyntaxOff

\newcommand*{\hello}{hello}

\begin{document}

\demo{AbcDef\hello{\hello}GhiJ}

\demo{SS\texttt{S}Sbεa}

X\demo{ }X

X\demo{}X

\demo{\hello}

\end{document}

在此处输入图片描述

答案2

\tl_map_inline:nn由于这是基于 TeX“平衡文本”(-type 参数)工作的,因此无法达到预期的效果n。这意味着例如

SS\texttt{S}Sbεa

\texttt与其参数分开处理,并且周围的括号{S}已丢失。

expl3我们可以安排一个更谨慎(但更慢)的循环,它可以检测括号和空格。例如,在 中有一些内部代码可以执行此操作\tl_reverse:n,在 中也有类似的设置\tl_lower_case:n。使用它可能会导致类似的事情

\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
\cs_new_protected:Npn \uli_demo:n #1
  {
      \exp:w
      \__tl_act:NNNnn
        \__uli_demo_normal:nN
        \__uli_demo_group:nn
        \__uli_demo_space:n
        { }
        {#1}
  }
\cs_new:Npn \__uli_demo_normal:nN #1#2
  {
   \token_if_cs:NTF #2
      { \__tl_act_output:n {#2} }
      {
        \int_compare:nNnTF { `#2 } = { \char_value_lccode:n {`#2} }
          { \__tl_act_output:n { \texttt {#2} } }
          { \__tl_act_output:n {#2} }
      }
  }
\cs_new:Npn \__uli_demo_group:nn #1#2
  { \__tl_act_output:n { {#2} } }
\cs_new:Npn \__uli_demo_space:n #1
  { \__tl_act_output:n{ ~ } }

\cs_new_eq:NN \demo \uli_demo:n
\ExplSyntaxOff
\newcommand*{\hello}{hello}
\begin{document}
\demo{AbcDef\hello{\hello}GhiJ}

\demo{SS\texttt{S}Sbεa}

\demo{ }

\demo{}

\demo{\hello}
\end{document}

lccode我利用的是小写字母映射到其自身(使用值)的事实。

上面使用的循环的非可扩展版本更加稳健,可以处理可扩展版本无法处理的一些情况,但由于代码已经存在,因此似乎很容易“使用它”。另请注意,我还没有尝试使用 pdfTeX 覆盖 UTF-8 输入:这可以通过检查是否定义等于 UTF-8 序列的“开头”来完成inputenc,但同样是额外的工作。

请注意,这是使用内部的功能可能(我认为将要) 很快就会重新修改。如果这个方法看起来有用,我会重新修改上面的内容以避免这种情况:需要多花点功夫,所以我会先等待一些反馈!

相关内容