所有内容都在标题中。我想知道这两个表达式\cB.
和\CB\{
正则表达式 (regex) 之间的区别。
在下面的例子中,似乎两者都给出了相同的结果。此外,可以混合使用它们,即可以使用\cB\{ ... \cE.
\documentclass{article}
\ExplSyntaxOn
\tl_new:N \l_my_tl
\NewDocumentCommand{\emphasizing}{ mm }
{
\tl_set:Nn \l_my_tl { #2 }
\regex_replace_all:nnN { (\s) (#1) (\s) } { \1 \c{emph}\cB\{ \2 \cE\} \3 } \l_my_tl
\tl_use:N \l_my_tl
}
\ExplSyntaxOff
\begin{document}
What is the difference \emphasizing{my}{in my question} what is the difference
\end{document}
答案1
在搜索表达式中没有很大的区别,在替换表达式中有很大区别,但大多没有影响。
在搜索表达式中,.
代表“任何字符”(对于 TeX 而言是任何标记),而在替换表达式中则.
代表字符本身。TeX 的正则表达式已扩展为允许使用“前缀”来说明字符应具有的类别代码。因此通常\cP?
不会匹配?
具有类别代码 12 的标准,而 则\cP
表示“类别代码 6”(“参数”的助记符)。其余部分,语法基本与 POSIX 正则表达式相同。
如果你\tl_analysis_show:N \l_my_tl
在代码中添加 替换\cE.
,\cE\{
你就会进入终端
The token list \l_my_tl contains the tokens:
> i (the letter i)
> n (the letter n)
> (blank space )
> \emph (control sequence=macro:->\protect \emph )
> { (begin-group character {)
> m (the letter m)
> y (the letter y)
> . (end-group character .)
> (blank space )
> q (the letter q)
> u (the letter u)
> e (the letter e)
> s (the letter s)
> t (the letter t)
> i (the letter i)
> o (the letter o)
> n (the letter n).
重要的是
> . (end-group character .)
这说明您插入的.
是类别代码 2,而不是。这不会造成损害,因为类别代码 2 字符的作用相同。类别代码 1 字符的作用并不完全相同,因为当使用}
特殊语法时,它们可以用作分隔参数的分隔符。\def\macro<tokens>#{...}
在搜索表达式中,\cB.
将匹配任何类别代码 1 的字符,而\cB\{
仅匹配{
1。 没什么大不了的,因为在正常设置中只有一个这样的字符,即左括号,类别代码 2 也是如此。 但在非常特殊的情况下,事态会发生变化(想想 的fancyvrb
选项commandchars
)。
最好坚持标准并在替换表达式中使用\cB\{
和,除非您正在处理一种特殊情况,即您想要更改和\cE\}
的类别代码,但您仍然有一些可以作为参数的组分隔符的东西。{
}
请注意,使用\cB.
和\cE.
仍然有效,因为一旦字符获得附加的类别代码,它就是永久的。然而,在检查结果标记列表时,这会非常令人困惑。
答案2
大多数情况下差别不大。作为用户,您通常不关心哪个字符具有 catcode 1 或 2,因为它们从未排版过(好吧,您关心是因为您必须编写它们,但仅此而已)。具有 catcode 1 和 2 的字符仅由 TeX 用于形成组、分隔参数和此类事物,但字符本身大多数时候都会消失,因此实际字符并不重要,例如:
\catcode`\(=1 \catcode`\)=2
\documentclass(article)
\ExplSyntaxOn
\tl_new:N \l_my_tl
\NewDocumentCommand(\emphasizing)( mm )
(
\tl_set:Nn \l_my_tl ( #2 )
\regex_replace_all:nnN ( (\s) (#1) (\s) ) ( \1 \c{emph}\cB\{ \2 \cE\} \3 ) \l_my_tl
\tl_use:N \l_my_tl
)
\ExplSyntaxOff
\begin{document)
What is the difference \emphasizing(my)(in my question) what is the difference
\end(document}
(请注意,您甚至可以将它们混合在一起,就像我在\begin{document)
和\end(document}
上面所做的那样。)
你会注意到其中的区别(我可能遗漏了一些情况,但这些是主要的):
当您使用
\detokenize
字符:时,开始组和结束组标记将成为要排版的普通字符标记,然后您将看到差异(如果您使用\string
或,则是一样的\meaning
);当您使用
{
-delimited 命令时:例如\textcolor
定义为\protected\def\textcolor#1#{\@textcolor{#1}}
(请注意#{
定义中的)。在这种情况下,该命令仅在由相同的 catcode-1 字符分隔时才有效:\catcode`\(=1 \catcode`\)=2 \documentclass(article) \usepackage(color) \begin(document) \textcolor{red}(hello) % works % \textcolor(red)(hello) % doesn't work \end(document)
当您使用
\show
或调试代码时\tracingall
:您的眼睛已经习惯了{
并}
意味着开始和结束组标记,这\emph.word}
看起来完全是错误的(即使 TeX 能理解它)。