我正在制作一些复杂的真值表,并且我希望能够根据最初的几个原子变量定义进一步的列,这样我就不必手动更新每一行(其中至少有十行)的所有内容。目前,我的方法如下:
\newcommand{\andand}[2]
{
\ifthenelse{\equal{#1}{#2}}{\ifthenelse{\equal{#1}{1}}{1}{0}}{0}
}
\newcommand{\oror}[2]
{
\ifthenelse{\equal{#1}{1}}{1}{\ifthenelse{\equal{#2}{1}}{1}{0}}
}
\newcommand\pp{1}
\newcommand\qq{1}
\newcommand\rr{1}
这两个命令以 1 和/或 0 作为参数,并将它们逻辑地组合为AND
或OR
。
以下是我的表格第一行的样子:
\renewcommand\pp{0}\pp &
\renewcommand\qq{0}\qq &
\renewcommand\rr{0}\rr &
\andand{\pp}{\qq} &
\andand{\pp}{\rr} &
\oror{\qq}{\rr} &
\andand{\pp}{\oror{\qq}{\rr}} &
\oror{\andand{\pp}{\qq}}{\andand{\pp}{\rr}} \\\hline
现在,前六行运行良好:我重新定义变量p,q,r
以假设该行所需的任何值。在接下来的单元格中,我实际上正在使用变量来评估逻辑语句。然而,在最后两行中,当我尝试评估现有函数的输出时,它拒绝这样做并抛出错误。
我希望能够做到这一点,也许可以使用其他方法,\newcommand
如果无法以这种方式完成。作为扩展,我还希望能够以编程方式迭代p,q,r
(000,001,010,...) 的所有组合,并将其输出为表格。
答案1
这是一种使用pgf
实用程序的方法\foreach
,\pgfmathparse
但不幸的是,它相当违反直觉。基本思想是\pgfmathparse
可以以人类可读的方式评估逻辑表达式输入,并且\foreach
可以迭代值。这些一起工作得很好。
当您需要将输出放入表中时,就会出现问题。\foreach
在组内操作,以便循环变量不会泄漏到全局范围。但是,控制表布局的命令在组内不起作用。解决方案是在宏中构建表,然后稍后扩展它。不幸的是,这种方法会导致一些与扩展和 catcode 相关的微妙之处。无论如何,这里是代码:
\documentclass{article}
\usepackage{pgfmath}
\usepackage{pgffor}
\begin{document}
\makeatletter
\def\xaddtomacro#1#2{%
\protected@xdef#1{\unexpanded\expandafter{#1}#2}%
}
\protected\def\printmathresult#1{\scantokens{\pgfmathparse{int(#1)}}\pgfmathresult}
\makeatother
\let\temp\empty
\foreach \p in {0,1}
\foreach \q in {0,1}
\foreach \r in {0,1}{%
\xaddtomacro\temp{%
\p & \q & \r &
\printmathresult{\p && \q} &
\printmathresult{\p && \r} &
\printmathresult{\q || \r} &
\printmathresult{\p && ( \q || \r) } &
\printmathresult{(\p && \q) || ( \p && \r) }
\\
}%
}
\begin{tabular}{cccccccc}
p & q & r & \\\hline
\temp
\end{tabular}
\end{document}