我需要生成一个由偶数个拉丁字母组成的可变大小字符串,每对字母的格式为a\textrightarrow A;
。每对字母与其他对字母之间都留有一定距离(这里例如 1cm)。为此,我定义了一个命令\midarrow
并使用\regex_replace
来expl3
修改 的参数\midarrow
。
我想\midarrow
转换
“a,A;b,B;c,C” 改为 “(a->A); (b->B); (c->C)”
“a,A;b,B;c,C;d,D” 改为 “(a->A); (b->B); (c->C); (d->D)”
上面的“->”应该是实际箭头
\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
}