l3regex:换行符 \\ 的正则表达式

l3regex:换行符 \\ 的正则表达式

如何\\正确设置字符的正则表达式?下面的 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 之间有一个空格。

相关内容