有没有一种好的(可能是免费的)opentype字体,带有小型大写数字和小问号和感叹号;我可以将它们与xelatex + fontspec一起使用吗?
或者,更好的办法是,有没有一种变通方法,我可以使用 Linux Libertine 或 TeX Gyre Pagella 等优秀的免费字体?我需要这个字体来显示我的页面标题,我想将其排版为全小写;因此,如果能在我的页面样式宏中加入某种机制,那将非常有用。缩小全大写不是办法——例如,在 Linux Libertine 中,内联数字、问号和感叹号明显小于大写字母,而且无论如何,缩放大写字母看起来并不好。
基于这个答案我尝试了以下内容,它似乎在普通文本中起作用,但在页面样式宏中不起作用(我对和不是很熟悉\catcode
,\lccode
因此或多或少是复制粘贴和反复试验;也许它只是需要偶尔\protect
散布一些?):
File mysmallcaps.sty
:
\ProvidesPackage{mysmallcaps}
\newenvironment{mylcsc}{%
\addfontfeature{Letters=UppercaseSmallCaps,Letters=SmallCaps,LetterSpace=2,WordSpace=1.2,Numbers=Lining}%
\catcode`\'=\active\begingroup\lccode`\~=`\'\lowercase{\endgroup\def~{\protect\raisebox{-0.45ex}{\kern0.03em'}}}%
\catcode`!=\active\begingroup\lccode`\~=`!\lowercase{\endgroup\def~{\protect\scalebox{1}[0.75]{\kern0.01em!}}}%
\catcode`?=\active\begingroup\lccode`\~=`?\lowercase{\endgroup\def~{\protect\scalebox{1}[0.75]{\kern0.02em?}}}%
\catcode`1=\active\begingroup\lccode`\~=`1\lowercase{\endgroup\def~{\protect\scalebox{1}[0.8]{1}}}%
\catcode`2=\active\begingroup\lccode`\~=`2\lowercase{\endgroup\def~{\protect\scalebox{1}[0.8]{2}}}%
\catcode`3=\active\begingroup\lccode`\~=`3\lowercase{\endgroup\def~{\protect\scalebox{1}[0.8]{3}}}%
\catcode`4=\active\begingroup\lccode`\~=`4\lowercase{\endgroup\def~{\protect\scalebox{1}[0.8]{4}}}%
\catcode`5=\active\begingroup\lccode`\~=`5\lowercase{\endgroup\def~{\protect\scalebox{1}[0.8]{5}}}%
\catcode`6=\active\begingroup\lccode`\~=`6\lowercase{\endgroup\def~{\protect\scalebox{1}[0.8]{6}}}%
\catcode`7=\active\begingroup\lccode`\~=`7\lowercase{\endgroup\def~{\protect\scalebox{1}[0.8]{7}}}%
\catcode`8=\active\begingroup\lccode`\~=`8\lowercase{\endgroup\def~{\protect\scalebox{1}[0.8]{8}}}%
\catcode`9=\active\begingroup\lccode`\~=`9\lowercase{\endgroup\def~{\protect\scalebox{1}[0.8]{9}}}%
\catcode`0=\active\begingroup\lccode`\~=`0\lowercase{\endgroup\def~{\protect\scalebox{1}[0.8]{0}}}%
}{}
% redefining \ps@headings like this does _not_ work:
\def\ps@mynewheadings{%
\ps@headings
\let\@oddfoot\@empty\let\@evenfoot\@empty
\def\@evenhead{%
\thepage\hfil
\normalfont\small\begin{mylcsc}\MakeLowercase{\leftmark}\end{mylcsc}%
}%
\def\@oddhead{%
{\normalfont\small\begin{mylcsc}\MakeLowercase{\rightmark}\end{mylcsc}}%
\hfil\thepage%
}%
}
\pagestyle{mynewheadings}
文件test.tex
:
\documentclass{book}
\usepackage{lipsum}
\usepackage{fontspec}
\setmainfont[Numbers=OldStyle, Ligatures=TeX]{Linux Libertine O}
\usepackage{mysmallcaps}
\begin{document}
\chapter{Here comes Orwell's 1984!}
\section{Whatever happened in 336\,\textsc{bc} that made the high priest blush?}%
Can't? Won't! 0123456789\\[3mm]
\emph{Small-caps with homemade corrections:}\\
\begin{mylcsc}Can't? Won't! 0123456789\end{mylcsc}\\[3mm]
\emph{Scaled all-caps:}\\
\scalebox{0.65}[0.65]{\addfontfeature{Numbers=Lining, LetterSpace=4}\MakeUppercase{Can't? Won't! 0123456789}}\\[12mm]
\lipsum\lipsum
\end{document}
\endinput
答案1
即使在商业字体中,也很少有小写数字和标点符号,但以下字体有,而且我已成功将它们与 和 一起使用luatex
:xetex
Augustin、Cartier Book Pro、Jannon 10 Pro 和 Neacademia Latin。对于 Jannon 10 Pro,您必须Script=Default
在调用 时指定fontspec
才能使该功能正常工作。
下面是一个演示,从中你可以看出 Neacademia 和 Cartier 的小写数字的上升部分和下降部分更多地向内收(Cartier)或更少地向内收(Neacademia),而 Jannon 和 Augustin 的小写数字则是排列整齐的。
\documentclass{article}
\usepackage{fontspec}
\setmainfont[Contextuals=Alternate]{Neacademia Latin}
\newfontfamily\jannon[
Script=Default,
Contextuals=Inner,
Numbers=OldStyle,
ItalicFeatures={Contextuals={WordInitial,WordFinal}}
]{Jannon 10 Pro}
\newfontfamily\augustin[
BoldFont={Augustin Bold},
BoldItalicFont={Augustin Bold Italic},
BoldFeatures={SmallCapsFont={Augustin Bold Small Caps}},
ItalicFont={Augustin Italic},
SmallCapsFont={Augustin Small Caps}
]{Augustin-Regular}
\newfontfamily\cartier[BoldFont={* Medium}]{Cartier Book Pro}
\begin{document}
\begin{tabular}{rl}
Neacademia Latin & George Orwell, 1984?! \textsc{george orwell, 1984?!}\\
\jannon Jannon 10 Pro & \jannon George Orwell, 1984?! \textsc{george orwell, 1984?!}\\
\cartier Cartier Book Pro & \cartier George Orwell, 1984?! \textsc{george orwell, 1984?!}\\
\augustin Augustin & \augustin George Orwell, 1984?! \textsc{george orwell, 1984?!}
\end{tabular}
\end{document}
答案2
根据@Steven 对我的 OP 的评论中的某些链接,我想到了一个实际上不是解决方案的解决方法,而是一个可行的(对我来说)解决方法(结果需要以高分辨率/放大率打印或查看,因为提示似乎与纯粹的字形有很大不同):
\documentclass{book}
\usepackage[landscape]{geometry}
\usepackage{xltxtra}
\usepackage{fontspec}
\usepackage{newunicodechar}
\newif\ifsc\scfalse
% Get me my capital ß:
\newunicodechar{ß}{\ss}
\let\oldSS\SS
\renewcommand{\SS}{\iffontchar\font"1E9E \symbol{"1E9E}\else \oldSS\fi}
%
\newcommand{\Ziffer}[2]{\ifsc\iffontchar\font#1 \symbol{#1}\else #2\fi\else #2\fi}
\newcommand{\Null}{\Ziffer{"E108}{0}}%
\newcommand{\Eins}{\Ziffer{"E109}{1}}%
\newcommand{\Zwei}{\Ziffer{"E10A}{2}}%
\newcommand{\Drei}{\Ziffer{"E10B}{3}}%
\newcommand{\Vier}{\Ziffer{"E10C}{4}}%
\newcommand{\Fuenf}{\Ziffer{"E10D}{5}}%
\newcommand{\Sechs}{\Ziffer{"E10E}{6}}%
\newcommand{\Sieben}{\Ziffer{"E10F}{7}}%
\newcommand{\Acht}{\Ziffer{"E110}{8}}%
\newcommand{\Neun}{\Ziffer{"E111}{9}}%
%
\setmainfont[Numbers={OldStyle,Proportional}, Ligatures=TeX]{Linux Libertine O}
%
\newcommand{\fakesc}[1]{{%
\sctrue%
\addfontfeature{%
LetterSpace=2,
Numbers={Lining, Proportional},
FakeStretch=1.157,
FakeBold=1.01,
}%
\scalebox{0.7}[0.7]{{\MakeUppercase{#1}}}%
}}
\newcommand{\testtext}{(h\Null\Eins\Zwei\Drei\Acht\Neun h)? -- Don't! -- aäbcdefghijklmnoöpqrsßtuüvwxyz}
\begin{document}\noindent
\normalsize normal font\\
\normalfont\LARGE \testtext\\[2mm]
\normalsize caps\,+\,smallcaps, out of the box:\\
\LARGE \textsc{\testtext}\\[2mm]
\normalsize homemade smallcaps (please compare at high resolution):\\
\LARGE \fakesc{\testtext}\\[2mm]
\end{document}
\endinput
如您所见,对于我的目的而言,生成的字体比原始的 caps+smallcaps 效果更好。 竖纹明显减少 — — 好吧,仍有 ÄÖÜ 和 Q 和 J,但它们比原始 c+sc 形状的干扰少得多。 !?() 和 ' 表现非常好。 如果我不使用 \scalebox,而是使用现有或自定义的额外 fontsize 命令,结果甚至会连字符(我不需要)。
待办事项:我感觉并非所有使用符号“E108 到”E111 的字体都使用这些位置来放置全大写数字。所以我想我需要进行某种测试来概括这一点,并使它在不适用的地方无害。