如何\\
正确设置字符的正则表达式?下面的 MWE 在带有 的单词之间产生不需要的额外空格字符\c{\\}
。
\documentclass[]{article}
\ExplSyntaxOn
\NewDocumentCommand{\ttl}{ m }
{
\tl_set:Nn \l_title_tl {#1}
\tl_set:Nn \l_tmpa_tl {#1}
\regex_replace_all:nnN { \c{\\} } { } \l_tmpa_tl
\tl_use:N \l_tmpa_tl
}
\ExplSyntaxOff
\begin{document}
\ttl{One \\ Two}
One Two
\end{document}
用户可以生成\ttl{One\\ Two}
或\ttl{One \\ Two}
。而我只想\\
通过单个空格删除和连接单词。
答案1
在 中One \\ Two
,前面有一个空格标记\\
,后面有一个空格标记;因此,正则表达式替换是正确的(清楚地显示替换后\tl_show:N \l_tmpa_tl
剩余两个连续的空格标记)。\l_tmpa_tl
根据您所述的用例,我建议如下:
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand \ttl { m }
{
\tl_set:Nn \l_tmpa_tl {#1}
\regex_replace_all:nnN { \ * \c{\\} \ * } { \ } \l_tmpa_tl
% \tl_show:N \l_tmpa_tl % for checking
\tl_use:N \l_tmpa_tl
}
\ExplSyntaxOff
\begin{document}
\ttl{One \\ Two}
One Two
\end{document}
答案2
后面的空格不会被忽略\\
,因此输入时\ttl{One \\ Two}
只需删除\\
,但两个空格标记会保留。此外,如果用户输入\ttl{One\\Two}
您将不会得到任何空格。
因此,您想将\\
前面或后面的空格序列转换为单个空格。
\documentclass[]{article}
\ExplSyntaxOn
\NewDocumentCommand{\ttl}{ m }
{
\sergio_ttl:n { #1 }
}
\tl_new:N \l__sergio_ttl_tl
\cs_new_protected:Nn \sergio_ttl:n
{
\tl_set:Nn \l__sergio_ttl_tl {#1}
\regex_replace_all:nnN { \s* \c{\\} \s* } { \ } \l__sergio_ttl_tl
\tl_use:N \l__sergio_ttl_tl
}
\ExplSyntaxOff
\begin{document}
\ttl{One \\ Two}
One Two
\end{document}
如果我\tl_analysis_show:N
这样做\tl_use:N
,我会得到
The token list \l__sergio_ttl_tl contains the tokens:
> O (the letter O)
> n (the letter n)
> e (the letter e)
> (blank space )
> T (the letter T)
> w (the letter w)
> o (the letter o).
如果您预计用户可能具有\\*
或\\[<dimen>]
或其组合,请将内部函数更改为
\cs_new_protected:Nn \sergio_ttl:n
{
\tl_set:Nn \l__sergio_ttl_tl {#1}
\regex_replace_all:nnN { \s* \c{\\}\s*(\*\s*|\[.*\])* \s* } { \ } \l__sergio_ttl_tl
\tl_use:N \l__sergio_ttl_tl
}
这也涵盖以下所有情况:
\ttl{One \\ Two}
\ttl{One \\[1ex] Two}
\ttl{One \\ [1ex] Two}
\ttl{One \\* Two}
\ttl{One \\ * Two}
\ttl{One \\*[1ex] Two}
\ttl{One \\* [1ex] Two}
\ttl{One \\ * [1ex] Two}
当然还有那些 之后One
或 之前没有空格的Two
。
答案3
以下定义忽略了后面的空格,\\
因为 是未分隔的#2
参数\ttlA
:在这种情况下,TeX 会忽略空格。
\def\ttl#1{\ttlA#1\\\end}
\def\ttlA#1\\#2{#1\ifdim\lastskip=0pt \space\fi\ifx\end#2\else\afterfi{\ttlA#2}\fi}
\def\afterfi#1#2\fi{\fi#1}
\ttl{One \\ Two}
\ttl{One\\ Two}
\ttl{One \\Two}
\ttl{One\\Two}
One Two
\bye
所有这些例子都得出相同的结果:One Two 之间有一个空格。