我正在尝试使用lualatex
和包。我在使用包时遇到了一些问题- 当我加载完整版本或使用选项时unicode-math
,我收到“无效数学代码”错误。semantic
semantic
shorthand
以下代码可以正常工作:
\documentclass{scrreprt}
\usepackage{fontspec}
\defaultfontfeatures{Ligatures=TeX}
\setmainfont{TeX Gyre Termes}
\usepackage{amsmath}
\usepackage{unicode-math}
\setmathfont{Asana Math}
\usepackage[inference]{semantic}
\begin{document}
$$
\inference{a = b}{c}{d}
$$
\end{document}
这会导致错误:
\documentclass{scrreprt}
\usepackage{fontspec}
\defaultfontfeatures{Ligatures=TeX}
\setmainfont{TeX Gyre Termes}
\usepackage{amsmath}
\usepackage{unicode-math}
\setmathfont{Asana Math}
\usepackage[inference,shorthand]{semantic}
\begin{document}
$$
\inference{a = b}{c}{d}
$$
\end{document}
有什么方法可以让它工作吗?或者也许有一种方法可以创建语义括号符号以与 unicode-math 一起使用?(例如mathabx
包中的 \ldbrack \rdbrack)。
答案1
以下技巧似乎可以解决问题:加载semantic
包,但将调用嵌入到一些魔法代码中
\let\ORImathcode\mathcode
\let\mathcode\Umathcodenum
\usepackage[inference,shorthand]{semantic}
\let\mathcode\ORImathcode
\usepackage{xpatch}
\makeatletter
\xpatchcmd{\mathligsoff}{\mathcode}{\Umathcodenum}{}{}
\xpatchcmd{\@addligto}{\mathcode}{\Umathcodenum}{}{}
\xpatchcmd{\@addligto}{\mathcode}{\Umathcodenum}{}{}
\xpatchcmd{\@addligto}{\mathcode}{\Umathcodenum}{}{}
\makeatother
简而言之,我们告诉ligature.sty
(由 加载的)在使用 的地方semantic
使用。\Umathcodenum
\mathcode
如果xpatch
不可用,可以将行从\usepackage{xpatch}
更改为
\usepackage{etoolbox}
\makeatletter
\expandafter\patchcmd\csname mathligsoff \endcsname{\mathcode}{\Umathcodenum}{}{}
\patchcmd{\@addligto}{\mathcode}{\Umathcodenum}{}{}
\patchcmd{\@addligto}{\mathcode}{\Umathcodenum}{}{}
\patchcmd{\@addligto}{\mathcode}{\Umathcodenum}{}{}
\makeatother
编辑
可与所有三种引擎配合使用的版本
\usepackage{ifxetex,ifluatex}
\newif\ifunicodeengine
\ifxetex
\unicodeenginetrue
\let\SEMmathcodenum\XeTeXmathcodenum
\else
\ifluatex
\unicodeenginetrue
\let\SEMmathcodenum\Umathcodenum
\fi
\fi
\ifunicodeengine
\let\ORImathcode\mathcode
\let\mathcode\SEMmathcodenum
\fi
\usepackage[inference,shorthand]{semantic}
\ifunicodeengine
\let\mathcode\ORImathcode
\usepackage{xpatch}
\makeatletter
\xpatchcmd{\mathligsoff}{\mathcode}{\SEMmathcodenum}{}{}
\xpatchcmd{\@addligto}{\mathcode}{\SEMmathcodenum}{}{}
\xpatchcmd{\@addligto}{\mathcode}{\SEMmathcodenum}{}{}
\xpatchcmd{\@addligto}{\mathcode}{\SEMmathcodenum}{}{}
\makeatother
\fi
答案2
谢谢,我设法用一种稍微不同的方式绕过了这个问题。我想使用,\eval
所以我不使用shorthand
,只是重新定义有趣的部分(结果发现有一个\rBrack
符号):
\usepackage[inference]{semantic}
\newcommand{\evalsymbol}[1][]{\ensuremath{\mathcal{E}^{#1}}}
\newcommand{\eval}[3][]%
{\mbox{${\evalsymbol}^{#1}\lBrack${#2}$\rBrack$}\,{#3}}