编辑

编辑

我正在使用该forest包绘制逻辑电路,并尝试自定义样式。我希望输入对齐,因此我编写了这个宏:

\newcommand{\inp}[1]{[#1,tier=in]}

但是当评估树时,它无法识别我试图以编程方式控制树格式,并将其解释\inp{x}为节点文本的一部分。这是一个最小的工作示例和输出:

\documentclass{article}
\usepackage{forest}

\newcommand{\inp}[1]{[#1,tier=in]}

\begin{document}

\begin{forest}
[AND
  \inp{x}
    [OR
      \inp{y}
      \inp{z}
    ]
]
\end{forest}

\end{document}

输出为

在此处输入图片描述

问题似乎是环境读取结构而不评估命令\inp{x};它看不到方括号,因此它注册为普通文本以便与前面的节点放在一起。

\inp{x}但我希望在环境决定树的结构之前先评估所有内容。我该怎么做?

答案1

我建议使用样式。这样,您只需添加, inp=<whatever>到相关的父节点即可。

\documentclass[tikz,border=5pt,multi,varwidth]{standalone}
\usepackage{forest}

\begin{document}
  \forestset{
    inp/.style={
      prepend={[#1, tier=in]},
    },
  }
  \begin{forest}
    [AND, inp=x
      [OR, inp=z, inp=y
      ]
    ]
  \end{forest}
\end{document}

森林树木

编辑

如果确实需要命令,您可以这样做,但您需要@+在树开始之前使用,并且您应该意识到这会forest以相当基本的方式改变解析树的方式。因此,如果不切换回常规模式,您将无法使用许多标准功能。有关如何执行此操作的详细信息在手册中。但您需要使用@-。以下内容改编自手册forest。(显然。)

\documentclass[tikz,border=5pt,multi,varwidth]{standalone}
\usepackage{forest}

\newcommand\inp[1]{@@\edef\xtemp{@+[#1,tier=in]}\expandafter\bracketResume\xtemp}

\begin{document}
  \bracketset{action character=@}
  \begin{forest}
  @+[AND
    \inp{x}
      [OR
        \inp{y}
        \inp{z}
      ]
  ]
  \end{forest}
\end{document}

相关内容