如何在使用 syntax.sty 构建的语法图中将终端符号括在圆圈和/或漂亮的椭圆框内?

如何在使用 syntax.sty 构建的语法图中将终端符号括在圆圈和/或漂亮的椭圆框内?

我希望你能再次帮助我。

我想使用该syntax包来构建语法图,但我想将非终端符号括在框中,将终端符号括在圆圈或形状良好的椭圆框(或圆角框)中。这是我使用\ovalbox该包构建的 MWE fancybox

\documentclass[letterpaper, 12pt]{report}

\usepackage[rounded, nounderscore]{syntax}
\usepackage{fancybox}

\begin{document}

\begin{syntdiag}
\fbox{ident} \ovalbox{(}
\begin{rep} \begin{stack} \\
\fbox{type} \begin{stack} \\ \fbox{ident} \end{stack}
\end{stack} \\ \ovalbox{,} \end{rep}
\begin{stack} \\ \ovalbox{...} \end{stack} \ovalbox{)}
\end{syntdiag}

\end{document}

是的,它看起来很糟糕。我知道它可以改进,但我不知道如何改进。您知道我应该使用什么命令将终端符号括在圆圈或椭圆框中吗?我在和的文档中没有找到解决方案,syntax.sty因为我正在使用pdflatex,我不想使用pstricks和,dvi2ps因为我的数字可能会弄乱。

答案1

在对表达式进行装箱时,要获得漂亮的设计确实很难;在下面的代码中,我TikZ定义了两种框架(圆形和矩形);代码展示了按照文档建议绘制的图表、使用和的syntax相同图表以及使用定义的框架的相同图表之间的比较;在最后一张图中,长度\sdmidskip` 被重新定义,以努力改善视觉外观:\fbox\ovalboxTikZ\sdtokskip and

\documentclass[letterpaper, 12pt]{report}
\usepackage[rounded, nounderscore]{syntax}
\usepackage{fancybox}
\usepackage{tikz}

\newcommand\MyOval[1]{\tikz[baseline=-3pt]%
  \node[draw,circle,inner sep=2pt,minimum size=15pt] {#1};}
\newcommand\MyRect[1]{\tikz[baseline=-3pt]%
  \node[draw,rectangle,inner sep=2pt,minimum size=10pt] {#1};}

\begin{document}

\begin{syntdiag}
<ident> ‘(’
\begin{rep} \begin{stack} \\
<type> \begin{stack} \\ <ident> \end{stack}
\end{stack} \\ ‘,’ \end{rep}
\begin{stack} \\ ‘...’ \end{stack} ‘)’
\end{syntdiag}

\begin{syntdiag}
\fbox{ident} \ovalbox{(}
\begin{rep} \begin{stack} \\
\fbox{type} \begin{stack} \\ \fbox{ident} \end{stack}
\end{stack} \\ \ovalbox{,} \end{rep}
\begin{stack} \\ \ovalbox{...} \end{stack} \ovalbox{)}
\end{syntdiag}

\begin{syntdiag}[\setlength\sdtokskip{12pt},\setlength\sdmidskip{12pt}]
\MyRect{ident} \MyOval{(}
\begin{rep} \begin{stack} \\
\MyRect{type} \begin{stack} \\ \MyRect{ident} \end{stack}
\end{stack} \\ \MyOval{,} \end{rep}
\begin{stack} \\ \MyOval{...} \end{stack} \MyOval{)}
\end{syntdiag}

\end{document}

在此处输入图片描述

在我看来,这三种看起来都很丑;也许你可以考虑用它们TikZ从头开始绘制图表?

这是一个使用 TikZ 的非常基本的设计,结果更好:

\documentclass{report}
\usepackage{tikz}
\usetikzlibrary{arrows,calc}

\pgfarrowsdeclarecombine[-4\pgflinewidth]
{dou}{dou}{latex reversed}{latex}{latex}{latex reversed}

\begin{document}

\noindent\begin{tikzpicture}[
  terminal/.style={draw,fill=white,circle,inner sep=2pt,
    minimum size=18pt},
  nonterminal/.style={draw,fill=white,rectangle,inner sep=2pt,
    minimum size=10pt},
  y=0.5cm]

\draw[dou-dou] (0,0) -- node[nonterminal] (id1) {ident} (2,0) -- node[terminal] (ob) {(} (2.5,0) 
  -- (10.5,0) -- node[terminal] (cb) {)}  (\textwidth,0) ;

\node[nonterminal] at (4.5,-1) (ty) {type};
\node[terminal] at (9.7,-1) (ell) {...};
\node[nonterminal] at (6.5,-2) (id2) {ident};
\node[terminal] at (6,1) (co) {,};

\draw (3.5,0) |- (ty) -| (8,0);
\draw (5.5,-1) |- (id2) -| (7.5,-1);
\draw (9,0) |- (ell) -| (10.4,0);
\draw (3,0) |- (co) -| (8.5,0);
\end{tikzpicture}

\end{document}

在此处输入图片描述

相关内容