正規表現の置換後のTexコンパイル

正規表現の置換後のTexコンパイル

偶数個のラテン文字で構成される可変サイズの文字列を生成する必要がありますa\textrightarrow A;。各ペアは という形式です。各ペアは他のペアからいくらかの空白 (ここではたとえば 1cm) で区切られています。このために、 コマンドを定義し\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_allpdfLaTeX によってコンパイルされ、目的の出力が生成されるようにするにはどうすればよいでしょうか?

追記: 私は LaTeX3 に精通していません。このサイトで見つけたコードを自分の目的に合わせて再利用し、変更しただけです。

答え1

置換テキストでは特別なルールに従う必要があります:

  • \c{cmd}制御シーケンスを表すために使用します\cmd
  • \cB\{とを使用し\cE\}て表すbeginとeそれぞれ、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.pdfl3regex、第 XXVII 部では、図書館の徹底的な紹介を行います。

答え2

\regex_replace:nnNこの仕事には使いません。

私の提案は、入力をセミコロンで分割し、各項目に矢印のコマンドを適用し、最後に項目間に希望のスペースを設けたシーケンスを使用することです。

矢印作成関数は、2 つの項目がコンマで区切られているという事実を利用しているので、 の入力に適しています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
}

関連情報