使用语义包无法获得保留字周围的正确间距

使用语义包无法获得保留字周围的正确间距

我正在研究编程语言语义文本,并决定使用语义包。根据手册,我可以使用这个:

\reservestyle[\mathrel]{\command}{\mathbf}
\command[\mathrel]{skip,while,do,if,then,else}

在保留字中使用与 LaTeX 关系运算符相同的间距。但是,这似乎不起作用:

\documentclass{article}
\usepackage{semantic}
\usepackage{braket}

\reservestyle[\mathrel]{\command}{\mathbf}
\command[\mathrel]{skip,while,do,if,then,else}

\begin{document}

\[
\inference[ifTrue]
            {\braket{S_1,s} -> s'}
            {\braket{\<if> b \<then> S_1 \<else> S_2,s} -> s'}
\]

\end{document}

结果是这样的:

在此处输入图片描述

好像\mathrel不起作用。我做错了什么吗?或者,有没有办法在保留字周围留出合理的空格,而不必\;多次输入?

我正在使用的pdflatex;版本是:

$ pdflatex --version
pdfTeX 3.14159265-2.6-1.40.16 (TeX Live 2015/Debian)
kpathsea version 6.2.1
...
Compiled with libpng 1.6.17; using libpng 1.6.17
Compiled with zlib 1.2.8; using zlib 1.2.8
Compiled with poppler version 0.38.0

答案1

我认为事实恰恰相反:

\documentclass{article}
\usepackage{semantic}
\usepackage{braket}

\reservestyle{\command}{\mathrel}
\command[\mathbf]{skip,while,do,if,then,else}

\begin{document}

\[
\inference[ifTrue]
            {\braket{S_1,s} -> s'}
            {\braket{\<if> b \<then> S_1 \<else> S_2,s} -> s'}
\]

\end{document}

在此处输入图片描述

如果我进一步了解细节

\reservestyle[\mathrel]{\test}{\mathbf}
\test{foo}
\test[\mathrel]{baz}

\expandafter\show\csname<foo>\endcsname
\expandafter\show\csname<baz>\endcsname

根据包的建议,我得到了

> \<foo>=macro:
->\mathbf {\mathrel {foo}}.

> \<baz>=macro:
->\mathbf {\mathrel {baz}}.

并且间距方面的问题也一目了然。

这显然是 定义中的一个错误\@xdefineReserved,其中命令\@@formating\@@spacing被交换了。

\documentclass{article}
\usepackage{semantic}

\makeatletter
\def\@xdefineReserved#1[#2]#3\END{%
  \def\reserved@a{#2}%
  \ifx \reserved@a\empty \toks0{#1}\else \toks0{#2} \fi
    \expandafter\edef\csname\expandafter<#1>\endcsname
    {\the\@@spacing{\the\@@formating{\the\toks0}}}}
\makeatother

\reservestyle[\mathrel]{\command}{\mathbf}
\command{skip,while,do,if,then,else}

\begin{document}

$\<if> b \<then> S_1 \<else> S_2,s -> s'$

\end{document}

在此处输入图片描述

因此文档是正确的,但实现出了问题。

相关内容