更改字母颜色而不丢失字母间距

更改字母颜色而不丢失字母间距

我正在使用 XeLaTeX 设计一张海报,想要一个具有自定义字母间距且每个字母颜色不同的单词。下面的示例显示了问题:第一个单词的间距如我所愿,但没有颜色,第二个单词的颜色如我所愿,但现在忽略了字母间距。我该如何实现这两个目标?

\documentclass{article}
\usepackage{fontspec}
\usepackage{xcolor}

\pagestyle{empty}
\setlength\parindent{0pt}

\setmainfont[
    Scale=10,
    LetterSpace=-15
]{Comfortaa Light}

\begin{document}
{\centering
    WOW \par
    {\color{red}W}{\color{blue}O}{\color{green}W} \par
}
\end{document}

两个单词“WOW”有颜色/间距问题

答案1

您可以定义命令来应用颜色并在它们之间添加负字距。将字母间距的“魔法数字”放入宏中可以更轻松地进行调整。

(我没有您的字体,因此我使用了 TeXLive 发行版中的字体。)

\documentclass{article}
\usepackage{fontspec}
\usepackage{xcolor}
\pagestyle{empty}
\setlength{\parindent}{0pt}

\setmainfont[Scale=10,LetterSpace=-15pt]{TeX Gyre Heros}

\newlength{\letterspace}
\setlength{\letterspace}{-15pt}
\newcommand{\colorchar}[2]{\expandafter\color{#1}\relax#2}
\newcommand{\smush}{\kern \letterspace}

\begin{document}
\centering
WOW

\colorchar{red}{W}\smush\colorchar{blue}{O}\smush\colorchar{green}{W}

\end{document}

在此处输入图片描述

答案2

这里,我介绍了\spaceout{}参数可以包含文本、\color宏和您构建的任何其他宏拦截的位置(出于演示目的,我\label也进行了拦截)。 定义的参数\def\theLetterSpace{-15pt}决定了应用于字母间距的附加字距。

我的输出中的最后一行是\spaceout应用颜色的产物。

一个怪癖是,如果截取的宏(如\color\label)出现在 的参数的空间边界上\spaceout,则将截取的宏放置在空格,而不是前面的,如\spaceout{test \color{green}of}

\documentclass{article}
\usepackage{fontspec}
\usepackage{xcolor}
\pagestyle{empty}
\setlength\parindent{0pt}
\setmainfont[Scale=10,LetterSpace=-15]{Calibri}
\def\theLetterSpace{-15pt}
\def\spaceout#1{\spaceouthelpA#1{} \relax\relax}
\def\spaceouthelpA#1 #2\relax{%
  \spaceouthelpB#1\relax\relax%
  \ifx\relax#2\relax\else\ \kern\theLetterSpace\spaceouthelpA#2\relax\fi
}
\def\spaceouthelpB#1#2\relax{%
  \ifx\relax#2\relax#1\else
  \ifx#1\color\interceptColor#2\relax\relax\else
  \ifx#1\label\interceptLabel#2\relax\relax\else
      #1\kern\theLetterSpace\spaceouthelpB#2\relax%
  \fi\fi\fi%
}
\def\interceptColor#1#2\relax{%
  \color{#1}%
  \ifx\relax#2\else%
    \spaceouthelpB#2\relax%
  \fi%
}
\def\interceptLabel#1#2\relax{%
  \label{#1}%
  \ifx\relax#2\else%
    \spaceouthelpB#2\relax%
  \fi%
}
\begin{document}
\centering
    WOW \par
    {\color{red}W\color{blue}O\color{green}W} \par
    \spaceout{WOW} \par
    \spaceout{\color{red}W\color{blue}O\color{green}W}\par
\end{document}

在此处输入图片描述

\label该算法确实进行自动换行,我在这里演示了这一点,以及在参数中使用\spaceout

\documentclass{article}
\usepackage{xcolor}
\setlength\parindent{0pt}
\def\theLetterSpace{2pt}
\def\spaceout#1{\spaceouthelpA#1{} \relax\relax}
\def\spaceouthelpA#1 #2\relax{%
  \spaceouthelpB#1\relax\relax%
  \ifx\relax#2\relax\else\ \kern\theLetterSpace\spaceouthelpA#2\relax\fi
}
\def\spaceouthelpB#1#2\relax{%
  \ifx\relax#2\relax#1\else
  \ifx#1\color\interceptColor#2\relax\relax\else
  \ifx#1\label\interceptLabel#2\relax\relax\else
      #1\kern\theLetterSpace\spaceouthelpB#2\relax%
  \fi\fi\fi%
}
\def\interceptColor#1#2\relax{%
  \color{#1}%
  \ifx\relax#2\else%
    \spaceouthelpB#2\relax%
  \fi%
}
\def\interceptLabel#1#2\relax{%
  \label{#1}%
  \ifx\relax#2\else%
    \spaceouthelpB#2\relax%
  \fi%
}
\begin{document}
\section{\spaceout{Spaced Out Heading \color{blue!40}in Blue\label{s:X}}}

I will now perform a {\spaceout{spaceout test \color{red}of red that
will show that the macro works with word wrapping}} in section \ref{s:X}.
\end{document}

在此处输入图片描述

相关内容