在这个 MWE 中,我需要抑制单元格条目内写的评论的输出。换句话说,我需要为我感兴趣的单元格内的评论创建一个占位符。
\RequirePackage{filecontents}
\begin{filecontents*}{sample.csv}
1 (comment to suppress) , 2 (another comment to suppress)
\end{filecontents*}
\documentclass{article}
\usepackage{datatool}
\DTLloaddb[noheader]{db}{sample.csv}
\begin{document}
\DTLgetvalue{\firstvalue}{db}{1}{1}
\DTLgetvalue{\secondvalue}{db}{1}{2}
\firstvalue and \secondvalue
\end{document}
答案1
假设您的评论是以下形式(<text>)
,您可以这样做:
\begin{filecontents*}{\jobname.csv}
1 (comment to suppress), 2 (another comment to suppress), 3
\end{filecontents*}
\documentclass{article}
\usepackage{datatool}
\makeatletter
\newcommand{\decomment}[1]{%
\expandafter\de@comment#1()\@nil{#1}%
}
\def\de@comment#1(#2)#3\@nil#4{%
\def#4{#1}%
}
\makeatother
\DTLloaddb[noheader]{db}{\jobname.csv}
\begin{document}
\DTLgetvalue{\firstvalue}{db}{1}{1}
\DTLgetvalue{\secondvalue}{db}{1}{2}
\DTLgetvalue{\thirdvalue}{db}{1}{3}
\decomment{\firstvalue}\decomment{\secondvalue}\decomment{\thirdvalue}
\firstvalue{} and \secondvalue{} and \thirdvalue{}
\end{document}
奇怪的是,第一个条目变成了1(comment to suppress)
,因此如果不进行更复杂的检查,就无法通过这种方式安全地删除空间。
更简单的方法是l3regex
:
\begin{filecontents*}{\jobname.csv}
1 (comment to suppress), 2 (another comment to suppress), 3
\end{filecontents*}
\documentclass{article}
\usepackage{datatool}
\usepackage{xparse,l3regex}
\ExplSyntaxOn
\NewDocumentCommand{\decomment}{m}
{
\regex_replace_once:nnN { \s*\(.*\)\s*\Z } { } #1
}
\ExplSyntaxOff
\DTLloaddb[noheader]{db}{\jobname.csv}
\begin{document}
\DTLgetvalue{\firstvalue}{db}{1}{1}
\DTLgetvalue{\secondvalue}{db}{1}{2}
\DTLgetvalue{\thirdvalue}{db}{1}{3}
\decomment{\firstvalue}\decomment{\secondvalue}\decomment{\thirdvalue}
\firstvalue{} and \secondvalue{} and \thirdvalue{}
\end{document}
正则表达式是“任意数量的空格(
,后跟任意标记,后跟)
,后跟空格和标记列表的末尾”。