扩展 l3regex 中的变量来检查匹配

扩展 l3regex 中的变量来检查匹配

使用以下代码我想匹配任何单词这个例子并将其替换为例子。我正在使用从 csv 文件的 A 列中提取的值。我的问题是与\demo{\Fst}任何 \Fst 值都不匹配,而\demo{this_example}似乎可以工作。有没有办法扩展其中的值\Fst以便将值而不是命令传递给 l3regex?提前致谢。

\documentclass[12pt,a4paper]{report}
\usepackage{longtable}
\usepackage{datatool,filecontents,tabularx,booktabs}
\DTLloaddb[keys={A,B}]{termlog}{my.csv}
\DTLsort{A=ascending}{termlog}

\usepackage{expl3}
\usepackage{l3regex}
\ExplSyntaxOn
\tl_new:N \l_demo_tl
\cs_new:Npn \demo #1 {
    \tl_set:Nn \l_demo_tl {#1}
    \regex_replace_all:nnN { ([^\d]+)\_([^\d]+) } {  \cB\{\c{textbf}\cB\{\2\cE\}\cE\}\1 } \l_demo_tl
    \tl_use:N \l_demo_tl
}
\ExplSyntaxOff

\begin{document}      
\begin{longtable}{llllll}
  \toprule
  \textbf{Col1} & \textbf{Col2} \\
  \midrule
  \DTLforeach{termlog}{%
    \Fst=A,\Snd=B}{%
    \demo{\Fst} & \textit{\Snd}  \\
  }
  \\[-\normalbaselineskip] \bottomrule
\end{longtable}
\end{document}

这是 CSV 文件的一个示例:

this_is,some
text_to,fold
or,not

答案1

您可以使用\tl_set:Nx而不是\tl_set:Nn,这样参数就\demo可以完全展开。但是,我不太喜欢这种方法,因为如果第一列包含宏,完全展开可能会很危险。

\begin{filecontents*}{\jobname.csv}
this_is,some
text_to,fold
or,not
\end{filecontents*}

\documentclass[12pt,a4paper]{report}
\usepackage{longtable}
\usepackage{datatool,filecontents,tabularx,booktabs}
\DTLloaddb[keys={A,B},noheader]{termlog}{\jobname.csv}
\DTLsort{A=ascending}{termlog}

\usepackage{xparse,l3regex}
\ExplSyntaxOn
\NewDocumentCommand\demo{sm}
 {
  \IfBooleanTF{#1}
   { \jackb_demo:V #2 }
   { \jackb_demo:n {#2} }
 }

\tl_new:N \l_jackb_demo_tl
\cs_new:Npn \jackb_demo:n #1
 {
  \tl_set:Nn \l_jackb_demo_tl {#1}
  \regex_replace_all:nnN { ([^\d]+)\_([^\d]+) } {  \cB\{\c{textbf}\cB\{\2\cE\}\cE\}\1 } \l_jackb_demo_tl
  \tl_use:N \l_jackb_demo_tl
 }
\cs_generate_variant:Nn \jackb_demo:n { V }
\ExplSyntaxOff

\begin{document}      
\begin{longtable}{llllll}
  \toprule
  \textbf{Col1} & \textbf{Col2} \\
  \midrule
  \DTLforeach{termlog}{%
    \Fst=A,\Snd=B}{%
    \demo*{\Fst} & \textit{\Snd}  \\
  }
  \\[-\normalbaselineskip] \bottomrule
\end{longtable}
\end{document}

\demo也可以在其他地方使用非星号形式。如果您只需要在 中使用它DTLforeach,只需将 替换\NewDocumentCommand

\NewDocumentCommand\demo{m}
 {
  \jackb_demo:V #1
 }

并替换\demo*\demo

在此处输入图片描述

相关内容