我在我的一份文档中发现字母 F 对齐不太好:
我尝试了不同的字体https://tug.org/FontCatalogue/。
有没有办法可以很好地对齐 F。
我知道这是字体的问题。在 word 中也会发生这种情况:
您可以在这里找到并编辑我的示例:https://www.overleaf.com/6991348982vwhhwrtvpfcn
答案1
您所看到的是角色的侧边栏。
尝试使用此代码(需要 lualatex)来打开和关闭开关\dropsidebearings
。由 Marcel Krüger 提供。
看 点无法与文本正确对齐以及其中的链接。
% !TeX TS-program = lualatex
\documentclass[12pt, a4paper]{article}
\RequirePackage{showframe} % margin line
\renewcommand\ShowFrameLinethickness{0.1pt}
\renewcommand\ShowFrameColor{\color{red}}
\RequirePackage{luacode}
\newcount\dropsidebearings
\begin{luacode*}
------------------------drop_sidebearing------------------------
--https://tex.stackexchange.com/questions/427068/sidebearings-and-precision-left-right-alignment?noredirect=1&lq=1
--In LuaTeX, you can use the post_linebreak_filter to intercept the broken lines and
-- add some offsets. The sidebearings can be extracted from rawdata saved by luaotfload.
-- After adding the offsets, the hboxes have to be repacked to determine the new glue settings.
---updated for 1.09
--https://tex.stackexchange.com/questions/470276/perfect-alignment-luatex-and-sidebearings-part-ii
------------------------drop_sidebearing------------------------
local function drop_sidebearing(head, groupcode)
if tex.count['dropsidebearings'] == 0 then
return true
end
for n in node.traverse_id(node.id'hlist', head) do
local char = node.has_glyph(n.head)
if char then
local f = font.getfont(char.font)
if f.shared then
local kern = node.new(node.id'kern')
kern.kern = - f.shared.rawdata.descriptions[char.char].boundingbox[1]*f.size/1000
n.head = node.insert_before(n.head, char, kern)
end
end
for ch in node.traverse_id(node.id'glyph', n.head) do
char = ch
end
if char then
local f = font.getfont(char.font)
if f.shared then
local desc = f.shared.rawdata.descriptions[char.char]
local kern = node.new(node.id'kern')
kern.kern = - (desc.width-desc.boundingbox[3])*f.size/1000
node.insert_after(n.head, char, kern)
end
end
local new_list = node.hpack(n.head, n.width, 'exactly')
new_list.head = nil
n.glue_order = new_list.glue_order
n.glue_set = new_list.glue_set
n.glue_sign = new_list.glue_sign
node.free(new_list)
end
return true
end
luatexbase.add_to_callback('post_linebreak_filter', drop_sidebearing, 'Drop sidebearings after linebreaking')
\end{luacode*}
\setlength{\parindent}{0pt}
\renewcommand{\familydefault}{\sfdefault}
\begin{document}
\dropsidebearings=1
dropsidebearing =1 (no sideberarings)
\Huge F
\huge F
\LARGE F
\Large F
\large F
\dropsidebearings=0
dropsidebearing =0 (normal sideberarings)
\Huge F
\huge F
\LARGE F
\Large F
\large F
\end{document}