I'm using the Hoefler Text font in xelatex with long s:

\setmainfont[Contextuals=Inner]{Hoefler Text}

enter image description here

But I want to use the ct ligature (it's from the Rare set):

\setmainfont[Contextuals=Inner, Ligatures={Rare}]{Hoefler Text}

enter image description here

Oh no! fontspec has also replaced all of Hoefler's longst ligatures with st ligatures when loading ct ligatures from the Rare ligature set.

Is there a way to enable the (Rare) ct ligature from Hoefler Text without also enabling the (Rare) st ligature? I tried to use the selnolig package to selective disable the st ligature (\nolig{st}{s|t}) but that also stops the longst ligature from being used. I'm trying to produce text how people of the early 19th century were able to:

Note: People of the early 19th century didn't buy Minion Pro for US $199 (which is like us paying US $4.1 million), so I'd also rather not =)

  • Welcome to TeX.SX! You can have a look on our starter guide to familiarize yourself further with our format. Commented Jun 1, 2013 at 3:39
  • 2
    related: suppressing certain ligatures and suppression of a ligature in xelatex
    – Nils L
    Commented Jun 1, 2013 at 8:33
  • 2
    Hello Thomas! Please look at [tex.stackexchange.com/questions/86593/… of a ligature in xelatex) which was suggested by Nils. AFAIK, switching to lualatex is currently the only option available. Either way, that question asks basically for the same thing as yours. Tell us whether they are significantly different. If not, they can be marked as duplicate.
    – yo'
    Commented Jun 1, 2013 at 8:51
  • 2
    AFAICT, the option Contextuals=Inner (to generate long-s characters automatically in initial and medial positions) currently works with XeLaTeX but not with LuaLaTeX. If you want to enable the just the ct ligature but no other "rare" ligature, you can do so in LuaLaTeX using an OpenType feature file, but you'll use the automated use of long-s glyphs. For now, the selnolig package only does ligature suppression; selective *enabling of ligatures isn't (yet) one of its capabilities. :-(
    – Mico
    Commented Jun 1, 2013 at 21:01
  • 1
    IMHO the Inner feature is not an appropriate option for taking care of correct s/ſ placement. The underlying mechanism is indifferent to the complex conventions that govern ſ usage in a given cultural/historical context, and it's indifferent to the semantic issues that are involved as well. Using Inner, your output will be full of succeſſfully miſdirected Doomſday tranſformers from Peterſburg. There's no alternative to entering the ſs correctly in the first place -- which by the way is exactly what we have Unicode (and Xe/LuaTeX) for, right? :)
    – Nils L
    Commented Jun 2, 2013 at 8:29

4 Answers 4


@tohecz: Thomas's Q is closely related to the questions I referred to, but it seems he's suffering from a problem that's not addressed in these.

I tried to use the selnolig package to selective disable the s_t ligature (\nolig{st}{s|t}) but that also stops the longst ligature from being used.

If I understand correctly, you're expecting selnolig to differentiate between an s and ſ. You're not providing an MWE, but I'm assuming that in your case selnolig just can't differentiate between the two because you don't -- I guess your text only has s and s, so there's nothing selnolig could do for you.

Educated guess: entering your ss correctly is going to produce decent results.

enter image description here

  • selnolig disabled. Minion Pro, all available ſ_ ligatures as well as c_t and (inappropriate?) s_t are present.

enter image description here

  • selnolig enabled. As above, only s_t is gone.


\setmainfont[Ligatures=Rare]{Minion Pro}
The ſide attraction for moſt ſpectators was the mustard

How about the ſ_t? -- I don't have Hoefler Text, and Minion Pro doesn't have an ſ_t (technically, it does, it's just indistinguishable from unligated ſ t). But, for example, EB Garamond does, and it's not affected by \nolig{st}{s|t} (q.e.d.).

PS: if you're planning to reproduce early 19th century style, Hoefler Text (as well as Minion) will be a bad choice. It's off by at least two centuries, as is obvious from the two Encyclopædia Britannia pages (from the second one even more drastically so than the first). Have a look at a Hoefler's Didot instead, maybe Old Standard or -- inexpensive and most appropriate -- Miller from Font Bureau.


Looking at your own answer and your insisting on the idea that a mere Contextuals=Inner is going to suffice to produce correct results -- what needs to be stressed is that correct ſ usage is not as simple as »replace all non-final s by ſ«. I suggest you have a look at how the ſ was handled in the period/the culture whose style you're trying to reproduce. In what contexts was it used? When was a s used instead? Think compound-word word boundaries. What ſ_ ligatures were available? Think, among others, ſ_s. In what contexts were which ſ_ ligatures appropriate/inappropriate? Again, think compound-word word boundaries. What was considered a compound word in the first place? etc.

enter image description here

enter image description here

Further reading: http://babelstone.blogspot.ca/2006/06/rules-for-long-s.html

  • Great font recommendations @NilsL and you are correct; I only have s (and s) in my text and do not differentiate between s and ſ so selnolig is of no help.
    – Thomas Tan
    Commented Jun 2, 2013 at 19:34
  • 1
    a simple RegEx search and replace would fix that: intial-s and mid-s to ſ, plus a manual scan to revert the replacement for inappropriate cases (ſ at word boundaries in compound words).
    – Nils L
    Commented Jun 3, 2013 at 13:36

The quickest way I ended up achieving the desired result was by keeping XeLaTeX with the Contextuals=Inner feature and replaced all occurrences of ct (which occurs far less frequently than ſ) with a command to substitute in a c_t ligature:


\newfontfamily\hoefler[Ligatures={TeX,Common},Contextuals=Inner]{Hoefler Text}
\newfontfamily\rareliga[Ligatures={TeX,Rare}]{Hoefler Text}

The side attra\ct{}ion for most spe\ct{}ators was the mustard

The side attraction for most spectators was the mustard.

Not the most elegant way, but it works. I'll go off now and start adding ligatures to Latin Modern.

  • 1
    I'd prefer \newcommand{\ct}{{\rareliga ct}}.
    – egreg
    Commented Jun 2, 2013 at 22:15

This is how to add automatic s → ſ substitution (when Contextuals=Inner is enabled) to the Latin Modern font:

feature hist {
  @notf = [a-e g-z];
  sub s' @notf by longs; # use "sf", not "longs f"
  sub longs longs' by s; # words don't end with longs
  sub f longs' by s;     # end with fs, not f_longs
} hist;

feature hlig {
  sub c t by c_t;
} hlig;

Now I just have to add appropriate ligatures for longs_i, longs_l, longs_longs, longs_longs_i, longs_longs_l and every ligature requested at http://wiki.contextgarden.net/Wishes_for_Latin_Modern.

  • don't forget longs_s, in case it's not in that list yet.
    – Nils L
    Commented Jun 4, 2013 at 19:18
  • Short 's' has no ascender so longs_s will be kerned correctly, as will every other longs_x combination where x is any letter without an ascender. If you insist on a dedicated longs_s ligature (which aren't used in the Britannica example), one already exists in the font as ß. For the German's: under the feature hist section a language DEU; sub longs s by germandbls; can be used.
    – Thomas Tan
    Commented Jun 6, 2013 at 11:13

It works, for me at least, to type Style = Historic, Ligatures = Historic

It is worth mentioning that my font is broken, it doesn't have any contextual capabilities. It is Hoefler Text Pro v1.201

  • Oh, sorry. \fontspec[Style = Historic, Ligatures = Historic]{Hoefler Text Pro} I'm on Windows by the way
    – Suppboi
    Commented Nov 7, 2017 at 18:16

You must log in to answer this question.

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