将一个命令的返回值传输到另一个命令

将一个命令的返回值传输到另一个命令

我正在制作一些复杂的真值表,并且我希望能够根据最初的几个原子变量定义进一步的列,这样我就不必手动更新每一行(其中至少有十行)的所有内容。目前,我的方法如下:

\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 作为参数,并将它们逻辑地组合为ANDOR

以下是我的表格第一行的样子:

\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} 

真值表(显然需要标题)

相关内容