一个 .dat 文件包含句点(开始日期和结束日期位于不同的行),需要读取一次然后与日期进行比较,如果匹配则进入\immediate\write\fileB{\Date{} #2, #3}
命令。给定的 MWE 以相同的方式工作。
\read<#> to \whatever
给出以空格结尾的 cs,可以用\StrGobbleRight{\whatever}{1}[\whatever]
或定义\Date
并在末尾给出一个额外的空格,两者都可以在命令之外工作。但是,在里面,我无法让它匹配,我不知道为什么,显然我遗漏了一些小东西。两者都扩展为相同的东西,没有任何换行符、空格字符,那里的 in|
只是为了这个。一个条件被注释掉了,所以我可以测试给定的 tex 条件以及中的条件xstring
,etoolbox
也有一些条件,但我已经忘记了我已经尝试过什么。
\documentclass[a4paper]{article}
\usepackage{
etoolbox,
xstring,
}
\newbool{hasReadPeriod}
\newbool{openDataFile}
\newcounter{foo}
\newcommand\TwoDigits[1]{\ifnum#1<10 0#1\else#1\fi}
\newcounter{year}\setcounter{year}{2016}
\newcounter{month}[year]\setcounter{month}{9}
\newcounter{day}[month]\setcounter{day}{15}
\begin{document}
\newread\fileA
\openin\fileA=periods.dat%
\immediate\newwrite\fileB
\def\Date{\theyear-\TwoDigits{\themonth}-\TwoDigits{\theday}}
\def\XXXX{
\ifeof\fileA
% EOF\par
\else
\ifbool{hasReadPeriod}%
{%
%
}%
{%
\read\fileA to \aaaaa%
\StrGobbleRight{\aaaaa}{1}[\aaaaa]%
\read\fileA to \bbbbb%
\StrGobbleRight{\bbbbb}{1}[\bbbbb]%
\global\booltrue{hasReadPeriod}%
}%
\ifbool{openDataFile}%
{%
\ifx\Date\bbbbb%
% OPENDATAFILE
\global\boolfalse{openDataFile}%
\global\boolfalse{hasReadPeriod}%
\immediate\closeout\fileB%
\else
\immediate\write\fileB{\Date{} newstuffhere}%
\fi
}%
{% is closed, should open?
\ifx\Date\aaaaa %
\global\booltrue{openDataFile}%
\stepcounter{foo}% `
\immediate\openout\fileB=\thefoo.dat%
\immediate\write\fileB{\Date newstuffhere}%
\else
\Date|\par%
\aaaaa|\par%
\hrule\vspace*{0.5cm}%
\fi
% \IfStrEq{\Date{}}{\aaaaa}%
% {%
% % CLOSEDATAFILE\par%
% {\global\booltrue{openDataFile}}%
% \stepcounter{foo}%
% \immediate\openout\fileB=\thefoo.dat%
% \immediate\write\fileB{\Date{} newstuffhere}%
% }%
% {\Date{}|\par
% \aaaaa|\par
% \hrule\vspace*{0.5cm}}
}%
\fi
\stepcounter{day}
}
INCREMENT DATE\par
\XXXX{}%
\XXXX{}%
\XXXX{}%
\XXXX{}%
\XXXX{}%
\XXXX{}%
\XXXX{}%
\XXXX{}%
dasdsad
\def\Date{2016-09-16 }
Date \Date{}\ and \aaaaa{}.
\ifx\Date\aaaaa
T
\else
F
\fi
\end{document}
%==========================================
2016-09-16
2016-09-21
periods.dat 的示例内容
2016-09-16
2016-09-21
2016-09-28
2016-09-30
答案1
\ifx\Date\aaaaa
比较\aaaa
其定义为
\def\aaaa{2016-09-15}
\Date
定义为
\def\Date{\theyear-\TwoDigits{\themonth}-\TwoDigits{\theday}}
如您所见,它们并不相等,\ifx
只是比较了两个宏的替换文本中的标记列表。如果您已定义\Date
为
\edef\Date{\theyear-\TwoDigits{\themonth}-\TwoDigits{\theday}}
那么它将由定义点处的这些标记的扩展来定义,因此等同于
\def\date{2016-09-15}
然后就\ifx
等于\aaaa