在 mathspec 下,在数学模式下使用文本字体标点符号

在 mathspec 下,在数学模式下使用文本字体标点符号

我正在管理一个 XeLaTeX 模板来编辑我自己的书籍,该模板mathspec允许我从目录中选择一些字体系列并在文档中使用它们。

不幸的是,由于讨论中经常将数学方程式作为文本的一部分,而不是公式,所以我想采用文本字体(,.;:并在数学模式。

使用的字体文本以及数学是不同的,我做的最远的是采取其中一个数学字体子集(DigitsLatinGreek)来使用标点符号,但这些字体集均不用于数学模式中使用的标点符号相同文本模式。

抱歉,我把所有我通常使用的软件包都包括进去了,但是尝试删除一些我认为没有必要提供的软件包,MWE 却给我带来了一些随机错误。

\documentclass[a4paper,12pt,twoside]{book}

\usepackage{indentfirst}
\usepackage{graphicx}
\usepackage{pdfpages}
\usepackage{amssymb}
\usepackage{amsmath}
\usepackage{amsthm}
\usepackage{fdsymbol}
\usepackage{tabularx}
\usepackage{multirow}
\usepackage{multicol}
\usepackage{longtable}
\usepackage{xcolor}
\usepackage{colortbl}
\usepackage{paralist}
\usepackage{enumitem}
\usepackage{titleps}
\usepackage{mathspec}
\usepackage{polyglossia}
\usepackage{geometry}
\usepackage{lipsum}

\setdefaultlanguage{brazil}
\geometry{a5paper, left=2.000cm, right=2.000cm, top=2.800cm, bottom=2.800cm}
\defaultfontfeatures{Scale=MatchLowercase,Ligatures=TeX}

% ?

\XeTeXinterchartokenstate=1

% Declaring Font Families

\newfontfamily{\setpunctfont}[
    Path            = ./fonts/text/ ,
    UprightFont     = regular.otf ,
    BoldFont        = regular.otf ,
    ItalicFont      = regular.otf ,
    BoldItalicFont  = regular.otf ,
    Scale           = MatchLowercase ,
    NFSSFamily      = puncty
    ]{jPunct}

\setmainfont[
    Path            = ./fonts/text/ ,
    UprightFont     = regular.otf ,
    BoldFont        = bold.otf ,
    ItalicFont      = italic.otf ,
    BoldItalicFont  = bold-italic.otf ,
    Scale           = MatchLowercase
    ]{jMain}

\setmathfont(Latin)[
    Path            = ./fonts/math/ ,
    UprightFont     = latin.otf ,
    BoldFont        = latin.otf ,
    ItalicFont      = latin.otf ,
    BoldItalicFont  = latin.otf ,
    Scale           = MatchLowercase
    ]{jMathLatin}

% ?

\makeatletter
    \ifx\e@alloc@intercharclass@top\@undefined
        \chardef\CharBound=255
    \else
        \chardef\CharBound=\e@alloc@intercharclass@top
    \fi
\makeatother

\chardef\CharBase=0
\newXeTeXintercharclass\CharPcts
\XeTeXcharclass"002C=\CharPcts
\XeTeXcharclass"002E=\CharPcts
\XeTeXcharclass"003A=\CharPcts
\XeTeXcharclass"003B=\CharPcts
\newtoks\TokenPunctFont
\TokenPunctFont={\begingroup\setpunctfont}
\XeTeXinterchartoks\CharBase\CharPcts=\TokenPunctFont
\XeTeXinterchartoks\CharBound\CharPcts=\TokenPunctFont
\XeTeXinterchartoks\CharPcts\CharBase={\normalfont\endgroup}
\XeTeXinterchartoks\CharPcts\CharBound={\normalfont\endgroup}

\DeclareSymbolFont{PunctSymb}{TU}{puncty}{m}{n}
\Umathchardef\MathPunctComma="3 \symPunctSymb "002C
\Umathchardef\MathPunctDot="3 \symPunctSymb "002E
\Umathchardef\MathPunctSemiColon="3 \symPunctSymb "003B
\Umathchardef\MathPunctColon="3 \symPunctSymb "003A

\begin{document}

    ASP.<> $ASP.;,:<>$ \textbf{A.B,C} \textit{A,B;C.}.  $\MathPunctDot$.

\end{document}

所以,我想要数学 .对应\MathPunctDot,我可以正确地修复另外三个标点符号。

答案1

\Umathchardef通过 XeLaTeX 文档,您可以使用命令代替\Umathcode。由于您想更改标点符号以使其保持如下状态文本模式,则可以设置以下内容:

  1. 您不需要为标点符号使用单独的字体系列。只需声明NFSSFamily您的主要字体即可。

    \setmainfont[
        Path            = ./fonts/text/ ,
        UprightFont     = regular.otf ,
        BoldFont        = bold.otf ,
        ItalicFont      = italic.otf ,
        BoldItalicFont  = bold-italic.otf ,
        Scale           = MatchLowercase ,
        NFSSFamily      = puncty
    ]{jMain}
    
  2. 宣言

    \DeclareSymbolFont{PunctSymb}{TU}{puncty}{m}{n}
    

    现在可以直接处理您的主字体。您可以声明数学模式本声明后的标点符号如下:

    \Umathcode"002C="6 \symPunctSymb "002C
    \Umathcode"002E="6 \symPunctSymb "002E
    \Umathcode"003A="6 \symPunctSymb "003A
    \Umathcode"003B="6 \symPunctSymb "003B
    

    6索引代表数学标点符号。

  3. 如果您想要或需要使用更多字体,我建议您删除fdsymbol包,否则您可能会遇到错误Too many fonts declared

相关内容