使用以下代码我想匹配任何单词这个例子并将其替换为例子这。我正在使用从 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
。