TransWikia.com

`bm` no longer works with `mathrm` when loading several fonts

TeX - LaTeX Asked on July 31, 2021

This is a follow up to my previous question. I want listings to be able to handle valid python identifiers in listings using pdfLaTeX.

The MWE literate_mwe.tex produces the following output from the input file literate_test.txt:
font testing output
The commands to listings to produce these glyphs can be seen here. Notably, the third and last lines are supposed to have bold upright serif characters (latin letters and numbers resp.) but instead they only produce upright serif characters. The command to produce bold upright "g", for example, is almost exactly that given in the bm documentation (see section 3.1): bm{{mathrm{g}}}.

However, clearly this works for the other font families: for example, bm{{mathsf{0}}} works just fine in the last row to produce an upright bold sans-serif zero.

How can I diagnose what’s happened to bm? How can I avoid or fix this behavior to obtain upright bold serif math?

EDIT: changing the bolding command for just the upright serif characters to e.g. mathbf{g} causes pdfLaTeX to choke and emit Too many math alphabets used in version normal when it hits the first monospace character. Could bm be silently swallowing the error then?

One Answer

Legacy LaTeX is limited to sixteen math alphabets. I would strongly, strongly recommend that you port your code to unicode-math and LuaLaTeX if you can. The OpenType successor to fourier is fourier-otf.

Even if someone is forcing you to use PDFTeX, you might want to use isomath, which defines the alphabets mathbfit, mathsfbfit, and so on, and also allows you to load an upright, OML-encoded Utopia math alphabet with Greek letters as mathrm and mathbf.

Even if you don’t do that, I’d highly recommend using standard names like mathbf and mathbfsfit in your source, rather than bm{mathrm{x}}. You can still define them as providecommandmathbfsfit[1]{boldsymbol{mathsfit{#1}}} and so on. (It is preferable to use boldsymbol in this context instead of bm, as it takes up fewer math alphabets and is compatible with more packages.) Note that mathalpha defines bolder versions of many other math alphabets, including calligraphic and blackboard-bold, so you should use those if you load it.

The minimal fix for your MWE is to re-declare mathrm and mathbf as the mdput family (Math Design Utopia, compatible with the Utopia used by fourier) in the OML encoding, which supports Greek letters. I likewise define mathsfit to use the math alphabet from sansmathfonts, which contains Greek.

When you set your math font to an encoding that supports Greek, you can use mathrm{alpha}, mathbf{beta} or boldsymbol{mathrm{gamma}}, but I also define upalpha and the rest for backward-compatibility with upgreek. (The fourier package has its own versions, but you had been using upgreek.) In order to be able to use DeclareMathSymbol on them, I redefine mathrm as an alias for the new upletters symbol font, saving a few math alphabets.

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

providecommandbm[1]{boldsymbol{#1}}

letmathbboldmathbb
AtBeginDocument{% thanks fourier
    letmathbbrelax
    newcommand{mathbb}[1]{mathbbold{#1}}
}

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

Sample

Once we redefine each math alphabet to cover Latin and Greek in both bold and regular weights, the document does not run out of math alphabets. If you genuinely need so many that this is impossible, the workaround is to display the math alphabets as text, for example newcommandmathsfit[1]{textnormal{sffamilyitshapeselectfont #1}}. You can also display a symbol that doesn’t vary according to the math alphabet or version with, e.g. newcommandQED{mathord{text{usefont{LS1}{stix}{m}{n}symbol{"D1}}}}. This does not use up a math alphabet.

Rather than load bm and nearly-disabling it by setting bmmax to 0, I here redefine it as boldsymbol. (Don’t do this in your source! Use meaningful names like vectorsym and tensorsym.)

There are also a few other tweaks, such as mathalpha for mathalfa, removing a few packages that I made redundant, and replacing fix-cm with fontaxes when you are not using Computer Modern.

Correct answer by Davislor on July 31, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP