
Мне нужно создать строку переменного размера, состоящую из четного количества латинских букв, каждая пара которых имеет формат a\textrightarrow A;
. Каждая пара отделена от других пар некоторым пустым пространством (в данном случае 1 см, например). Для этого я определяю команду \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\}
для представлениябначнем иескобка второй группы соответственно. - Чтобы гарантировать коды категорий, экранируйте каждый печатный символ, кроме
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
}