我正在使用 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}
答案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}