After the conclusions in previous post (deleted, now here); I finally managed to find a cheatery so that \bfseries\scshape
will result with the normal small caps, but 'fake bolded', using the option of fontspec
; and without complaining (and preserving capital letters).
The trick is to issue a call to \fontspec
requesting Junicode (regular) in fake bold (this will create a new font family, Junicode(1)) after the initial \setmainfont
(which creates a new font family, Junicode(0)). Then, using the Latex2e command \DeclareFontShape
we can map bold smallcaps of Junicode(0) (which don't exist); to smallcaps of fakebold Junicode(1) (which do).
You can track down the correct syntax for \DeclareFontShape
by observing the warnings generated without it, which for me were:
LaTeX Font Warning: Font shape `EU1/Junicode(0)/bx/sc' undefined
(Font) using `EU1/Junicode(0)/bx/n' instead on input line 37.
This is the result of the example code:

... and this is the code, compiled with xelatex test.tex
:
\documentclass[letterpaper,12pt]{article}
% \typeout{ == \the\paperwidth / \the\paperheight ==}
% \typeout{ == \the\pdfpagewidth / \the\pdfpageheight ==}
\pdfpagewidth=\paperwidth \pdfpageheight=\paperheight
\usepackage{fontspec}
\defaultfontfeatures{Ligatures=TeX}
\setmainfont{Junicode}
% each \setmainfont / fontspec command creates a new Junicode(X) font
% here we are at Junicode(0)
% create Junicode(1) with fake bold
\fontspec[FakeBold=2.5]{Junicode}
% map Junicode(0)/bx/sc (bold smallcaps) to Junicode(1)/m/sc (normal smallcaps of fake bold)
\DeclareFontShape{EU1}{Junicode(0)}{bx}{sc}{<->ssub * Junicode(1)/m/sc}{}
\makeatletter
\newcommand{\showfont}{Encoding: \f@encoding{},
Family: \f@family{},
Series: \f@series{},
Shape: \f@shape{},
Size: \f@size{}
}
\makeatother
\begin{document}
{\scshape \showfont Aa}
{\fontspec[Letters=SmallCaps]{Junicode} \showfont Aa}
{\bfseries\scshape \showfont Aa}
\end{document}
Well, hope this helps someone,
Cheers!
EDIT: Just wanted to note that this code can also be compiled by lualatex
(if you have the needed packages installed); however, one difference is that lualatex
cannot understand OpenType options like 'FakeBold':
.................................................
. fontspec info: "defining-font"
.
. Font family 'Junicode(0)' created for font 'Junicode' with options
. [Ligatures=TeX,Scale=1.0].
.
. This font family consists of the following shapes:
.................................................
luaotfload | load font: font family='junicode', subfamily='regular' found: /usr
/share/fonts/truetype/ttf-junicode/Junicode-Regular.ttf
fontspec: script 'latn' exists in font 'JunicodeRegular'
*************************************************
* fontspec warning: "fakebold-only-xetex"
*
* The "FakeBold" and "AutoFakeBold" options are only available with XeLaTeX.
* Option ignored.
*************************************************
On the other hand, xelatex
seems to embed a separate font in the PDF for each new "font family" instantiated when new options (like 'FakeBold') are requested - from a similar example I'm working on:
$ pdffonts test.pdf
name type emb sub uni object ID
------------------------------------ ----------------- --- --- --- ---------
WOHRES+Junicode-Regular CID TrueType yes yes yes 6 0
ZNKKUV+Junicode-Italic CID TrueType yes yes yes 18 0
HHUNME+Junicode-Bold CID TrueType yes yes yes 23 0
YSORBG+Junicode-Regular CID TrueType yes yes yes 50 0
GDUQPQ+Junicode-Regular CID TrueType yes yes yes 64 0
MLJVAZ+Junicode-Regular CID TrueType yes yes yes 72 0
CHJXWV+Junicode-Regular CID TrueType yes yes yes 74 0
... while lualatex
, on the same .tex source (the one warning about 'FakeBold') will seemingly "compact" all the embedded fonts in the PDF:
$ pdffonts test.pdf
name type emb sub uni object ID
------------------------------------ ----------------- --- --- --- ---------
VVMOBU+Junicode-Regular CID TrueType yes yes yes 39 0
QEUPWF+Junicode-Italic CID TrueType yes yes yes 53 0
VJZORW+Junicode-Bold CID TrueType yes yes yes 58 0