\ifx 无法匹配 \read cs

\ifx 无法匹配 \read cs

一个 .dat 文件包含句点(开始日期和结束日期位于不同的行),需要读取一次然后与日期进行比较,如果匹配则进入\immediate\write\fileB{\Date{} #2, #3}命令。给定的 MWE 以相同的方式工作。

\read<#> to \whatever给出以空格结尾的 cs,可以用\StrGobbleRight{\whatever}{1}[\whatever]或定义\Date并在末尾给出一个额外的空格,两者都可以在命令之外工作。但是,在里面,我无法让它匹配,我不知道为什么,显然我遗漏了一些小东西。两者都扩展为相同的东西,没有任何换行符、空格字符,那里的 in|只是为了这个。一个条件被注释掉了,所以我可以测试给定的 tex 条件以及中的条件xstringetoolbox也有一些条件,但我已经忘记了我已经尝试过什么。

\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

相关内容