Компиляция Tex после замены регулярного выражения

Компиляция Tex после замены регулярного выражения

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

Связанный контент