Enabling c_t and longs_t without enabling s_t ligatures

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

\usepackage{fontspec}
\setmainfont[Contextuals=Inner]{Hoefler Text}


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

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


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. – Heiko Oberdiek Jun 1 '13 at 3:39
• – Nils L Jun 1 '13 at 8:33
• 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' Jun 1 '13 at 8:51
• 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 Jun 1 '13 at 21:01
• 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 Jun 2 '13 at 8:29

@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.

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

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

code:

\documentclass{scrartcl}
\usepackage{fontspec,selnolig}
\setmainfont[Ligatures=Rare]{Minion Pro}
\nolig{st}{s|t}
\begin{document}
The ſide attraction for moſt ſpectators was the mustard
\end{document}


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.

update

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.

• 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 Jun 2 '13 at 19:34
• 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 Jun 3 '13 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:

\documentclass{standalone}
\usepackage{fontspec}

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

\begin{document}
\hoefler
The side attra\ct{}ion for most spe\ct{}ators was the mustard
\end{document}


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

• I'd prefer \newcommand{\ct}{{\rareliga ct}}. – egreg Jun 2 '13 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 Jun 4 '13 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 Jun 6 '13 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 Nov 7 '17 at 18:16