我想写一个粗体单词,后跟一个逗号和一个非粗体单词,如下所示:
\textbf{why}, blah
如果我只是写,why,
TeX 会插入一个字距,将逗号稍微移近“y”。但是当我写{why},
(即使没有\textbf
),TeX 不会插入字距;显然字距调整不会发生在组边界之外。如果我写{why,}
,我会得到字距,但我也会得到一个粗体逗号。
我想知道的是:
- 有没有办法让 TeX 识别出一对字母应该进行字距调整,即使中间有一个组边界?
- 从风格上来说,应该那个逗号要加粗吗?
答案1
如果你想添加基于“外部”字体的字距,你可以定义
\expandafter\def\expandafter\nocorrlist\expandafter{\nocorrlist\?}
\newcommand{\?}[2]{%
\sbox0{\hbox{#1}\hbox{#2}}%
\sbox2{#1#2}%
\kern\dimexpr\wd2-\wd0\relax#2}
和
\textbf{why}\?y,
将添加字距调整和逗号(同时忽略斜体校正)。的通常含义\nocorrlist
是,.
;第一行我们添加\?
到列表中,而不需要知道当前的含义。
一种不同的方法(提示在 Wyzard 的评论中)是定义一个新命令:
\makeatletter
\newcommand{\highlight}[1]{%
\def\hl@text{#1}\futurelet\hl@next\hl@dokern}
\def\hl@dokern{%
\sbox0{\textbf{\hl@text\/\hl@next}}%
\sbox2{\textbf{\hl@text\hl@next}}%
\textbf{\hl@text}%
\kern\dimexpr\wd2-\wd0\relax
}
\makeatother
仅当后面的字符\highlight{word}
是空格时才可能应用字距调整。
答案2
- TeX 不会在两种不同的字体之间调整字距。粗体和普通字体变体来自不同的字体 (cmr10、cmb10)。
- LuaTeX 跨
{
和调整字距}
,因此{why},
会获得其字距调整,但不会(参见第 1 点){\bf why},
。PDFTeX(及更早版本)的行为与 Knuth 的 TeX 类似,不会跨组调整字距。
答案3
由于现在我已经想出了一个潜在的解决方案,我将重新引用 Bringhurst 的评论:
摘自 Bringhurst 的《印刷风格元素》第 60 页:
“当使用粗体来强调单词时,通常最好将标点符号留在背景中,也就是说,留在基本文本字体中。值得强调的是单词,而不是标点符号......”
因此,如果你按照这个方法操作,你的问题仍然存在。下面是一个解决方案,使用xspace
包。正如 egreg 在评论中指出的那样,每个字符都需要不同的字距,因此下面的解决方案是一种折衷。从下面的比较中可以看出,这样做并没有多大好处,但是如果你把字距调大(让“y”或“w”的大小写看起来好看),逗号就会显得离大多数其他字符太近了。
作为该问题的实际解决方案,我可能会在文档中出现这种情况的少数情况下插入手动字距调整。(更不用说绝大多数人不会注意到它。)
\documentclass[12pt]{article}
\usepackage{xspace}
\makeatletter
\DeclareRobustCommand\xspace{\def\mykern{\kern0pt}\@xspace@firsttrue
\futurelet\@let@token\@xspace}
\def\@xspace@check@token #1{%
\ifx#1,%
\def\mykern{\kern-.04em}% this is a compromise value
\else
\def\mykern{\relax}%
\fi%
\ifx\@xspace@q@nil#1%
\expandafter\@xspace@break@loop
\fi
\expandafter\ifx\csname @let@token\endcsname#1%
\let\@xspace@maybespace\expandafter\mykern
\expandafter\@xspace@break@loop
\fi
\@xspace@check@token
}
% Not part of the solution, just a quick way to generate output
\newcommand{\textbfk}[1]{\def\tmparg{#1}\textbf{\tmparg}\xspace, with kern\par\textbf{\tmparg}, without kern\par}
\makeatother
\parindent=0pt
\begin{document}
\textbfk{wha}
\textbfk{wha}
\textbfk{whb}
\textbfk{whc}
\textbfk{whd}
\textbfk{whe}
\textbfk{whf}
\textbfk{whg}
\textbfk{whh}
\textbfk{whi}
\textbfk{whj}
\textbfk{whk}
\textbfk{whl}
\textbfk{whm}
\textbfk{whn}
\textbfk{who}
\textbfk{whp}
\textbfk{whq}
\textbfk{whr}
\textbfk{whs}
\textbfk{wht}
\textbfk{whu}
\textbfk{whv}
\textbfk{whw}
\textbfk{whx}
\textbfk{why}
\textbfk{whz}
\end{document}
答案4
回答你的第二个问题,以下是芝加哥格式手册 (CMS)关于具有特定形状的文本后面的标点符号的形状(斜体或粗体):
6.2 标点和斜体
所有标点符号都应采用与正文或周围文本相同的字体(罗马字体或斜体),但属于不同字体(通常为斜体)的标题的标点除外。例如,单词和,在本句中为斜体,后面跟着一个罗马字体的逗号;严格地说,逗号不属于和,因为它是一个用作单词 [...] 的单词,所以它被斜体化。当然,可能很难分辨逗号是否是斜体(更不用说句号了);对于其他标记,斜体会更加明显。[...] 在以下前四个例子中,斜体文本旁边的标点符号属于周围的句子,因此以罗马字体显示。在最后两个例子中,斜体标题的两个标点符号——“Help”后面的感叹号和“Eats”后面的逗号——是斜体(“Leaves”后面的逗号是罗马字体)。
- 为了消遣,他转向数学原理!
- 他们如何确定温度确实上升?
- 这些信A,b, 和C经常被认为是根本的。
- 我还没有考虑过马尔萨斯的核心论点散文:人类的不完美。
但
- 披头士'帮助!早在音乐视频鼎盛时期之前就发行了。
- 我爱进食、射击和离开,[...]
6.3 标点符号和粗体或颜色
选择粗体(或延伸而言,用不同颜色打字),不同于斜体(见 6.2),更多是出于审美考虑,而非纯粹的逻辑决定。粗体或颜色后面的标点符号应根据粗体使用方式逐一处理。在第一个例子中,“行距”后面的句号属于粗体词汇表术语,因此设置为粗体;“行距”后面的句号是周围句子的一部分,因此设置为粗体。不是 设置为粗体。在中间两个例子中,粗体术语旁边的标点符号与它们同在,例如第一个例子中的第一个句号。在最后一个例子中,问号属于周围的句子,而不是粗体单词。
- 行间距。看领导。
- 图 6.伪经的扉页第二诗学。
- 出售:三个十年前的 CPU 和五个翻新的显示器。
- 安装是否会一直停滞,直到我选择我接受?
6.4 标点和字体——美学考虑
根据更传统的系统,句号、逗号、冒号和分号应以与紧接在它们之前的单词、字母、字符或符号相同的字体出现,如果它们与主文本或周围文本的字体不同的话。在第三和第四个例子中 6.2,a 和 b 后面的逗号以及马尔萨斯标题后面的冒号将用斜体表示,书名后面的逗号也将用斜体表示(进食、射击和离开),如上例所示。然而,问号或感叹号只有当其属于紧接在前的单词时,才会以相同的字体出现,如标题所示帮助!在6.2. 该系统曾是芝加哥的首选,现在仍被一些人认为更美观,如果必须使用,应该只用于印刷出版物。在电子出版物中,字体可能由内容和外观决定(例如,书名可能被标记为这样,与周围的标点符号分开),在6.2应优先考虑。
看起来两者都有效,至少根据 CMS 来说是这样。在这两种情况下(粗体和斜体),我都会选择 CMS 的首选选项。也就是说,将标点符号格式与文本排版分开。
同意这一点,维基百科格式手册(MoS)还建议将文本的形状和后续的标点符号分开。