使用 TrueType 字体勾勒文本轮廓

使用 TrueType 字体勾勒文本轮廓

我想写出有轮廓的文字。下面是一个简单示例,是我想要实现的功能。

轮廓文本

\documentclass[a4paper]{minimal}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\usepackage{xcolor}
\usepackage{pdfrender}
\usepackage{anyfontsize}

\usepackage[active, tightpage]{preview}
\setlength{\PreviewBorder}{10pt}

\newcommand{\outline}[1]{%
    \textpdfrender{%
        TextRenderingMode=Stroke,%
        FillColor=gray,%
        LineWidth=0.1pt,%
    }{#1}%
}

\begin{document}
\begin{preview}
\fontsize{500}{500}\selectfont%
\outline{a}
\end{preview}
\end{document}

唯一的问题是,我需要使用 TrueType 字体。这意味着我必须使用fontspecxelatex,但pdfrender我在本例中使用的包不支持xelatex

有人能帮助我吗,如何使用 TrueType 字体制作轮廓文本?(类似于示例中的内容。)

答案1

这是一个 pdflatex(以及 XeLaTeX)方法。我创建了一个\shadowfy可以跨越段落的宏,但不能处理其参数中的宏。这种方法可能效率不高,但很简单。它解析参数,最终逐个字母,然后堆叠一堆(N、S、E、W、NE、SE、SW、NW)+/- 字距和升高/降低的\secondarycolor字母副本,最后将一个未调整字距、未升高的字母副本放在其上方。在定义中\primarycolor使用,它将保留原始字母的字母宽度。如果注释掉该行,字母间距将增加以考虑水平偏移。\def\useanchorwidth{T}\shadow

用户可以设置这些参数:

\setlength\shadowHoffset{.16pt}
\setlength\shadowVoffset{.08pt}
\def\primarycolor{white}
\def\secondarycolor{black}

这是 MWE。由于我可以通过添加代码来修复的“怪癖”,如果需要统一的水平/垂直阴影效果,则应将的值\shadowHoffset设置为值的两倍\shadowVoffset。如您所见,可以控制阴影线的粗细以及颜色。

\documentclass{article}
\usepackage{stackengine,xcolor}

\newcommand\shadowfy[1]{\expandafter\shadowfypars#1\par\relax\relax}
\long\def\shadowfypars#1\par#2\relax{%
  \ifx#1\relax\else
    \shadowfywords#1 \relax\relax%
  \fi%
  \ifx\relax#2\else\par\shadowfypars#2\relax\fi%
}
\def\shadowfywords#1 #2\relax{%
  \ifx#1\relax\else
    \shadowfyletters#1\relax\relax%
  \fi%
  \ifx\relax#2\else\ \shadowfywords#2\relax\fi%
}
\def\shadowfyletters#1#2\relax{%
  \shadow{#1}%
  \ifx\relax#2\else\shadowfyletters#2\relax\fi}

\newlength\shadowHoffset
\newlength\shadowVoffset
\setlength\shadowHoffset{.2pt}
\setlength\shadowVoffset{.1pt}
\def\primarycolor{white}
\def\secondarycolor{black}

\def\shadow#1{\setstackgap{L}{0pt}\def\stacktype{L}%
\def\useanchorwidth{T}% CAN BE COMMENTEDD FOR MORE INTERLETTER SPACE.
\Longstack{%
\raisebox{0pt}{\textcolor{\primarycolor}{#1}} 
\kern.7\shadowHoffset\raisebox{.7\shadowVoffset}{\textcolor{\secondarycolor}{#1}}
\kern-.7\shadowHoffset\raisebox{.7\shadowVoffset}{\textcolor{\secondarycolor}{#1}}
\kern\shadowHoffset\raisebox{0pt}{\textcolor{\secondarycolor}{#1}}
\kern-\shadowHoffset\raisebox{0pt}{\textcolor{\secondarycolor}{#1}}
\kern.7\shadowHoffset\raisebox{-.7\shadowVoffset}{\textcolor{\secondarycolor}{#1}}
\kern-.7\shadowHoffset\raisebox{-.7\shadowVoffset}{\textcolor{\secondarycolor}{#1}}
\kern0pt\raisebox{\shadowVoffset}{\textcolor{\secondarycolor}{#1}}
\kern0pt\raisebox{-\shadowVoffset}{\textcolor{\secondarycolor}{#1}}%
}}
\begin{document}
\newcommand\mytext{%
This is some sample shadow text.

Multiple paragraphs.
}%
\shadowfy{\mytext}

\setlength\shadowHoffset{.4pt}
\setlength\shadowVoffset{.2pt}
\def\primarycolor{yellow!70}
\def\secondarycolor{blue!80!black}
\shadowfy{\mytext}


\end{document}

在此处输入图片描述

在此处输入图片描述

答案2

我知道 OP 想要 Xelatex 解决方案,而我在这里给出了一个 pdf 解决方案,所以我不指望任何投票,但无论如何都想展示它,因为它比我的其他答案更清晰。

对于这个不同的答案,我从我们最优秀的 LaTeX 同事 Malipivo 那里窃取了一些代码,\pdfliteral从他的答案中提取了一些代码TikZ:文本周围有光晕?最终出现在我的宏中\outline。然后我基本上用这个\outline宏替换了\shadow我之前答案中的宏。周围的\shadowfy构造允许换行(尽管没有连字符)。

编辑以纳入赫伯特对这个问题的回答(\usecolor宏),将颜色名称转换为 pdfliteral 代码,这样就可以以 LaTeX 方式指定颜色,而不是 RGB 三元组。这也比 CMYK 颜色现在不再是问题的优势。

边框和填充颜色分别用\bordercolor{}和定义\fillcolor{}。边框粗细用 定义\def\thickness{<decimal>},但我不知道小数的单位。

\documentclass{article}
\usepackage{xcolor}
\input pdf-trans
\newbox\qbox
\def\usecolor#1{\csname\string\color@#1\endcsname\space}
\newcommand\bordercolor[1]{\colsplit{1}{#1}}
\newcommand\fillcolor[1]{\colsplit{0}{#1}}
\newcommand\outline[1]{\leavevmode%
  \def\maltext{#1}%
  \setbox\qbox=\hbox{\maltext}%
  \boxgs{Q q 2 Tr \thickness\space w \fillcol\space \bordercol\space}{}%
  \copy\qbox%
}
\newcommand\shadowfy[1]{\expandafter\shadowfypars#1\par\relax\relax}
\long\def\shadowfypars#1\par#2\relax{%
  \ifx#1\relax\else
    \shadowfywords#1 \relax\relax%
  \fi%
  \ifx\relax#2\else\par\shadowfypars#2\relax\fi%
}
\def\shadowfywords#1 #2\relax{%
  \outline{#1}%
  \ifx\relax#2\else\ \shadowfywords#2\relax\fi%
}
\newcommand\colsplit[2]{\colorlet{tmpcolor}{#2}\edef\tmp{\usecolor{tmpcolor}}%
  \def\tmpB{}\expandafter\colsplithelp\tmp\relax%
  \ifnum0=#1\relax\edef\fillcol{\tmpB}\else\edef\bordercol{\tmpC}\fi}
\def\colsplithelp#1#2 #3\relax{%
  \edef\tmpB{\tmpB#1#2 }%
  \ifnum `#1>`9\relax\def\tmpC{#3}\else\colsplithelp#3\relax\fi
}
\begin{document}
\bordercolor{black}
\fillcolor{white}
\def\thickness{.1}
\newcommand\mytext{This is some sample shadow text.\par Multiple paragraphs.}%
\shadowfy{\mytext}

\def\thickness{0.15}
\bordercolor{blue!70!black}
\fillcolor{yellow}
\shadowfy{\mytext}

\bordercolor{black}
\fillcolor{white}
\def\thickness{.02}{\Huge\shadowfy{a}}
\end{document}

在此处输入图片描述 在此处输入图片描述

这是\Huge字母“a”,其设置

\bordercolor{black}
\fillcolor{white}
\def\thickness{.02}

在此处输入图片描述

相关内容