正则表达式替换后的 Tex 编译

正则表达式替换后的 Tex 编译

我需要生成一个由偶数个拉丁字母组成的可变大小字符串,每对字母的格式为a\textrightarrow A;。每对字母与其他对字母之间都留有一定距离(这里例如 1cm)。为此,我定义了一个命令\midarrow并使用\regex_replaceexpl3修改 的参数\midarrow

我想\midarrow转换

  1. “a,A;b,B;c,C” 改为 “(a->A); (b->B); (c->C)”

  2. “a,A;b,B;c,C;d,D” 改为 “(a->A); (b->B); (c->C); (d->D)”

  3. 上面的“->”应该是实际箭头\textrightarrow

MWE如下:

\documentclass[a4paper,11pt]{article}

\usepackage{expl3,xparse}
\usepackage{textcomp}

\ExplSyntaxOn
\NewDocumentCommand{\midarrow}{m}
{
    \tl_set:Nn \l_tmpa_tl { (#1) }
    \regex_replace_all:nnN { , } { \textrightarrow } \l_tmpa_tl
    \regex_replace_all:nnN { ; } { );\hspace{1cm}( } \l_tmpa_tl
    \tl_use:N \l_tmpa_tl
}
\ExplSyntaxOff

\begin{document}
    \midarrow{a,A;b,B;c,C}
\end{document}

但是我得到的结果是垃圾。如何确保结果\regex_replace_all应由 pdfLaTeX 编译并产生所需的输出?

PS:我不精通 latex3。我只是重用并修改了我在此网站上找到的代码以满足我的目的。

答案1

您应该遵循替换文本中的特殊规则:

  • 用来\c{cmd}表示控制序列\cmd
  • 使用\cB\{\cE\}表示b开始和分别为第 nd 组括号。
  • 为了确保类别代码,请转义除 之外的每个可打印字符a-zA-Z0-9。例如,使用\(表示字符(,使用(...)表示捕获组。(感谢@frougon的评论。)

因此,您的示例可以修改为

\documentclass[a4paper,11pt]{article}

\usepackage{expl3,xparse}
\usepackage{textcomp}

\ExplSyntaxOn
\NewDocumentCommand{\midarrow}{m}
{
    \tl_set:Nn \l_tmpa_tl { (#1) }
    \regex_replace_all:nnN { \, } { \c{textrightarrow} } \l_tmpa_tl
    \regex_replace_all:nnN { \; } { \)\; \c{hspace}\cB\{ 1cm \cE\} \( } \l_tmpa_tl
    \tl_use:N \l_tmpa_tl
}
\ExplSyntaxOff

\begin{document}
    \midarrow{a,A;b,B;c,C}
\end{document}

使用文档interface3.pdf,第 XXVII 部分对l3regex图书馆进行了全面的介绍。

答案2

我不会适合\regex_replace:nnN这份工作。

我的建议是在分号处拆分输入;然后将箭头命令应用于每个项目,最后使用项目之间所需空间的序列。

箭头制作功能利用了这样一个事实:两个项目之间用逗号分隔,因此对于 来说,这是一个很好的输入clist

\documentclass[a4paper,11pt]{article}

\usepackage{expl3,xparse}
\usepackage{textcomp}

\ExplSyntaxOn
\NewDocumentCommand{\midarrow}{m}
 {
  \seq_set_split:Nnn \l_magguu_arrows_in_seq { ; } { #1 }
  \seq_set_map:NNn \l_magguu_arrows_out_seq \l_magguu_arrows_in_seq
   { \magguu_arrows_make:n { ##1 } }
  \seq_use:Nn \l_magguu_arrows_out_seq { \hspace{1cm} }
}
\cs_new_protected:Nn \magguu_arrows_make:n
 {
  \clist_item:nn { #1 } { 1 }
  \textrightarrow
  \clist_item:nn { #1 } { 2 }
 }
\ExplSyntaxOff

\begin{document}

\midarrow{a,A;b,B;c,C}

\end{document}

在此处输入图片描述

如果您输入\midarrow{a,A;b,B;c,C}

\midarrow{
  a, A;
  b, B;
  c, C
}

相关内容