我真的很难理解为什么以下\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}