正規表示式替換後的 Tex 編譯

正規表示式替換後的 Tex 編譯

我需要產生一個由偶數個拉丁字母組成的可變大小的字串,每對的格式為a\textrightarrow A;.每對與其他對之間都間隔一些空白空間(例如,此處為 1 公分)。為此,我定義了一個命令\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_allpdfLaTeX 編譯結果並產生所需的輸出?

PS:我不精通latex3。我剛剛重複使用並修改了我在該網站上找到的程式碼以適合我的目的。

答案1

您應該在替換文字中遵循特殊規則:

  • 用於\c{cmd}表示控制序列\cmd
  • 使用\cB\{\cE\}來表示埃金和end組大括號,分別。
  • 為了確保類別代碼,請轉義除 之外的每個可列印字元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,第二十七部分作為對庫的徹底介紹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
}

相關內容