我想写出有轮廓的文字。下面是一个简单示例,是我想要实现的功能。
\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 字体。这意味着我必须使用fontspec
和xelatex
,但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}