
我需要產生一個由偶數個拉丁字母組成的可變大小的字串,每對的格式為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\}
來表示乙埃金和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
}