加载多种字体时,`\bm` 不再与 `\mathrm` 一起使用

加载多种字体时,`\bm` 不再与 `\mathrm` 一起使用

这是我的上一个问题。我希望listings能够使用 pdfLaTeX 处理列表中的有效 python 标识符。

数学家协会literate_mwe.tex从输入文件产生以下输出literate_test.txt字体测试输出 生成这些字形的命令listings如下:这里。值得注意的是,第三行和最后一行应该有粗体直立衬线字符(分别为拉丁字母和数字),但它们只产生直立衬线字符。例如,产生粗体直立“g”的命令几乎与bm文档(见第 3.1 节)\bm{{\mathrm{g}}}:。

然而,这显然适用于其他字体系列:例如,\bm{{\mathsf{0}}}在最后一行可以很好地产生直立粗体无衬线零。

我该如何诊断发生了什么\bm?我该如何避免或修复此行为以获得直立的粗体衬线数学?

编辑:将仅针对直立衬线字符的加粗命令更改为例如会导致 pdfLaTeX在遇到第一个等宽字符时\mathbf{g}阻塞并发出错误。那么可以默默地吞下错误吗?Too many math alphabets used in version normal\bm

答案1

unicode-math旧版 LaTeX 仅限于 16 个数学字母。如果可以,我强烈建议您将代码移植到LuaLaTeX。OpenType 的后继者fourierfourier-otf

即使有人强迫您使用 PDFTeX,您也可能想要使用isomath,它定义了字母表\mathbfit\mathsfbfit等等,还允许您加载直立的 OML 编码的乌托邦数学字母表,其中包含希腊字母\mathrm\mathbf

即使您不这样做,我也强烈建议您在源代码中使用标准名称,如\mathbf和,而不是。您仍然可以将它们定义为 和等等。(最好在此上下文中使用 而不是,因为它占用的数学字母更少,并且与更多包兼容。)请注意 定义了许多其他数学字母的更粗体版本,包括 calligraphic 和 blackboard-bold,因此如果您加载它,应该使用它们。\mathbfsfit\bm{\mathrm{x}}\providecommand\mathbfsfit[1]{\boldsymbol{\mathsfit{#1}}}\boldsymbol\bmmathalpha

对 MWE 的最小修复是将\mathrm和重新声明\mathbf为OML 编码中的mdput系列(Math Design Utopia,与 使用的 Utopia 兼容),该编码支持希腊字母。我同样定义使用 中的数学字母表,其中包含希腊文。fourier\mathsfitsansmathfonts

当您将数学字体设置为支持希腊文的编码时,您可以使用\mathrm{\alpha}\mathbf{\beta}\boldsymbol{\mathrm{\gamma}},但我还定义了\upalpha和其余部分以实现与的向后兼容性upgreek。(该fourier包有自己的版本,但您一直在使用upgreek。)为了能够\DeclareMathSymbol在它们上使用,我将其重新定义\mathrm为新upletters符号字体的别名,从而节省了一些数学字母。

\documentclass{article}
\tracinglostchars=2
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{fourier}
\usepackage{fontaxes}
\usepackage{amsmath, amsthm, amssymb}
\usepackage[bb=boondox, cal=boondox]{mathalpha}

\providecommand\bm[1]{\boldsymbol{#1}}

\let\mathbbold\mathbb
\AtBeginDocument{% thanks fourier
    \let\mathbb\relax
    \newcommand{\mathbb}[1]{\mathbbold{#1}}
}

\let\mathsfit\undef
\DeclareMathAlphabet{\mathsfit}{OML}{cmssm}{m}{it}
\SetMathAlphabet{\mathsfit}{bold}{OML}{cmssm}{b}{it}
\DeclareSymbolFont{upletters}{OML}{mdput}{m}{n}
\SetSymbolFont{upletters}{bold}{OML}{mdput}{b}{n}
\DeclareSymbolFontAlphabet{\mathrm}{upletters}
\DeclareMathAlphabet{\mathbf}{OML}{mdput}{b}{n}

\DeclareMathSymbol{\upGamma}{\mathalpha}{upletters}{"00}
\DeclareMathSymbol{\upDelta}{\mathalpha}{upletters}{"01}
\DeclareMathSymbol{\upTheta}{\mathalpha}{upletters}{"02}
\DeclareMathSymbol{\upLambda}{\mathalpha}{upletters}{"03}
\DeclareMathSymbol{\upXi}{\mathalpha}{upletters}{"04}
\DeclareMathSymbol{\upPi}{\mathalpha}{upletters}{"05}
\DeclareMathSymbol{\upSigma}{\mathalpha}{upletters}{"06}
\DeclareMathSymbol{\upUpsilon}{\mathalpha}{upletters}{"07}
\DeclareMathSymbol{\upPhi}{\mathalpha}{upletters}{"08}
\DeclareMathSymbol{\upPsi}{\mathalpha}{upletters}{"09}
\DeclareMathSymbol{\upOmega}{\mathalpha}{upletters}{"0A}
\DeclareMathSymbol{\upalpha}{\mathalpha}{upletters}{"0B}
\DeclareMathSymbol{\upbeta}{\mathalpha}{upletters}{"0C}
\DeclareMathSymbol{\upgamma}{\mathalpha}{upletters}{"0D}
\DeclareMathSymbol{\updelta}{\mathalpha}{upletters}{"0E}
\DeclareMathSymbol{\upepsilon}{\mathalpha}{upletters}{"0F}
\DeclareMathSymbol{\upzeta}{\mathalpha}{upletters}{"10}
\DeclareMathSymbol{\upeta}{\mathalpha}{upletters}{"11}
\DeclareMathSymbol{\uptheta}{\mathalpha}{upletters}{"12}
\DeclareMathSymbol{\upiota}{\mathalpha}{upletters}{"13}
\DeclareMathSymbol{\upkappa}{\mathalpha}{upletters}{"14}
\DeclareMathSymbol{\uplambda}{\mathalpha}{upletters}{"15}
\DeclareMathSymbol{\upmu}{\mathalpha}{upletters}{"16}
\DeclareMathSymbol{\upnu}{\mathalpha}{upletters}{"17}
\DeclareMathSymbol{\upxi}{\mathalpha}{upletters}{"18}
\DeclareMathSymbol{\uppi}{\mathalpha}{upletters}{"19}
\DeclareMathSymbol{\uprho}{\mathalpha}{upletters}{"1A}
\DeclareMathSymbol{\upsigma}{\mathalpha}{upletters}{"1B}
\DeclareMathSymbol{\uptau}{\mathalpha}{upletters}{"1C}
\DeclareMathSymbol{\upupsilon}{\mathalpha}{upletters}{"1D}
\DeclareMathSymbol{\upphi}{\mathalpha}{upletters}{"1E}
\DeclareMathSymbol{\upchi}{\mathalpha}{upletters}{"1F}
\DeclareMathSymbol{\uppsi}{\mathalpha}{upletters}{"20}
\DeclareMathSymbol{\upomega}{\mathalpha}{upletters}{"21}
\DeclareMathSymbol{\upvarepsilon}{\mathalpha}{upletters}{"22}
\DeclareMathSymbol{\upvartheta}{\mathalpha}{upletters}{"23}
\DeclareMathSymbol{\upvarpi}{\mathalpha}{upletters}{"24}
\DeclareMathSymbol{\upvarrho}{\mathalpha}{upletters}{"25}
\DeclareMathSymbol{\upvarsigma}{\mathalpha}{upletters}{"26}
\DeclareMathSymbol{\upvarphi}{\mathalpha}{upletters}{"27}

\usepackage{listings}
\input{literate.tex}

\pagestyle{empty}

\begin{document}

\lstinputlisting{literate_test.txt}

\end{document}

样本

一旦我们重新定义每个数学字母,使其涵盖粗体和常规粗细的拉丁文和希腊文,文档就不会用尽数学字母。如果您确实需要很多字母,以至于无法做到这一点,则解决方法是将数学字母显示为文本,例如\newcommand\mathsfit[1]{\textnormal{\sffamily\itshape\selectfont #1}}。您还可以使用以下方法显示不随数学字母或版本而变化的符号:例如 \newcommand\QED{\mathord{\text{\usefont{LS1}{stix}{m}{n}\symbol{"D1}}}}.这不会用尽一个数学字母表。

我在这里将其重新定义为 ,而不是将其加载并通过设置为 0 来bm几乎禁用它。(不要在源代码中这样做!请使用有意义的名称,如和。)\bmmax\boldsymbol\vectorsym\tensorsym

还有一些其他的调整,例如mathalphamathalfa删除一些我多余的包,以及当您不使用 Computer Modern 时fix-cm用替换。fontaxes

相关内容