目标是拥有一个带有单个参数的宏,它依次查看所有标记,如果看到小写字母,则将其包装在 中\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
,但同样是额外的工作。
请注意,这是使用内部的功能可能(我认为将要) 很快就会重新修改。如果这个方法看起来有用,我会重新修改上面的内容以避免这种情况:需要多花点功夫,所以我会先等待一些反馈!