9

The following is what I've put together as a way of making sure the full(est) range of fonts/styles are available when using Latin Modern as the mainfont using fontspec, including bold smallcaps, italics smallcaps, etc.:

\setmainfont[
    SmallCapsFont={Latin Modern Roman Caps},
    SlantedFont={* Slanted},
    ItalicFeatures  = {
        SmallCapsFont = {LMRomanCaps10-Oblique}
      },
    BoldFeatures = {
      SmallCapsFont = {CMU Serif-Bold},
      Letters=SmallCaps
      }    
    ]{Latin Modern Roman}

(Slightly cheating because it uses Computer Modern Unicode for the bold smallcaps.)

Is this reasonable, or is there a better way?

Full minimal example:

\documentclass{article}[12pt]

\usepackage[T1]{fontenc}
\usepackage{fix-cm}
\usepackage{fontspec}
\defaultfontfeatures{Renderer=Full,Ligatures=TeX,Numbers=OldStyle,Scale=MatchLowercase}
\setmainfont[
    SmallCapsFont={Latin Modern Roman Caps},
    SlantedFont={* Slanted},
    ItalicFeatures  = {
    SmallCapsFont = {LMRomanCaps10-Oblique}
      },
    BoldFeatures = {
      SmallCapsFont = {CMU Serif-Bold},
      Letters=SmallCaps
      }    
      ]{Latin Modern Roman}
\begin{document}

\begin{tabular}{ll}
  Plain roman & Hello, world.\\
  Bold roman & \textbf{Hello, world.}\\
  Italics & \textit{Hello, world.}\\
  Bold italics & \textit{\textbf{Hello, world.}}\\
  Plain smallcaps & \textsc{Hello, world.}\\
  Bold smallcaps & \textbf{\textsc{Hello, world.}}\\
  Italics smallcaps & \textit{\textsc{Hello, world.}}\\
  Bold italic small caps & \textit{\textbf{\textsc{Hello, world.}}} [doesn't work]\\
&\textbf{\textit{\textsc{Hello, world.}}} [doesn't work]\\
  Typewriter & \texttt{Hello, world.}\\
  Italic typewriter & \textit{\texttt{Hello, world.}}\\
  Bold typewriter & \textbf{\texttt{Hello, world.}}\\
  Bold italic typewriter & \textit{\textbf{\texttt{Hello, world.}}}\\
  Slanted & \textsl{Hello, world.}\\
  Bold slanted & \textbf{\textsl{Hello, world.}}\\
\end{tabular}

\end{document}

output of above

The bold, italics, smallcaps combos don't work (I don't know that I ever need that combination anyway), and I do get some warnings:

Package fontspec Warning: OpenType feature 'Letters=SmallCaps' (smcp) not
(fontspec)                available for font 'Latin Modern Roman/B' with
(fontspec)                script 'Latin' and language 'Default'.

(./test5.aux)

LaTeX Font Warning: Font shape `TU/lmtt/bx/it' in size <10> not available
(Font)              Font shape `TU/lmtt/b/sl' tried instead on input line 38.

Is there any better way of setting up Latin Modern with fontspec?

[Edit: To make the goal explicit, I'm looking for the widest character coverage, the widest face/style coverage, with the best rendering (ranking in order of importance) while using the Latin/Computer Modern family of typefaces.]

emacsomancer
  • 1,795
  • 1
    I'm afraid that your mileage vary according the selected font. With Noto fonts all styles work but slanted is really italics, many others fonts do not have SC at all, and so on. – Fran Jan 06 '19 at 10:08
  • 2
    CMU Serif BoldItalic doesn't have small caps. – egreg Jan 06 '19 at 10:49
  • @Fran Right, understood but I'm asking specifically for Latin Modern Roman (supplemented with related fonts, e.g. Computer Modern Unicode, where necessary). – emacsomancer Jan 06 '19 at 18:38
  • One error: BoldFeatures = {Letters = SmallCaps} should be BoldFeatures = { SmallCapsFeatures = {Letters = SmallCaps, ... } }, unless you want to use small caps for all bold text. – Davislor Jan 07 '19 at 01:21

3 Answers3

4

As fas I know, there are not any good solution for this.

One approach to solve this could be change the Latin Modern by another font with enough glyphs (I do not know a free font with enough glyphs, but probably a professional font could cover all your desired styles).

Other is botch with one has available: Using pdflatex you can simulate "Italics smallcaps" with "Slanted smallcaps" using slantsc packages, at least with pdflatex (not tested with lualatex, sorry) and the simulate the bold variant overlaping text. The macros \textbfsl and \textbfslsc are for now very naive approaches to do this, unbreakable text, but I hope that enough to check is it could look like true bold fonts (sorry again, but now I do not have time to test a more handy approach to overlap text, maybe later):

mwe

\documentclass[12pt]{article}
\usepackage[T1]{fontenc} 
\usepackage{lmodern}
\usepackage{slantsc}
\def\textbfsl#1{\makebox[.3pt][l]{%
\makebox[.29pt][l]{\textsc{#1}}%
\makebox{\textsc{#1}}}}
\def\textbfslsc#1{%
\makebox[.29pt][l]{\textsl{\textsc{#1}}}%
\makebox{\textsl{\textsc{#1}}}}
\begin{document}

\begin{tabular}{ll}
  Plain roman & Hello, world.\\
  Bold roman & \textbf{Hello, world.}\\
  Italics & \textit{Hello, world.}\\
  Bold italics & \textit{\textbf{Hello, world.}}\\
  Plain smallcaps & \textsc{Hello, world.}\\
  Bold smallcaps & \textbfsl{Hello, world.}\\
  Italics smallcaps & \textsl{\textsc{Hello, world.}}\\
  Bold italic small caps & \textbfslsc{Hello, world.}\\
  Typewriter & \texttt{Hello, world.}\\
  Italic typewriter & \textit{\texttt{Hello, world.}}\\
  Bold typewriter & \textbf{\texttt{Hello, world.}}\\
  Bold italic typewriter & \textit{\textbf{\texttt{Hello, world.}}}\\
  Slanted & \textsl{Hello, world.}\\
  Bold slanted & \textbf{\textsl{Hello, world.}}\\
\end{tabular}

\end{document}

If lmodern is not an absolute must, with tgtermes and slantsc you do not need any macro:

mwe

\documentclass[12pt]{article}
\usepackage[T1]{fontenc} 
\usepackage{tgtermes}
\usepackage{slantsc}

\begin{document}

\begin{tabular}{ll}
  Plain roman & Hello, world.\\
  Bold roman & \textbf{Hello, world.}\\
  Italics & \textit{Hello, world.}\\
  Bold italics & \textit{\textbf{Hello, world.}}\\
  Plain smallcaps & \textsc{Hello, world.}\\
  Bold smallcaps & \textbf{\textsc{Hello, world.}}\\
  Italics smallcaps & \textit{\textsc{Hello, world.}}\\
  Bold italic small caps & \textit{\textbf{\textsc{Hello, world.}}}\\
  Typewriter & \texttt{Hello, world.}\\
  Italic typewriter & \textit{\texttt{Hello, world.}}\\
  Bold typewriter & \textbf{\texttt{Hello, world.}}\\
  Bold italic typewriter & \textit{\textbf{\texttt{Hello, world.}}}\\
  Slanted & \textsl{Hello, world.}\\
  Bold slanted & \textbf{\textsl{Hello, world.}}\\
\end{tabular}

\end{document}
Fran
  • 80,769
  • 1
    This is informative, but is still really an answer to a different question. I'm really interested in using Unicode fonts, and specifically ones in the style of Computer Modern. For good character coverage generally, for free fonts, the DejaVu fonts, the Noto series, Junicode, and Linux Libertine are good options. – emacsomancer Jan 07 '19 at 00:10
4

CM Serif BoldItalic has no small caps, but you can fake them.

\documentclass{article}

\usepackage{fontspec}
\defaultfontfeatures{
  Renderer=Full,
  %Ligatures=TeX,
  Numbers=OldStyle,
  Scale=MatchLowercase,
}

\setmainfont{Latin Modern Roman}[
  SlantedFont = {* Slanted},
  UprightFeatures = {
    SmallCapsFont = {* Caps},
  },
  ItalicFeatures = {
    SmallCapsFont = LMRomanCaps10-Oblique,
  },
  BoldFeatures = {
    SmallCapsFont = CMUSerif-Bold,
    SmallCapsFeatures={Letters = SmallCaps},
  },
  % Neither Latin Modern nor CM Unicode have bold italic small caps
  BoldItalicFeatures = {
    SmallCapsFont = CMUSerif-Bold,
    SmallCapsFeatures={FakeSlant=0.25,Letters=SmallCaps},
  },
]

\begin{document}

\begin{tabular}{ll}
  Plain roman & Hello, world.\\
  Bold roman & \textbf{Hello, world.}\\
  Italics & \textit{Hello, world.}\\
  Bold italics & \textit{\textbf{Hello, world.}}\\
  Plain smallcaps & \textsc{Hello, world.}\\
  Bold smallcaps & \textbf{\textsc{Hello, world.}}\\
  Italics smallcaps & \textit{\textsc{Hello, world.}}\\
  Bold italic small caps & \textit{\textbf{\textsc{Hello, world.}}}\\
  Typewriter & \texttt{Hello, world.}\\
  Italic typewriter & \textit{\texttt{Hello, world.}}\\
  Bold typewriter & \textbf{\texttt{Hello, world.}}\\
  Bold italic typewriter & \textit{\textbf{\texttt{Hello, world.}}}\\
  Slanted & \textsl{Hello, world.}\\
  Bold slanted & \textbf{\textsl{Hello, world.}}\\
\end{tabular}

\end{document}

enter image description here

egreg
  • 1,121,712
  • Ah, thanks for this. I don't know where I would use bold italic smallcaps in practice, but it's nice to have them specified in case. – emacsomancer Jan 07 '19 at 00:11
  • 1
    @emacsomancer I hope nowhere. ;-) That would be triple emphasis! – egreg Jan 07 '19 at 07:45
  • amusingly enough, right after asserting my doubt about needing the combination, I ended up using it (italics to distinguish 'object' language from 'meta' and smallcaps to indicate focus within the 'object' language, and finally bold for emphasis of the relevant piece). – emacsomancer Jan 09 '19 at 02:46
4

You’re off to a good start, but that doesn’t even scratch the surface of all the typefaces in the Computer Modern family. If you see Appendix A of “The LaTeX Font Installation Guide”, which expands on a scheme in The LaTeX Companion, there are official, standardized names for many more widths, weights and shapes. Several are present in Latin Modern, Computer Modern Unicode, or both.

For reference, here are the full lists of fonts in the Latin Modern collection and in the Computer Modern Unicode collection. There is also, of course, Latin Modern Math to replace the math and math symbol fonts. The program otfinfo (which works on the .ttf fonts from CMU as well) is useful to see which CMU fonts contain small-caps.

Of the extra faces in Latin Modern, I treat Demi as an additional weight, which I call sb (because sb is the only weight between m and b in the second edition of The LaTeX Companion.), and Unslanted as an additional shape, ui. I add the commands \sbseries and \textsb corresponding to \bfseries and \texbf, and \uishape and \textui corresponding to \itshape and \textit. You can use these as templates to add any other series or shape.

If you want to be able to set the font weight and extent separately, so that you can select bold in the middle of a block of Latin Modern Sans Cond, you might want to check out the package nfssext-cfr for inspiration.

Both Latin Modern and the Computer Modern Unicode fonts include several other families. Of these, CMU Concrete is a conversion of a completely different font originally commissioned for DEK’s book, Concrete Mathematics. I also treat Latin Modern Roman Dunhill and CMU Classical Serif as different families. It might, however, make sense to treat CMU Bright as a lighter weight of the sans-serif font.

CMU contains one series not present in Latin Modern: bold non-extended. For these purposes, I’ll give it the series bc, for bold condensed. It does not come with either italic, slanted or small caps. Other than that, I use some of its bold small-caps.

Here’s a sample for just the Latin Modern Roman family.

\documentclass[varwidth]{standalone}
\usepackage{amsmath}
\usepackage{unicode-math}
\usepackage{microtype}

\defaultfontfeatures{ Scale = MatchUppercase }

\setmainfont{Latin Modern Roman}[
  Scale = 1.0 ,
  Ligatures = {Common, Rare, TeX} ,
  UprightFont = {Latin Modern Roman} ,
  UprightFeatures = {
    Ligatures = Discretionary ,
    SmallCapsFeatures = { Ligatures = ResetAll } ,
    SmallCapsFont = {lmromancaps10-regular.otf}
  } ,
  BoldFeatures = {
    Ligatures = Discretionary ,
    SmallCapsFeatures = {Letters = SmallCaps } ,
    SmallCapsFont = {CMU Serif Bold}
  } ,
  ItalicFeatures = {
    Ligatures = Discretionary ,
    SmallCapsFeatures = { Ligatures = ResetAll } ,
    SmallCapsFont = lmromancaps10-oblique.otf
  } ,
  BoldItalicFeatures = {
    Ligatures = Discretionary ,
    SmallCapsFeatures = { % Ligatures = ResetAll ,
                          Letters = SmallCaps } ,
    SmallCapsFont = cmunbl.ttf
  } ,
  SlantedFont = {Latin Modern Roman Slanted} ,
  SlantedFeatures = {
    Ligatures = Discretionary ,
    SmallCapsFeatures = { Ligatures = ResetAll } ,
    SmallCapsFont = lmromancaps10-oblique.otf
  } ,
  BoldSlantedFont = lmromanslant10-bold.otf ,
  BoldSlantedFeatures = {
    Ligatures = Discretionary ,
    SmallCapsFeatures = { % Ligatures = ResetAll ,
                          Letters = SmallCaps } ,
    SmallCapsFont = cmunbl.ttf
  } ,
  FontFace = {sb}{n}{
    Font = {Latin Modern Roman Demi} ,
    Ligatures = Discretionary } ,
  FontFace = {sb}{sl}{
    Font = lmromandemi10-oblique.otf ,
    Ligatures = Discretionary } ,
  FontFace = {sb}{it}{
    Font = lmromandemi10-oblique.otf ,
    Ligatures = Discretionary } ,
  FontFace = {bc}{n}{CMU Serif Bold Non-Extended} ,
  FontFace = {m}{ui}{Latin Modern Roman Unslanted}
]

\setmathfont{Latin Modern Math}
\setmathfont[range=up]{Latin Modern Roman Unslanted}

\DeclareRobustCommand\sbseries{\fontseries{sb}\selectfont}
\DeclareTextFontCommand{\textsb}{\sbseries}
\DeclareRobustCommand\uishape{\fontshape{ui}\selectfont}
\DeclareTextFontCommand{\textui}{\uishape}

\begin{document}
  \begin{minipage}{10cm}

\textrm{
Latin Modern Roman \textit{Italic} \textsl{Slanted} \textui{Upright-Italic}
\textsb{Demibold \textit{Oblique}}
\textbf{Bold \textit{Italic} \textsl{Slanted}} {\fontseries{bc}\selectfont Non-extended}
\textsc{Small Caps \textit{Italic} \textsl{Slanted} \textbf{Bold \textit{Italic} \textsl{Slanted}}}
}
\[ \symup{e}^{\symup{i}x} = \cos x + \symup{i} \sin x \implies \symup{e}^{\symup{i}\muppi} + 1 = 0 \]
  \end{minipage}
\end{document}

Latin Modern Roman Font Sample

I threw in an example of how the Upright Italic style is useful: it’s great for setting mathematical constants such as e, π and i upright, in ISO style. Compare the imaginary unit i in i sin x with the i in sin and the italic variable name x. You can also take that as an example of how to use any other font face in math mode.

You could eliminate some of the warnings by removing the Ligatures commands. For whatever reason, possibly a bug in fontspec, SmallCapsFeatures = {Ligatures = ResetAll} does nothing and Ligatures = NoDiscretionary only produces a second error message saying that the font does not support dlig. However, the warning is harmless.

If you want more kinds of small caps, you might apply the FakeBold feature to a different weight, or you might find this code useful.

Davislor
  • 44,045
  • Thanks for this. Yes, the upright italic style is indeed useful. So is this in general the best approach to getting different Computer Modern style faces? And am I correct in thinking the Latin Modern fonts are generally higher quality than the Computer Modern Unicode fonts? – emacsomancer Jan 07 '19 at 00:19
  • 1
    @emacsomancer The CMU fonts were autotraced from Metafont, whereas Latin Moern was done by hand. ”Better” is subjective, but Latin Modern does have several objective advantages, including support for many more OpenType features (Tabular/Proportional numbers, optical sizes, fractions, and a slashed zero), more glyphs, and a math font. One big difference is the ß. – Davislor Jan 07 '19 at 00:43
  • @emacsomancer On the other hand, CMU does contain a couple of fonts that LM doesn’t (while missing a couple of other faces), supports a few more languages, including Serbian and Macedonian, and includes the small caps in the same file rather than separately. – Davislor Jan 07 '19 at 00:54
  • @emacsomancer This approach is generally what I’d recommend. It’s the closest thing in LaTeX to a standard, and this approach is source-compatible with a number of existing packages. – Davislor Jan 07 '19 at 00:57
  • I think my setup wants filenames to be formatted as e.g. ..= {[lmromancaps10-oblique.otf]}. Does it work as you have it for you? "CMU Serif Bold Non-Extended" seems to be missing for me - I have the CMU fonts installed - is there a special (or separate) version I need? – emacsomancer Jan 09 '19 at 00:39
  • @emacsomancer The way I had it works for me. I tested with LuaLaTeX on Ubuntu Linux The filename for bold non-extended is cmunrb.ttf, which might work more consistently for you. You shouldn’t need to put square braces around the filename. You might need Font = lmromancaps10-oblique.otf if you need to select font features too. Which system are you on? – Davislor Jan 09 '19 at 00:46
  • I'm on Linux as well (not Ubuntu, but I doubt it should matter, unless there's some difference in Texlive versions, if Ubuntu is using an older version). I tried with both XeLaTeX and LuaLaTeX. Maybe I need to see if there's an updated version of the CMU fonts. – emacsomancer Jan 09 '19 at 02:43
  • @emacsomancer Ubunto does have its own texlive packages. You might try searching your package repo for the CMU fonts. Otherwise, you can download from the repo to /usr/local/share/fonts/ or ~/.fonts/. But try fc-list | grep CMU first. They might be there already. – Davislor Jan 09 '19 at 03:17
  • Interestingly, this is what I had to do to get it to work: https://paste.debian.net/1059982/ . Indeed I had to have all font filenames wrapped in {[ ]}s (and the same seems to be true for Overleaf as well as my Arch local TeXlive), and some names (like the 'Non-Extended Bold') I had to change to filenames instead to get them to work (and, I had no .ttf versions, so I had to change everything to .otf - but that's surely just because of having installed .otf CMU instead of .ttf CMU, I assume). – emacsomancer Jan 12 '19 at 20:05
  • @emacsomancer Thanks! I’m not sure why you need the square brackets. That surprises me. I try to use family names where I can, but they don’t consistently work. – Davislor Jan 13 '19 at 01:18