LuaLaTeX + unicode-math + 语义包

LuaLaTeX + unicode-math + 语义包

我正在尝试使用lualatex和包。我在使用包时遇到了一些问题- 当我加载完整版本或使用选项时unicode-math,我收到“无效数学代码”错误。semanticsemanticshorthand

以下代码可以正常工作:

\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}}

相关内容