\color{} 周围有小间隙

\color{} 周围有小间隙

我想更改单词中几个字母的颜色。我使用以下命令:

... \color{g}a\color{d}way ..., or ... a\color{g}way \color{d} ...

这里,d 是默认颜色,g 被定义为新颜色,单词“away”中的字母被更改,如上所示。此解决方案通常有效;但是,在上述情况下,在字母 w 之前插入了一个小间隙。我注意到这个间隙只出现在字母 w 上。在我看来,这是程序中的一个错误。我使用 beamer 类并使用 pdflatex 进行编译。如果有人能告诉我如何解决这个问题,我将不胜感激。我尝试使用 latex 进行编译,然后使用 dvi 转换为 pdf,但这会产生相同的错误。

答案1

只是为了好玩,一个可以自动恢复字距的宏。

\documentclass{article}
\usepackage{xparse}
\usepackage{xcolor}

\colorlet{cw}{red!80!green}

\ExplSyntaxOn
\NewDocumentCommand{\cw}{m}
 {
  \leavevmode
  \foo_cw:n { #1 }
 }

\cs_new_protected:Nn \foo_cw:n
 {
  \tl_set:Nn \l__foo_cw_tl { #1 }
  \regex_replace_all:nnN
   { (.?)\<(.{1})\>(.?) }
   { \c{__foo_cw_single:nnn}\cB\{\1\cE\}\cB\{\2\cE\}\cB\{\3\cE\} }
   \l__foo_cw_tl
  \regex_replace_all:nnN
   { (.?)\<(.?) }
   { \c{__foo_cw_start:nn}\cB\{\1\cE\}\cB\{\2\cE\} }
   \l__foo_cw_tl
  \regex_replace_all:nnN
   { (.?)\>(.?) }
   { \c{__foo_cw_end:nn}\cB\{\1\cE\}\cB\{\2\cE\} }
   \l__foo_cw_tl
  \tl_use:N \l__foo_cw_tl
 }

\box_new:N \l__foo_cw_unkerned_box
\box_new:N \l__foo_cw_kerned_box

\cs_new_protected:Nn \__foo_cw_kern:nn
 {
  \hbox_set:Nn \l__foo_cw_unkerned_box { \hbox:n { #1 } \hbox:n { #2 } }
  \hbox_set:Nn \l__foo_cw_kerned_box { #1#2 }
  \kern \dim_eval:n { \box_wd:N \l__foo_cw_kerned_box - \box_wd:N \l__foo_cw_unkerned_box } \scan_stop:
 }

\cs_new_protected:Nn \__foo_cw_single:nnn
 {
  #1
  \__foo_cw_kern:nn { #1 } { #2 }
  \textcolor{cw}{#2}
  \__foo_cw_kern:nn { #2 } { #3 }
  #3
 }
\cs_new_protected:Nn \__foo_cw_start:nn
 {
  #1
  \__foo_cw_kern:nn { #1 } { #2 }
  \group_begin:
  \color{cw}
  #2
 }
\cs_new_protected:Nn \__foo_cw_end:nn
 {
  #1
  \group_end:
  \__foo_cw_kern:nn { #1 } { #2 }
  #2
 }
\ExplSyntaxOff

\begin{document}

away        away        away

\cw{<a>way} \cw{a<w>ay} \cw{awa<y>}

\cw{<aw>ay} \cw{a<wa>y} \cw{aw<ay>}

\end{document}

x<a>y像(其中xz可以缺失)这样的序列被转换为\__foo_cw_single:nnn{x}{a}{z},然后变成

x<kern between x and a>\textcolor{cw}{a}<kern between a and y>y

类似 (和x<a...b>y之间有多个字母)的序列变成<>

x\__foo_cw_start:nn{x}{a}...\__foo_cw_end:nn{b}{y}

随后转化为

x<kern between x and a>\begingroup\color{cw}a...b\endgroup<kern between b and y>y

u两个字母和之间的字距是通过从的宽度中v减去的宽度计算得出的。\hbox{\hbox{u}\hbox{v}}\hbox{uv}

在此处输入图片描述

答案2

在此处输入图片描述

如果您添加,\showoutput您可以看到字体添加的所有字距。这里有些不寻常的是,每个字母之间away都有字距\kern-0.27779pt,因此您可以按如下方式进行更正:

\documentclass{article}

\usepackage{color}

\showoutput

\begin{document}

away away away away

\textcolor{red}{a}way a\textcolor{red}{w}ay aw\textcolor{red}{a}y awa\textcolor{red}{y}

\textcolor{red}{a}\kern-0.27779pt way
a\kern-0.27779pt \textcolor{red}{w}\kern-0.27779pt ay
aw\kern-0.27779pt\textcolor{red}{a}\kern-0.27779pt y
awa\kern-0.27779pt\textcolor{red}{y}


\end{document}

相关内容