我正在使用该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}