是否可以告诉 (La)TeX 调整特定字符组合的字距?例如,假设我想要!!
排版为!\kern 1.2pt!
,就像ff
会自动变成连字,或者--
会转换为短划线。我知道我可以为这个组合创建一个命令——我要求一种方法,只需输入!!
并让它使用我想要的字距。
答案1
调整字体字距
如果您需要调整字体的字距,简短的回答是:
不,不是在 TeX 内部。
是的,如果你愿意创建一个虚拟字体。
是的,如果你能够使用 fontforge 编辑字体(仅限 OpenType 字体,用于 XeTeX 或 LuaTeX)。
是的,如果您使用 LuaTeX 和 OpenType 字体;请参阅 fontspec 手册第 11 条:“OpenType 字体功能文件”。
我仅有选项 1 和 4 的经验。
XeTeX 的 interchartoks
XeTeX 提供了一项称为“interchartoks”的功能,允许在不同“类别”的字符之间自动插入标记。添加此功能是为了方便在两种不同文字之间自动切换字体和语言(例如,从日语到阿拉伯语)。
此功能可用于在字符之间添加字距调整,如 Philipp 的回答中所示。(除了 之间!!
,您还可以选择调整 周围的间距:
以适应法语字体。)例如,如果使用此功能,那么当 XeTeX!!
在输入中遇到时,它会将其解释为!\exclamkern!
。那里发生的任何字距调整都将独立于当前字体,这通常不适合更改字母之间的字距调整。但对于非常特殊的用例,此技术适用于进行微小调整。
答案2
使用 LuaTeX,您可以用任意方式即时修补字体:
\documentclass{minimal}
\usepackage{fontspec}
\usepackage{luacode}
\begin{luacode*}
local function add_exclam_kern(fontdata)
if fontdata then
local chars = fontdata.characters
if chars then
local ch = chars[33]
if ch then
if not ch.kerns then
ch.kerns = { }
end
ch.kerns[33] = -100000
end
end
end
end
luatexbase.add_to_callback("luaotfload.patch_font",
add_exclam_kern, "add_exclam_kern")
\end{luacode*}
\setmainfont{Arial}
\begin{document}
!!
\end{document}
使用 XeTeX,您可以使用字符间标记:
\documentclass{minimal}
\usepackage{fontspec}
\setmainfont{Arial}
\XeTeXinterchartokenstate=1
\newXeTeXintercharclass\ExclamClass
\XeTeXcharclass 33=\ExclamClass
\XeTeXinterchartoks\ExclamClass\ExclamClass={\kern-1.5pt }
\begin{document}
!!
\end{document}
答案3
免责声明:这还没有在真实文档中彻底测试,将非标准类别代码应用于文档可能会破坏其他内容,因此请谨慎使用。
不改变字体的 TeX 唯一方法是使字符处于活动状态并定义它来检查下一个字符(这是一种 hack 方式)。例如,替换!!
为!\kern 1.2pt!
一个字符可以使用:
\documentclass[preview,border=5mm]{standalone}
\begin{document}
!\kern 1.2pt!\\
\makeatletter
\let\exclamationmarkbak!
\catcode`\!=13
\def!{\@ifnextchar!{\exclamationmarkbak\kern 1.2pt}{\exclamationmarkbak}}
\makeatother
!!\\
!a
\end{document}