![如何在使用 syntax.sty 构建的语法图中将终端符号括在圆圈和/或漂亮的椭圆框内?](https://linux22.com/image/248062/%E5%A6%82%E4%BD%95%E5%9C%A8%E4%BD%BF%E7%94%A8%20syntax.sty%20%E6%9E%84%E5%BB%BA%E7%9A%84%E8%AF%AD%E6%B3%95%E5%9B%BE%E4%B8%AD%E5%B0%86%E7%BB%88%E7%AB%AF%E7%AC%A6%E5%8F%B7%E6%8B%AC%E5%9C%A8%E5%9C%86%E5%9C%88%E5%92%8C%2F%E6%88%96%E6%BC%82%E4%BA%AE%E7%9A%84%E6%A4%AD%E5%9C%86%E6%A1%86%E5%86%85%EF%BC%9F.png)
我希望你能再次帮助我。
我想使用该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
\ovalbox
TikZ
\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}