我即将从传统的硬编码字体并在其顶部添加变音符号的方式转变为简单地使用utf8
。然而,令我惊讶的是,字体的渲染却大不相同。
\documentclass[12pt]{article}
%\usepackage[utf8]{inputenc}
%\usepackage[T1]{fontenc}
\begin{document}
A\'A\AA E\'EI\'IO\'O\"O\H{O}U\'U\"U\H{U}
\end{document}
请注意,utf8
字体中的顶部变音符号被向下推,字母\AA
“带环的 A”似乎被渲染为“带椭圆的 A”。对于习惯了第一种变体的我的眼睛来说,第二种渲染方式简直让人无法接受。有没有办法微调utf8
,以渲染变音符号完全一样和上面一样吗?如果我删除该行\usepackage[T1]{fontenc}
,渲染看起来就没问题了。但是我无法从中复制粘贴pdf
,连字符不起作用,等等。
答案1
复杂解决方案
此解决方案跳过加载fontenc
并使用包newunicodechar
重新定义重音字符,以便在保留原始重音的同时一些连字符。所用的技巧是拆分单词,同时将单词之间的空间缩短为零。
正如我所说,一些(但不是全部)连字符和连字被保留了下来。从 pdf 复制应该像不使用一样有效fontenc
(对我来说(Ubuntu 上的 Evince)这样就很好了)。字距调整对重音字母不起作用。此外,代码在各种情况下都会失败(例如在章节标题和说明中),但在这些情况下,您可以使用旧命令,例如\"O
etc。
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{newunicodechar}
\newcommand{\DeclareAccentChar}[2]{%
\newunicodechar{#1}{%
\bgroup
\newdimen\originalspacelength%
\newdimen\originalspacestretch%
\newdimen\originalspaceshrink%
\originalspacelength=\fontdimen2\font%
\originalspacestretch=\fontdimen3\font%
\originalspaceshrink=\fontdimen4\font%
\fontdimen2\font=0pt%
\fontdimen3\font=0pt%
\fontdimen4\font=0pt%
#2%
\nolinebreak\space
\fontdimen2\font=\originalspacelength
\fontdimen3\font=\originalspacestretch
\fontdimen4\font=\originalspaceshrink
\egroup}}
\DeclareAccentChar{Á}{\'A}
\DeclareAccentChar{Å}{\AA}
\DeclareAccentChar{É}{\'E}
\DeclareAccentChar{Í}{\'I}
\DeclareAccentChar{Ó}{\'O}
\DeclareAccentChar{Ö}{\"O}
\DeclareAccentChar{Ő}{\H{O}}
\DeclareAccentChar{Ú}{\'U}
\DeclareAccentChar{Ü}{\"U}
\DeclareAccentChar{Ű}{\H{U}}
\DeclareAccentChar{ö}{\"o}
\DeclareAccentChar{é}{\'e}
\begin{document}
AÁÅEÉIÍOÓÖŐUÚÜŰ
\parbox{0pt}{\null\ cooperation}
\hspace{3em}
\parbox{0pt}{\null\ coöperation}
\hspace{4em}
\parbox{0pt}{\null\ co\-öp\-er\-a\-tion}
\bigskip
\parbox{3em}{VAV VÅV}
soufflé
\end{document}
由于重音字符被定义为常规 LaTeX 表达式,因此可以编辑代码以改进从 pdf 复制的功能。此外,还可以通过局部放宽 TeX 的连字限制来获得更多的连字点。
如果你更喜欢Steven B. Segletes 的回答,只需将该答案中的以下代码与小写字符的定义(请注意,小写 i 需要定义为\DeclareAccentChar{í}{\'\i}
)添加到一起即可获得与他的相同的输出(除了Å取自Computer Modern而不是Latin Modern)同时保留一些连字符。
\usepackage{stackengine,scalerel,graphicx}
\renewcommand\'[1]{\stackengine{.15ex}{#1}{%
\scalebox{1.2}[.75]{\scaleto{\scriptscriptstyle\prime}{.6ex}}}{O}{c}{F}{T}{S}}
\renewcommand\H[1]{\stackengine{.15ex}{#1}{%
\scalebox{1.2}[.75]{\scaleto{\scriptscriptstyle\prime\kern-.03em\prime}{.6ex}}}{O}{c}{F}{T}{S}}
\renewcommand\"[1]{\stackengine{.2ex}{#1}{%
.\kern-.1em.}{O}{c}{F}{T}{S}}
正确的字距调整
此代码添加了一个可选参数来获得正确的字距调整,但它确实会干扰文本的复制。如果重音字符的宽度与非重音字符的宽度不匹配,它将失败。此外,在查看 pdf 时,字符可能看起来比平时更粗,但它应该可以正常打印(我希望)。
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{newunicodechar}
\newlength\charwidth%
\newcommand{\DeclareAccentChar}[3][]{%
\newunicodechar{#2}{%
#1%
\settowidth{\charwidth}{#1}%
\kern-\charwidth
\newdimen\originalspacelength
\newdimen\originalspacestretch
\newdimen\originalspaceshrink
\originalspacelength=\fontdimen2\font
\originalspacestretch=\fontdimen3\font
\originalspaceshrink=\fontdimen4\font
\fontdimen2\font=0pt%
\fontdimen3\font=0pt%
\fontdimen4\font=0pt%
#3%
\kern-\charwidth%
\nolinebreak\space
\fontdimen2\font=\originalspacelength
\fontdimen3\font=\originalspacestretch
\fontdimen4\font=\originalspaceshrink
#1}}
\DeclareAccentChar{Á}{\'A}
\DeclareAccentChar[A]{Å}{\AA}
\begin{document}
\parbox{3em}{VAV VÁV}
\parbox{3em}{VAV VÅV}
\end{document}
更简单的解决方案
你可以\usepackage{lmodern}
得到一个介于两者之间的版本。特别是,Å 上的环是一个圆圈(虽然比原来的要厚一些)。重音的倾斜度也较小,尤其是 Ő 和 Ű。
使用此方法,字距调整、连字符和复制都可以正常工作。除非您确实想要原始重音或更喜欢 cm-super,否则这是可行的方法。
\documentclass[12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\begin{document}
A\'A\AA E\'EI\'IO\'O\"O\H{O}U\'U\"U\H{U}
\end{document}
进一步阅读:拉丁现代与 cm-super?
答案2
可以使用lmodern
,但重新定义函数\'
、\H
和\"
,尽管这可能存在一些危险。正如 wipet 指出的那样,这种方法会破坏连字符 (*),这本身就足以建议不要使用它。
(*)基于最近与 egreg 的对话规则前的单词不分,添加到\nobreak\hspace{0pt}
我的变音符号重新定义的末尾stackengine
将允许在变音符号后面的文本中进行片段连字。当然,始终可以添加手动连字。
\documentclass[12pt]{article}
\usepackage[T1]{fontenc}
\usepackage{lmodern,stackengine,scalerel,graphicx}
\renewcommand\'[1]{\stackengine{.15ex}{#1}{%
\scalebox{1}[.75]{\scaleto{\scriptscriptstyle\prime}{.6ex}}}{O}{c}{F}{F}{S}%
\nobreak\hspace{0pt}}
\renewcommand\H[1]{\stackengine{.15ex}{#1}{%
\scalebox{1}[.75]{\scaleto{\scriptscriptstyle\prime\prime}{.6ex}}}{O}{c}{F}{F}{S}%
\nobreak\hspace{0pt}}
\renewcommand\"[1]{\stackengine{.2ex}{#1}{%
.\kern-.1em.}{O}{c}{F}{F}{S}\nobreak\hspace{0pt}}
\begin{document}
A\'A\AA E\'EI\'IO\'O\"O\H{O}U\'U\"U\H{U}
a\'a\aa e\'ei\'{\char"019}o\'o\"o\H{o}u\'u\"u\H{u}
\smallskip\tiny
A\'A\AA E\'EI\'IO\'O\"O\H{O}U\'U\"U\H{U}
\parbox{0pt}{\null\ cooperation}
\parbox{0pt}{\null\ co\"operation}
\parbox{0pt}{\null\ co\-\"op\-er\-a\-tion}
\end{document}
应 OP 的要求,我把素数水平加粗了(水平拉伸 20%)……当然,这样做的代价是让它们稍微倾斜一些。我还稍微缩短了双重音符之间的距离\H
。
\documentclass[12pt]{article}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{stackengine,scalerel,graphicx}
\renewcommand\'[1]{\stackengine{.15ex}{#1}{%
\scalebox{1.2}[.75]{\scaleto{\scriptscriptstyle\prime}{.6ex}}}{O}{c}{F}{T}{S}%
\nobreak\hspace{0pt}}
\renewcommand\H[1]{\stackengine{.15ex}{#1}{%
\scalebox{1.2}[.75]{\scaleto{\scriptscriptstyle\prime\kern-.03em\prime}{.6ex}}}{O}{c}{F}{T}{S}%
\nobreak\hspace{0pt}}
\renewcommand\"[1]{\stackengine{.2ex}{#1}{%
.\kern-.1em.}{O}{c}{F}{T}{S}\nobreak\hspace{0pt}}
\begin{document}
A\'A\AA E\'EI\'IO\'O\"O\H{O}U\'U\"U\H{U}
a\'a\aa e\'ei\'{\char"019}o\'o\"o\H{o}u\'u\"u\H{u}
\smallskip\tiny
A\'A\AA E\'EI\'IO\'O\"O\H{O}U\'U\"U\H{U}
\end{document}