XeLaTeX
我正在使用和包排版大量拉丁文本polyglossia
。我想让小写字母“u”在转换为大写字母(包括小写字母)时自动打印为“V”。因此,
\documentclass{book}
\usepackage{fontspec,xltxtra,xunicode}
\usepackage{polyglossia}
\setmainlanguage{latin}
\begin{document}
Lorem ipsum\par
\textsc{Lorem ipsum}\par
LOREM IPSUM\par
\end{document}
应打印“u” – 然后打印“V”作为小写字母 – 大写字母“V”。
答案1
如果您选择使用LuaLaTeX
而不是——幸运的是,Lua(La)TeX 和几个月前就开始很好地配合使用了——您可以按照以下方法实现您的目标。首先,定义一个“OpenType 功能文件”,例如XeLaTeX
polyglossia
# Scripts and languages
# If the font uses others, they should be defined here too
languagesystem DFLT dflt;
languagesystem latn dflt;
# Create two u to v substitutions and assign them to
# "required" ligature group
feature rlig {
sub u.sc by v.sc;
sub U by V;
} rlig;
将此文件命名为。请注意,将各种su-to-v.fea
替换为s 被分配给所谓的“必需”连字组。我建议您这样做,因为我熟悉的大多数 Opentype 字体系列都没有“必需”连字。这样,无论您对“必需”连字做什么都不会干扰其他工作。以下输出u
v
\fontspec
由以下 MWE 制作:
% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{fontspec}
\usepackage{polyglossia}
\setmainlanguage{latin}
\setmainfont[FeatureFile= u-to-v.fea, % file that contains the substitution rules
Ligatures={Required}] % enable "required" ligatures
{EB Garamond} % choose whatever Opentype font works for you
\newcommand{\spqr}{Senatus Populusque Romanus}
\begin{document}
\spqr % lowercase, no substitution needed
\textsc{\spqr} % small caps, substitution is needed
\MakeUppercase{\spqr} % uppercase, substitution is needed
\end{document}
附录,由 OP 的后续评论提示:您问如何将 u-to-v 转换的范围限制在文档的拉丁部分。一种实现方法是使用\setmainfont
设置文档的常规文本字体并使用命令\newfontfamily
设置具有特定属性的另一种字体(例如执行 u-to-v 转换)。下面的示例提供了一些关于如何做到这一点的具体建议。
另外,你似乎要排版很多拉丁文本全部采用小写字母和/或大写字母,对吗?您可能已经知道,大多数字体系列都需要一定的字母间距,以防止全小写字母和/或全大写字母的文本显得过于拥挤。(我认为,如果EB Garamond
使用上例中使用的文本字体,则肯定会显得拥挤。)但是,microtype
您不必摆弄诸如 之类的软件包的字母间距设置,而是可以使用 之类的字体,Trajan Pro
该字体已经为“小写字母”和常规大写字母的文本设置了完美的字母间距。 (Trajan Pro
恰好是 MacOSX 上的系统字体;在其他平台上可能不免费提供。)请注意,由于Trajan Pro
不提供“官方”小写字母,只提供看起来像常规大写字母的缩小版的小写字母,因此在下面的示例中需要第二个 Opentype 功能文件,以提供u
tov
而不是u.sc
to 的替换规则v.sc
。无论如何,请考虑一下应该使用哪种字体或哪种字母间距设置来以视觉上吸引人的方式呈现文档的拉丁部分。
%% Feature File u2v-1.fea
languagesystem DFLT dflt;
languagesystem latn dflt;
feature rlig {
sub u.sc by v.sc;
sub U by V;
} rlig;
%% Feature File u2v-2.fea
languagesystem DFLT dflt;
languagesystem latn dflt;
feature rlig {
sub u by v;
sub U by V;
} rlig;
% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{fontspec}
\setmainfont[Ligatures={TeX,Common}]{EB Garamond}
\newfontfamily{\latinone}[FeatureFile = u2v-1.fea,
Ligatures={NoCommon,Required}]{EB Garamond}
\newfontfamily{\latintwo}[FeatureFile = u2v-2.fea,
Ligatures={NoCommon,Required}]{Trajan Pro}
% some LaTeX macros to encase text in latinone-lowercase, latinone-uppercase, etc
\newcommand{\latinonelc}[1]{{\latinone \scshape\MakeLowercase{#1}}}
\newcommand{\latinoneuc}[1]{{\latinone \MakeUppercase{#1}}}
\newcommand{\latintwolc}[1]{{\latintwo \MakeLowercase{#1}}}
\newcommand{\latintwouc}[1]{{\latintwo \MakeUppercase{#1}}}
\usepackage{polyglossia}
\setmainlanguage{latin}
\newcommand{\spqr}{Senatus Populusque Romanus}
\begin{document}
\begin{tabular}{lll}
\spqr & EB Garamond & unmodified\\[1ex]
\latinonelc{\spqr} & EB Garamond & u.sc$\to$v.sc, all-smallcaps\\
\latinoneuc{\spqr} & EB Garamond & U$\to$V, all-uppercase\\[1ex]
\latintwolc{\spqr} & Trajan Pro & u$\to$v, ``all-lowercase''\\
\latintwouc{\spqr} & Trajan Pro & U$\to$V, all-uppercase
\end{tabular}
\end{document}
答案2
\usepackage{xesearch}
\begin{document}
\MakeBoundary{abcdefghijklmnopqrstvwxyzABCDEFGHIJKLMNOPQRSTVWXYZ}
\SearchList*{lowercase}{v}{u}
\SearchList*{uppercase}{V}{U}
Lorem ipsum
或者用 进行破解\catcode
,使其u
成为\active
角色类等等。