有没有办法调整特定字符组合的字距?

有没有办法调整特定字符组合的字距?

是否可以告诉 (La)TeX 调整特定字符组合的字距?例如,假设我想要!!排版为!\kern 1.2pt!,就像ff会自动变成连字,或者--会转换为短划线。我知道我可以为这个组合创建一个命令——我要求一种方法,只需输入!!并让它使用我想要的字距。

答案1

调整字体字距

如果您需要调整字体的字距,简短的回答是:

  1. 不,不是在 TeX 内部。

  2. 是的,如果你愿意创建一个虚拟字体。

  3. 是的,如果你能够使用 fontforge 编辑字体(仅限 OpenType 字体,用于 XeTeX 或 LuaTeX)。

  4. 是的,如果您使用 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}

在此处输入图片描述

相关内容