
다음을 사용하여 읽는 데이터의 각 행에 대해 다음 처리를 구현하고 싶습니다 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
부울 표현식은 및 (각각 논리 AND 및 논리 OR)에 대한 표준 우선 순위 규칙을 사용합니다.l3prg
expl3
&&
||
\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}