某些情况包括导致错误的命令

某些情况包括导致错误的命令

我真的很难理解为什么以下\ifthenelse检查总是会得出错误的结果。

我已经在条件中使用了字符串和命令,我知道它们有效。但在这个特定情况下,出现了问题。

为了简化此代码的分析,我将解释它如何工作。

其目的是为计数器 a 和 b 提供 1 到 9 之间的随机值。此类输出以“a=xb=y axby”的形式写在文档上,其中 x 和 y 是它们的随机值。然后,如果 的输出a\thea{}b\theb{}是一系列给定选项之一(a1b1、a2b3、a3b7……),pdflatex 将在上一行旁边打印“TRUE”。否则,如果该条件为假,它将改为打印“FALSE”。这样的代码重复 100 次。

Random命令运行良好,它会为计数器提供一个介于和#3之间的值。它以这样的方式构建,即每次调用时它都会更改种子,但初始种子由文档本身提供。由于它总是使用以前的种子创建新的种子,因此如果您使用此代码,您将始终获得相同的输出。#1#2

因此,您会注意到,即使有些行应该打印“TRUE”,它仍将始终打印“FALSE”。例如,第四行是“a=6 b=1 a6b1”。不过,每一行都以 FALSE 结尾。

我使用它\ttfamily,这样更容易阅读。

这是 MWE。

\documentclass{article}

\usepackage{xifthen}
\usepackage{lcg}
\usepackage{pgffor}

\newcounter{a}
\newcounter{b}
\newcounter{SEED}

\newcommand{\Random}[3]{%
    \reinitrand[last=2147483647, seed=\value{SEED}]%
    \rand%
    \setcounter{SEED}{\therand}%
    \reinitrand[first=#1, last=#2, seed=\value{SEED}]%
    \rand%
    \setcounter{#3}{\value{rand}}%
}

\begin{document}
    \ttfamily
    \setcounter{SEED}{10}
    \foreach \num in {1,...,100} {%
        \Random{1}{9}{a}%
        \Random{1}{9}{b}%
        a=\thea\ b=\theb\ a\thea{}b\theb{} %
        \ifthenelse{%
            \equal{a\thea{}b\theb{}}{a1b1} \OR %
            \equal{a\thea{}b\theb{}}{a2b3} \OR %
            \equal{a\thea{}b\theb{}}{a3b7} \OR %
            \equal{a\thea{}b\theb{}}{a4b5} \OR %
            \equal{a\thea{}b\theb{}}{a5b1} \OR %
            \equal{a\thea{}b\theb{}}{a6b1} \OR %
            \equal{a\thea{}b\theb{}}{a7b8} \OR %
            \equal{a\thea{}b\theb{}}{a9b9}%
        }{TRUE}{FALSE}\\
    }
\end{document}

我已经尝试了以下措施:

  • 把各a\thea{}b\theb{}部分放入另一个命令中;
  • 使用包etex并使用\detokenize{}答案中建议的命令(类似)问题。

这些都没有改变任何结果。

之前链接的线程也建议使用一些 TeX 命令,但我不明白如何使用以 分隔的不同条件OR,所以我不知道这些命令是否有效。无论如何,我更喜欢基于 LaTeX 的解决方案,除非 TeX 的解决方案真的更容易。

答案1

删除检查{}中的\equal—— 这与您的预期不同。我还建议使用扩展为 的宏a1b5,以便摆脱一堆a\thea b\theb表达式。

\documentclass{article}

\usepackage{xifthen}
\usepackage{lcg}
\usepackage{pgffor}

\newcounter{a}
\newcounter{b}
\newcounter{SEED}

\newcommand{\Random}[3]{%
    \reinitrand[last=2147483647, seed=\value{SEED}]%
    \rand%
    \setcounter{SEED}{\therand}%
    \reinitrand[first=#1, last=#2, seed=\value{SEED}]%
    \rand%
    \setcounter{#3}{\value{rand}}%
}

\begin{document}
    \ttfamily
    \setcounter{SEED}{10}
    \foreach \num in {1,...,100} {%
        \Random{1}{9}{a}%
        \Random{1}{9}{b}%
        a=\thea\ b=\theb\ a\thea{}b\theb{} %
        \edef\localcheck{a\thea b\theb}
        \ifthenelse{%
            \equal{localcheck}{a2b1} \OR %
            \equal{\localcheck}{a2b3} \OR %
            \equal{\localcheck}{a3b7} \OR %
            \equal{\localcheck}{a4b5} \OR %
            \equal{\localcheck}{a5b1} \OR %
            \equal{\localcheck}{a6b1} \OR %
            \equal{\localcheck}{a7b8} \OR %
            \equal{\localcheck}{a9b9}%
        }{TRUE}{FALSE}\\
    }
\end{document}

在此处输入图片描述

更新--带有 expl3 的更短版本

\documentclass{article}

\usepackage{expl3}

\begin{document}
    \pdfsetrandomseed 10 % Set the random seed
    \ttfamily
    \ExplSyntaxOn
    \seq_set_from_clist:Nn \l_compare_patterns_seq {a2b1, a2b3, a3b7, a4b5,a5b1,a6b1,a7b8,a9b9 }% Store the patterns
    \prg_replicate:nn {100} {% Run 100 times
      \tl_set:Nx \l_tmpa_tl {a\fp_eval:n {randint(1,9)}b\fp_eval:n {randint(1,9)}}% Generate the tokenlist
      \tl_use:N \l_tmpa_tl\space
      % Look if the generated tokenlist is contained in the pattern list
      \seq_if_in:NVTF \l_compare_patterns_seq \l_tmpa_tl {TRUE}{FALSE}
      \par% 
    }
    \ExplSyntaxOff
\end{document}

相关内容