132

Is there a general way to change the font of a particular symbol without switching packages?

For example, suppose I'm using Computer Modern for my entire document, but I want the "subset" operator to look as it does in mathabx. How can I redefine it to appear in this way?

3

6 Answers 6

97

There's sort of a general way, but it involves knowing your way around the various bits of the other font packages. You can then take just the bits you need. So for your particular example, you could do the following:

\documentclass{article}
% Setup the matha font (from mathabx.sty)
\DeclareFontFamily{U}{matha}{\hyphenchar\font45}
\DeclareFontShape{U}{matha}{m}{n}{
      <5> <6> <7> <8> <9> <10> gen * matha
      <10.95> matha10 <12> <14.4> <17.28> <20.74> <24.88> matha12
      }{}
\DeclareSymbolFont{matha}{U}{matha}{m}{n}

% Define a subset character from that font (from mathabx.dcl)
% to completely replace the \subset character, you can replace
% \varsubset with \subset

\DeclareMathSymbol{\varsubset}{3}{matha}{"80}
\begin{document}

Computer Modern subset
\[
A \subset B
\]

\texttt{mathabx} subset

\[
A \varsubset B
\]

\end{document}

This code is copied from the mathabx package.

sample

7
  • 1
    This is exactly what I'm looking for; I can infer the general way from here, since there is a pretty good guide: latex-project.org/guides/fntguide.pdf. Just a couple of questions: where can I find the "loading-settings" for mathabx, i.e., where did you get \hyphenchar\font45 (in the \DeclareFontFamily command) from? How about the loading-settings used in the \DeclareFontShape command? Thanks a lot. Mar 28, 2011 at 1:45
  • 2
    I mention this in the commented code: the first part is from mathabx.sty and the second from mathabx.dcl. These files are located in TeXLive in /usr/local/texlive/2010/texmf-dist/tex/generic/mathabx/. (I assume somewhere similar in MikTeX.)
    – Alan Munn
    Mar 28, 2011 at 2:00
  • I borrowed your code at tex.stackexchange.com/questions/113437/stealth-arrow-in-math/… for different symbols from mathabx. While my adaptation seems to work, please let me know if I screwed it up somehow. May 9, 2013 at 19:42
  • 1
    @AlanMunn how did you find "80? I want to import the \mathabx symbols for \lefttorightarrow and \righttoleftarrow. Thanks!
    – Arrow
    Oct 31, 2016 at 18:39
  • 1
    @Arrow All the declarations are found in the file mathabx.dcl (which is \input by mathabx.sty).
    – Alan Munn
    Oct 31, 2016 at 18:43
54

There's another way to cope with a single symbol without wasting a precious math alphabet resource (there are only 16 of them).

\usepackage{pifont}
\makeatletter
\newcommand\Pimathsymbol[3][\mathord]{%
  #1{\@Pimathsymbol{#2}{#3}}}
\def\@Pimathsymbol#1#2{\mathchoice
  {\@Pim@thsymbol{#1}{#2}\tf@size}
  {\@Pim@thsymbol{#1}{#2}\tf@size}
  {\@Pim@thsymbol{#1}{#2}\sf@size}
  {\@Pim@thsymbol{#1}{#2}\ssf@size}}
\def\@Pim@thsymbol#1#2#3{%
  \mbox{\fontsize{#3}{#3}\Pisymbol{#1}{#2}}}
\makeatother

After these one can choose a particular symbol and give it a sensible name, for example

\newcommand{\varsubset}{\Pimathsymbol[\mathrel]{matha}{"80}}

The optional argument gives the type of the symbol, in this case a binary operation symbol; the first mandatory argument is the name of the font family and the second one the number of the symbol's slot in the font.

Unfortunately, mathabx doesn't provide .fd files, so one has also to declare the family as explained in Alan's answer, but, since now the mathabx are also in Type1 format, one may scale them:

\DeclareFontFamily{U}{matha}{\hyphenchar\font45}
\DeclareFontShape{U}{matha}{m}{n}{
  <-6> matha5 <6-7> matha6 <7-8> matha7
  <8-9> matha8 <9-10> matha9
  <10-12> matha10 <12-> matha12
  }{}

Any symbol in any font may be used in math and it will scale properly in subscripts and superscripts.

4
  • How about accents? Could this be adapted to use the wide bar accent from mathx without "wasting" a math alphabet as in this answer: tex.stackexchange.com/questions/16337/…
    – kahen
    May 3, 2012 at 8:58
  • 1
    @kahen I'm afraid it's not possible, as the growing accents are used only in math fonts.
    – egreg
    May 3, 2012 at 9:02
  • I'm a bit confused by this. Mostly, I'm not clear why you can't load mathabx.sty rather than declaring the family yourself. Not that doing so is bad. Just I take it from your answer that you are saying that doing so is required. (Is this just to avoid using up a maths family or is there some other reason?) Second, just to clarify that 'Any symbol in any font...' means roughly in any raw font. You couldn't use a symbol from a virtual font directly (or use a symbol from a truetype font at all). [99 to 1 I've misunderstood.]
    – cfr
    Apr 22, 2014 at 23:03
  • 1
    @cfr Loading mathabx changes all symbols and in several cases the change is not really good.
    – egreg
    Apr 22, 2014 at 23:11
9

With unicode-math

Unicode math fonts support a wide range of symbols. Among these are a lot of symbols which were only available using supplemental package when not using Unicode fonts.

The unicode-math package enables you to load these Unicode math fonts. Some are available in TeXlive, such as Latin Modern Math, a Unicode port of the popular lmodern package.

A list of symbols, defined by some of these fonts can be found in the document Every symbol (most symbols) defined by unicode-math by the developer of unicode-math and TeX.SX user Will Robertson.

Let's take for example, the \llangle and \rrangle symbols. These are not available in Latin Modern Math but they are in XITS Math. To import these when using Latin Modern Math as the main math font, one has to use the range option. The range option accepts Unicode slots or alternatively, for easier understanding, the mnemonic names of the symbols. Be sure to load the custom range after setting the main math font. Otherwise your hand-crafted set of symbols will be overwritten.

\documentclass{article}
\usepackage{unicode-math}
\setmathfont{Latin Modern Math}
\setmathfont[range={\llangle,\rrangle}]{XITS Math}
\begin{document}
$\llangle a \rrangle$
\end{document}

enter image description here

2
  • 1
    I wonder why this symbol was given that name, since the rough semantics of the xxdelimiter symbols is to double them in some way.
    – Alan Munn
    Aug 10, 2016 at 15:29
  • @AlanMunn, it seems to fit in with the other STIX xxdelimiter names, which seem to mean "delimiter with an extra stroke" rather than "doubled delimiter". I guess this comes from viewing, for example, llbracket as a bracket with an extra stroke, rather than superposed and slightly offset (pmb-style) brackets.
    – LSpice
    Feb 13, 2020 at 4:04
8

This is an answer to Making asterisk look like a Kleene star which was closed as a duplicate before I could submit an answer.

The problem is that the MnSymbol package not only replaces macros like \ast, it also clobbers the corresponding \mathchar. You can, however, get \ast from the mathabx package.

\documentclass{article}
\usepackage{amsmath}% needed before mathabx
\let\amsast=\ast
\usepackage{mathabx}% needed to prevent \ast getting clobbered
\let\abxast=\ast
\usepackage{mnsymbol}
\let\mnast=\ast
\let\ast=\abxast
\begin{document}
$\ast$ and $\mnast$ and $\amsast$
\end{document}

asterisks

You have to admit the above code is a lot less intimidating than the other solutions.

4

ConTeXt MkIV

In ConTeXt you use the \definefontfallback to load symbols from a different font. You can either give Unicode slots or whole character ranges, like lowercasescript. Mnemonic character names are not possible, unfortunately.

In the example we load the moustache brackets from XITS Math because they are not available in Latin Modern Math, which is the default math font.

\definefontfallback [xits-fallback] [file:xits-math.otf] [023B0,023B1]

\definefontsynonym [MathRoman] [modern] [fallbacks=xits-fallback]

\starttext

$\lmoustache a \rmoustache$

\stoptext

enter image description here

0

A rewriting of the existing answers, plus some small modifications to demonstrate a way to not use up a symbol font using \text instead of \mathchoice (and a few other things).


For example with the \subset symbol here:

output image

Another example, \rightlsquigarrow (example taken from https://tex.stackexchange.com/a/36088/250119):

output image


You can also run the above with your own math package/symbol.

I made a solution that works "mostly" automatically -- given a symbol and math font package, it determines the commands needed to define the symbol standalone.

https://www.overleaf.com/read/gywpcrmnyrdx

In order to run it with your own symbol you would need to

  • fork the Overleaf project
  • edit the preamble to load the appropriate math font package
  • modify the symbol to be searched
  • recompile the PDF.

Be careful while copy-pasting code from output PDF.

For now, it may not work with everything e.g. delimiter/radical etc. will not work. Unicode math font will also not work.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .