我正在研究编程语言语义文本,并决定使用语义包。根据手册,我可以使用这个:
\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}
因此文档是正确的,但实现出了问题。