- 上下文
- 问题
- 问题
上下文
我知道可以使用 在彩色框中显示文本\colorbox
。由于字符大小不同,因此框的高度也不同。
\documentclass{standalone}
\usepackage{fontspec}
\usepackage{color}
\pagecolor{blue}
\begin{document}
\colorbox{red}{This}\colorbox{green}{is}\colorbox{red}{a}\colorbox{green}{sentence}\colorbox{red}{.}
\end{document}
我还知道可以使用 使所有盒子具有相同的高度\strut
。
\documentclass{standalone}
\usepackage{fontspec}
\usepackage{color}
\begin{document}
\colorbox{red}{\strut This}\colorbox{green}{\strut is}\colorbox{red}{\strut a}\colorbox{green}{\strut sentence}\colorbox{red}{\strut .}
\end{document}
我现在已经为中文字符安装了等宽字体。如果我使用\colorbox
,所有字符都会显示在其相应彩色框的垂直中心。
\documentclass{standalone}
\usepackage{fontspec}
\usepackage{color}
\pagecolor{blue}
\begin{document}
\fontspec[Path = \string~/.fonts/]{NotoSansMonoCJKsc-Regular}
\colorbox{red}{你}\colorbox{green}{好}\colorbox{red}{国}\colorbox{green}{工}
\end{document}
问题
我希望所有框都具有相同的高度。因此,我使用\strut
。
\documentclass{standalone}
\usepackage{fontspec}
\usepackage{color}
\begin{document}
\fontspec[Path = \string~/.fonts/]{NotoSansMonoCJKsc-Regular}
\colorbox{red}{\strut 你}\colorbox{green}{\strut 好}\colorbox{red}{\strut 国}\colorbox{green}{\strut 工}
\end{document}
问题是,现在所有字符都没有显示在相应颜色框的垂直中心。以下两个屏幕截图是通过 Inkscape 获得的最后两个字符的测量值。在第一个屏幕截图中,字符与顶部边框之间的间距为1.21 毫米,而字符与底边框之间的间距为2.04 毫米在第二张截图中,角色与顶部边框之间的间距为1.45 毫米底部边框是2.31 毫米。
问题
给定一个包含汉字的句子,并使用 着色\colorbox
,如何使得所有彩色框具有相同的高度,并使字符在相应的彩色框中垂直对齐。
答案1
颜色框总是\fboxsep
在四边使用相等的空间()。
拉丁字符的高度和深度不同
支柱添加了比所有拉丁字符更高更深的不可见内容,因此所有框都强制相等
如果你使用宽度不为 0pt 的支柱,那么就更容易看到了,这样你就能看到它
如果你只是想要更大的间距,你不需要中文的支柱,只需增加
\fboxsep
如果你想保持水平空间但增加垂直空间,请使用更适合中文的(可见)支柱,比字符高 5pt,深度为 5pt
和隐形支柱一样
\documentclass{article}
\usepackage{fontspec}
\usepackage{color}
\newcommand\xstrut{\rule[-.3\baselineskip]{2pt}{\baselineskip}}
\newcommand\xcstrut{\sbox0{你}\rule[-5pt]{2pt}{\dimexpr\ht0+10pt}}
\newcommand\cstrut{\sbox0{你}\rule[-5pt]{0pt}{\dimexpr\ht0+10pt}}
\begin{document}
1
\colorbox{red}{A}\colorbox{green}{x}\colorbox{red}{y}
{\fontspec{NotoSansMonoCJKsc-Regular}
\colorbox{red}{你}\colorbox{green}{好}\colorbox{red}{国}\colorbox{green}{工}}
2
\colorbox{red}{\strut A}\colorbox{green}{\strut x}\colorbox{red}{\strut y}
{\fontspec{NotoSansMonoCJKsc-Regular}
\colorbox{red}{\strut 你}\colorbox{green}{\strut 好}\colorbox{red}{\strut 国}\colorbox{green}{\strut 工}}
3
\colorbox{red}{\xstrut A}\colorbox{green}{\xstrut x}\colorbox{red}{\xstrut y}
{\fontspec{NotoSansMonoCJKsc-Regular}
\colorbox{red}{\xstrut 你}\colorbox{green}{\xstrut 好}\colorbox{red}{\xstrut 国}\colorbox{green}{\xstrut 工}}
{
4
\setlength\fboxsep{5pt}
\colorbox{red}{\strut A}\colorbox{green}{\strut x}\colorbox{red}{\strut y}
{\fontspec{NotoSansMonoCJKsc-Regular}
\colorbox{red}{你}\colorbox{green}{好}\colorbox{red}{国}\colorbox{green}{工}}
}
{
5
\colorbox{red}{\xstrut A}\colorbox{green}{\xstrut x}\colorbox{red}{\xstrut y}
{\fontspec{NotoSansMonoCJKsc-Regular}
\colorbox{red}{\xcstrut 你}\colorbox{green}{\xcstrut 好}\colorbox{red}{\xcstrut 国}\colorbox{green}{\xcstrut 工}}
}
{
6
\colorbox{red}{\strut A}\colorbox{green}{\strut x}\colorbox{red}{\strut y}
{\fontspec{NotoSansMonoCJKsc-Regular}
\colorbox{red}{\cstrut 你}\colorbox{green}{\cstrut 好}\colorbox{red}{\cstrut 国}\colorbox{green}{\cstrut 工}}
}
\end{document}
如果使用全大写字母,拉丁文中也会有类似的问题。如上所示,strut 最适合;它是和 的x
折衷方案。因此,如果在大多数字体中除了 Q 之外没有降部,那么使用高度更大、深度更小的修改过的 strut 看起来通常最好,就像中文一样。A
y
在上述 1. 和 4. 中,中文没有使用支撑,我本以为所有框的高度都相同,但显然并非如此,而且更小。因此对于此字体,4.(仅使用 fboxsep)实际上不起作用,您需要 6.(当然工
您也可以增加)\fboxsep
答案2
字符的高度和深度并不相同。
我建议用一个具有最大高度和深度的作为样本。
\documentclass{article}
\usepackage{fontspec}
\usepackage{xcolor}
\newfontface{\zhtt}{NotoSansMonoCJKsc-Regular.otf}
\NewDocumentCommand{\zhttbox}{mm}{% #1 = color, #2 = character
\begingroup
\setlength{\fboxsep}{1pt}%
\colorbox{#1}{\zhtt\vphantom{你}\smash{#2}}%
\endgroup
}
\begin{document}
\zhttbox{red!70}{你}\zhttbox{green!70}{好}\zhttbox{red!70}{国}\zhttbox{green!70}{工}
\end{document}
gray!60
由于色彩渲染的瑕疵,图片中的方框实际上并没有对齐。如果我将它们全部使用,则图像如下:
还添加基线