
我想對我的資料的每一行執行以下處理,使用以下命令讀取datatool
:
if ( (\No = 5 and \B=11111) OR (\No = 5 and \B=22222) ):
\inserpageA
else if ( (\No = 5) AND (\B not 11111) AND (\B not 22222) ):
\inserpageB
else:
\No \hspace{1cm} \B \hspace{5cm} \A
我的程式碼:
\RequirePackage{filecontents}
\begin{filecontents*}{test.csv}
Acol, Bcol, NoCol
Ax,Bxxxx,1
Ay,By,3
A1,B22,2
A2,B44,4
A3,11111,5
Ax,B,1
Ay,By,3
A1,B22,2
A2,B44,4
A3,22222,5
Ax,Bxxxx,1
Ay,By,3
A1,B22,2
A2,B44,4
A3,33333,5
\end{filecontents*}
\documentclass{article}
\usepackage{datatool}
\DTLloaddb{mydata}{test.csv}
\newcommand{\inserpageA}[2]{%
\subsubsection*{AAA}
\newpage
}
\newcommand{\inserpageB}[2]{%
\subsubsection*{BBB}
\newpage
}
\begin{document}
\DTLforeach*{mydata}{\A=Acol, \B=Bcol, \No=NoCol}%
{%
\No \hspace{1cm} \B \hspace{3cm} \A
}%
\end{document}
請說明如何實施上述規則。謝謝。
答案1
有幾種方法可以做到這一點。我提出兩種解決方案,一種使用xifthen
,另一種使用expl3
.它也可以透過ifthen
和 函數實現datatool
。
請注意,對於 的測試\B
,我使用了字串比較,因為內容並不總是數字,與 相反\No
。我在你的邏輯表達式中替換了一個2222
(22222
看起來你的問題中有一個錯誤?)。
我按照您編寫的邏輯測試實現了它們,但它們可以被簡化(\No
= 5 測試可以分解)。
使用xifthen
\RequirePackage{filecontents}
\begin{filecontents*}{test.csv}
Acol, Bcol, NoCol
Ax,Bxxxx,1
Ay,By,3
A1,B22,2
A2,B44,4
A3,11111,5
Ax,B,1
Ay,By,3
A1,B22,2
A2,B44,4
A3,22222,5
Ax,Bxxxx,1
Ay,By,3
A1,B22,2
A2,B44,4
A3,33333,5
\end{filecontents*}
\documentclass{article}
\usepackage{xifthen}
\usepackage{datatool}
\DTLloaddb{mydata}{test.csv}
\newcommand{\inserpageA}{%
\subsubsection*{AAA}
\newpage
}
\newcommand{\inserpageB}{%
\subsubsection*{BBB}
\newpage
}
\begin{document}
\DTLforeach*{mydata}{\A=Acol, \B=Bcol, \No=NoCol}%
{%
\ifthenelse{\(\cnttest{\No}{=}{5}\AND \equal{\B}{11111}\)\OR
\(\cnttest{\No}{=}{5}\AND \equal{\B}{22222}\)}%
{\inserpageA}%
{\ifthenelse{\cnttest{\No}{=}{5}\AND
\NOT\equal{\B}{11111}\AND
\NOT\equal{\B}{22222}}%
{\inserpageB}%
{\No\hspace{1cm}\B \hspace{5cm}\A\par}%
}%
}%
\end{document}
使用expl3
也許您會發現這種expl3
方式更具可讀性。與 相反xifthen
,布林表達式l3prg
(expl3
這些東西的模組)使用&&
and的標準優先規則||
(分別為邏輯 AND 和邏輯 OR),這很好。
\ExplSyntaxOn
請注意,和之間的空格將被忽略\ExplSyntaxOff
。如果您需要在那裡留出空間,請使用~
或\space
。~
在控製字之後可以照常被忽略,例如~
in\B ~
被忽略,但在擴展\B \space
時會插入一個空格標記(它是擴展為顯式空格標記的宏)。\space
\RequirePackage{filecontents}
\begin{filecontents*}{test.csv}
Acol, Bcol, NoCol
Ax,Bxxxx,1
Ay,By,3
A1,B22,2
A2,B44,4
A3,11111,5
Ax,B,1
Ay,By,3
A1,B22,2
A2,B44,4
A3,22222,5
Ax,Bxxxx,1
Ay,By,3
A1,B22,2
A2,B44,4
A3,33333,5
\end{filecontents*}
\documentclass{article}
\usepackage{xparse}
\usepackage{datatool}
\DTLloaddb{mydata}{test.csv}
\ExplSyntaxOn
\NewDocumentCommand \lfortiProcessOneRow { }
{
\bool_if:nTF
{ % The parentheses below are not necessary, because && has higher
% priority than || in expl3 (l3prg) boolean expressions.
( \int_compare_p:nNn { \No } = { 5 } && \str_if_eq_p:Vn \B {11111} ) ||
( \int_compare_p:nNn { \No } = { 5 } && \str_if_eq_p:Vn \B {22222} )
}
{ \inserpageA }
{
\bool_if:nTF
{ \int_compare_p:nNn { \No } = { 5 } &&
! \str_if_eq_p:Vn \B {11111} &&
! \str_if_eq_p:Vn \B {22222}
}
{ \inserpageB }
{ \No \hspace{1cm} \B \hspace{5cm} \A \par }
}
}
\ExplSyntaxOff
\newcommand{\inserpageA}{%
\subsubsection*{AAA}
\newpage
}
\newcommand{\inserpageB}{%
\subsubsection*{BBB}
\newpage
}
\begin{document}
\DTLforeach*{mydata}{\A=Acol, \B=Bcol, \No=NoCol}{\lfortiProcessOneRow}
\end{document}