4

What is the recommended approach to change font size with the fontspec package?

I have found several ways that appear to work, but some unexpected behavior along the way. What am I doing wrong?

I switch font size with \fontsize{30pt}{36pt}\selectfont and also define a command based on it. Quite unexpectedly, as different switches are applied, the font switches across different variants. Unexpected to me. Please tell me why this is happening.

I am compiling the document with XeLaTeX. In my MWE I use the Zapfino font because that's what I was experimenting with when the unexpected behaviour occurred.

%!TEX TS-program = xelatex
%!TEX encoding = UTF-8 Unicode
\documentclass{article}
\usepackage{fontspec}
%% with fontspec package
%% How do you set font size inside the preamble?
%%
%% IN PREAMBLE
%%     1. SUCCESS
       \setmainfont[Variant = 1, Ligatures = {Common,Rare}]{Zapfino}%
%%     \setmainfont[SizeFeatures={Size=20}]{Zapfino}% appears to work...
%%     % The option SizeFeatures is not intended to set a size. It is intended to set features that are activated only for some font sizes.
%%
%%     2. CRASHES
%%     \setmainfont[Variant = 1,
%%                  SizeFeatures={Size=20}, # why doesn't this crash above?
%%                  Ligatures = {Common,Rare}
%%                  ]{Zapfino}%
%%
%%     3. NO EFFECT
%%     \fontsize{20pt}{24pt}\selectfont
%%

\begin{document}
%% %% How do you switch font size inside the document?
%% Options set after \begin{document}
%%     4. SUCCESS
%%     \fontspec[Ligatures={Common,Rare}]{Zapfino}%
%%     \fontsize{20pt}{24pt}\selectfont
%%
%%     5. ERROR. 
%%     \addfontfeature{Size=20}
%%
%%     6. CRASHES
%%     \addfontfeature{SizeFeatures={Size=20}}
%%
%%     7. SUCCESS
     \newcommand{\smallfont}[1]{%
         \fontspec[Ligatures={Common,Rare}]{Zapfino}%
         \fontsize{10pt}{12pt}\selectfont #1}
     \newcommand{\normfont}[1]{%
         \fontspec[Ligatures={Common,Rare}]{Zapfino}%
         \fontsize{20pt}{24pt}\selectfont #1}
     \newcommand{\bigfont}[1]{%
         \fontspec[Ligatures={Common,Rare}]{Zapfino}%
         \fontsize{30pt}{36pt}\selectfont #1}

\fontsize{30pt}{36pt}\selectfont
    Big 
\fontsize{20pt}{24pt}\selectfont
    and 
\fontsize{10pt}{12pt}\selectfont
    Small

\bigfont{Big} \normfont{and} \smallfont{Small}

Why are different variants of the font selected?

\end{document}

enter image description here

As egreg has explained in a comment and further in an answer, "With SizeFeatures={Size=20} you're telling to use Zapfino ONLY at size 20pt." Illustration:

%!TEX TS-program = xelatex
%!TEX encoding = UTF-8 Unicode
\documentclass{article}
\usepackage{fontspec}
\setmainfont[Variant = 1, Ligatures = {Common,Rare}]{Zapfino}%
\setmainfont[SizeFeatures={Size=20}]{Zapfino}%

\begin{document}

\fontsize{30pt}{36pt}\selectfont
    Big is not Big

\fontsize{20pt}{24pt}\selectfont
    20pt is 20pt

\fontsize{10pt}{12pt}\selectfont
    Small is not Small

\end{document}

enter image description here

  • You don't have Variant=1 in the \fontspec declarations; if I add it in the code for \bigfont, I get the same shapes for “Big”. – egreg May 15 '16 at 11:12
  • How do you mean? It is in setmainfont[Variant = 1... inside the preamble, I would expect that property to be carried forward. Or do you mean that everytime fontspec is called it resets the Variant to a default? – PatrickT May 15 '16 at 11:15
  • With \fontspec you're declaring a “new font” to use. With \newcommand{\bigfont}[1]{{\fontsize{30}{36}\normalfont #1}} you achieve the result. Note the additional braces. – egreg May 15 '16 at 11:17
  • I see. So everytime I invoke \fontspec I need to recall all the font properties, even if my purpose was only to, say, change the size? I think this would answer my question, if you wish to go ahead I'll accept it. Thanks. – PatrickT May 15 '16 at 11:20
  • Oh, and do you know why \setmainfont[SizeFeatures={Size=20}]{Zapfino} in the preamble appears to work, but not when combined with other options? – PatrickT May 15 '16 at 11:21
6

First of all, let's get away with the SizeFeatures option. If you declare

\setmainfont{Zapfino}[
  SizeFeatures={Size=20},
  % ... other options ...
]

you're basically telling to use size 20 independently of the context. If I do it and ask for \fontsize{30}{36}\selectfont, I get

LaTeX Font Warning: Font shape `EU1/Zapfino(0)/m/n' in size <30> not available
(Font)              size <20> substituted on input line 22.

Second issue. When you do \fontspec{<font>}[<options>], you're declaring a new font. In your case, Variant=1 is not inherited.

You have to do nothing special to change size:

\documentclass{article}
\usepackage{fontspec}

\setmainfont{Zapfino}[
  Variant = 1,
  Ligatures = {Common,Rare},
]

\newcommand{\smallfont}[1]{{%
  \fontsize{10pt}{12pt}\normalfont #1%
}}
\newcommand{\normfont}[1]{{%
  \fontsize{20pt}{24pt}\normalfont #1%
}}
\newcommand{\bigfont}[1]{{%
  \fontsize{30pt}{36pt}\normalfont #1%
}}

\begin{document}

\fontsize{30pt}{36pt}\selectfont
    Big 
\fontsize{20pt}{24pt}\selectfont
    and 
\fontsize{10pt}{12pt}\selectfont
    Small

\normalsize

\bigfont{Big} \normfont{and} \smallfont{Small}

Why are different variants of the font selected?

\end{document}

enter image description here

  • 1
    Thanks! I was confused by various things, but the statement Variant=1 is not inherited sums up my biggest misunderstanding. – PatrickT May 15 '16 at 11:42
  • 1
    Am I correct that I can pass Color and Variant to \addfontfeature{} but I cannot pass a size argument such as Size or similar? – PatrickT May 15 '16 at 11:55
  • 2
    @PatrickT Yes, font size should be controlled on the LaTeX side. – egreg May 15 '16 at 12:27
  • 2
    The answer answers OP's question 'How do you switch font size inside the document?', but it doesn't answer OP's other question: 'How do you set font size inside the preamble?' Do you use \fontsize{<fontsize>pt}{<baselineskip>pt}\selectfont in the preamble too? Is there a way to pass the size option to fontspec or do you need to let LaTeX take care of it by using \fontsize? – Evan Aad Jun 13 '17 at 7:34
  • 3
    @EvanAad You can use Scale=<factor> – egreg Jun 13 '17 at 8:08

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.