如何在 LaTeX 中实现以下效果(有时称为“(定向)渐变外发光”)?
以下是我在 Google 上找到的这种风格的另外两个示例:
有关的:
- 这是一个关于 TeX SE 的问题关于纯色(即无渐变)外发光。
- 这是一个关于 Graphic Design SE 的问题提到了在 Photoshop 上执行此操作的几种技巧,也许其中一种适用于 TikZ(如何做到这一点超出了我的理解/能力)。上面的“2023 年 10 月 3 日版本”图像是在 Photoshop 上使用方法 2 创建的这个答案。
编辑:我之所以想使用 LaTeX 创建这个,是因为“2023 年 10 月 3 日的版本”确实是Version of \today
,并且它旨在用于以一定频率(比如每周一次)重建的书籍的标题页,并且每次在 Photoshop/InDesign 上手动更新日期会花费大量工作,我希望可以通过自动化来避免这些工作。
只要可以自动化,将这种效果外包给另一个程序的解决方案也同样好。例如,一个 Python 脚本将一串文本作为输入,并使用文本+效果渲染 SVG 或 PNG 文件(例如通过使用 Inkscape 或其他程序对其进行处理)就可以完美地工作(因为这样我们就可以编写另一个脚本来创建标题页,只需调用此辅助脚本几次,然后使用例如subprocess
调用 LaTeX 对其进行编译即可。)
答案1
\documentclass[tikz, border=1cm]{standalone}
\usetikzlibrary{fadings}
\usepackage[outline]{contour}
\begin{tikzfadingfrompicture}[name=myfading]
\foreach \i in {0.05,0.10,...,0.80}{
\contourlength{\i pt}
\node[opacity=0.1] {\fontfamily{ptm}\selectfont \contour{transparent!0}{\bf{Version of Oct 03, 2023}}};
}
\node[transparent!100] (n) {\fontfamily{ptm}\selectfont {\bf{Version of Oct 03, 2023}}};
\end{tikzfadingfrompicture}
\begin{document}
\begin{tikzpicture}
\shade[path fading=myfading, fit fading=false, top color=blue, bottom color=red] (n.south west) rectangle (n.north east);
\end{tikzpicture}
\end{document}
编辑:通过删除阴影中的空白来获得更好的颜色。
\node[transparent!100, inner sep=0.80pt] (n) {\fontfamily{ptm}\selectfont {\bf{Version of Oct 03, 2023}}};
答案2
考虑到@hpekristiansen的评论和解决方案,我提出了我之前答案的修改版本。它解决了符号数量很大时的问题。但想法是一样的。
我将所需的元素括到一个 中\newcommand
,\Cfading
用于tikzfadinngfrompicture
,并将所需的元素括到一个pic
对象 中C-fading
,用于图形结果。
代码
\documentclass[11pt, margin=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{math, calc, fadings}
\usepackage{xcolor}
\usepackage[outline]{contour}
% \contourlength{.5pt}
\begin{document}
\newcommand{\Cfading}[3]{% text, font, scaling factor
\begin{tikzfadingfrompicture}[name=Cfading]
\path node[scale=#3] (0, 0) (noneCF) {%
\fontfamily{#2}\selectfont
\contour{transparent!0}{#1}
};
\end{tikzfadingfrompicture}
\tikzmath{%
real \sc; % scaling factor
\sc = #3;
}
}
\tikzset{%
CE fading/.style={%
path fading=Cfading, shade, fit fading=false, opacity=.02%
},
CI fading/.style={%
path fading=Cfading, shade, fit fading=false, opacity=.1%
}
}
\tikzset{%
pics/C-fading/.style 2 args={% top color, bottom color
code={%
\foreach \j in {1, 2, ..., 12}{%
\begin{scope}[transform canvas={shift={(\j*30: 2.2*\sc pt)}}]
\fill[CE fading, top color=#1, bottom color=#2]
(noneCF.south west) rectangle (noneCF.north east);
\end{scope}
}
\foreach \j in {1, 2, ..., 12}{%
\begin{scope}[transform canvas={shift={(\j*33: 1.1*\sc pt)}}]
\fill[CI fading, top color=#1, bottom color=#2]
(noneCF.south west) rectangle (noneCF.north east);
\end{scope}
}
\fill[path fading=Cfading, fit fading=false, color=white]
(noneCF.south west) rectangle (noneCF.north east);
}
}
}
\Cfading{October 5, 2023}{lmdh}{3}
\begin{tikzpicture}[evaluate={}]
\path[use as bounding box]
(noneCF.north west) rectangle ($(noneCF.south east) +(2, -2)$);
\path pic {C-fading={blue}{green}};
\begin{scope}[transform canvas={shift={(1 cm, -2cm)}}]
\path pic {C-fading={magenta}{blue}};
\end{scope}
\end{tikzpicture}
\end{document}
先前版本的答案
我尝试使用tikzfadingfrompicture
,参见 Tikz 和 PGF 手册第 361 页,版本 3.1.7,再加上库contour
。
符号的数量,例如10 月 5 日在示例中,它不太灵活。至少我无法处理它。如果您需要更多符号,则必须分别定义每个单词。也许有人可以从这个角度修复代码。
代码
\documentclass[11pt, margin=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{fadings}
\usepackage{xcolor}
\usepackage[outline]{contour}
\contourlength{.5pt}
\begin{document}
\begin{tikzfadingfrompicture}[name=LRfading]
\node%[inner sep=1ex, outer sep=2pt]
{\fontfamily{lmdh}\selectfont \contour{red}{October 5}};
\end{tikzfadingfrompicture}
\begin{tikzfadingfrompicture}[name=LKfading]
\node%[inner sep=1ex, outer sep=2pt]
{\fontfamily{lmdh}\selectfont \contour{blue}{October 5}};
\end{tikzfadingfrompicture}
\begin{tikzpicture}
\foreach \j in {1, ..., 12}{%
\fill[path fading=LRfading,
shade, left color=blue, right color=green, opacity=.04]
(\j*30: .15) rectangle ++(6, 4);
\fill[path fading=LRfading,
shade, left color=blue, right color=green, opacity=.05]
(10 +\j*30: .04) rectangle ++(6, 4);
}
\fill[path fading=LKfading, color=white]
(0, 0) rectangle ++(6, 4);
\end{tikzpicture}
\end{document}
答案3
结束讨论,最终这里,这里是“少做一点”方法的草图。对于使用创造性原理的解决方案来说,通常不再需要关注 Latex(在本例中),使用其他可用资源,并将注意力转移到以前不需要的其他事情上。而且......它开辟了以前没有的新机会。这样一来,这个就比 latexian 更具程序性了。
在其简单的形式中,它会不断覆盖本周的绘画(新标题)和书籍,并将备份或版本控制委托给专用工具,例如git。
对于这个例子,为了说明这个概念,我假设一种混合:
- 仅使用图形工具(Inkscape、Illustrator、ArtWhatever)制作一个文件,每周存储为
title.png
,永不改变 - 每周一个文件夹,用于存放周书
那我们走吧。
组织文件和文件夹
这是你必须决定的事情。此结构假设:
/graphic
将举办title.png
- 每周都会被覆盖,即作为单个文件丢失
- (使用git等来弥补这个损失)
/book-n
因为 OP 非常喜欢这个例子,所以我假设:
- 每周创建一个新的
- 复制
/book-(n-1)
,重命名为/book-n
- 开始编辑其
/book-n/book.tex
所以它里面看起来是这样的:
访问每周标题
从文件夹内部,/book-n
总是可以清楚地找到最新的标题图像:
../graphic (/title.png)
- 无论你在计算机上分配所有内容有多复杂(那么路径也会更复杂一些)
标题页的图形
我并不是自称是艺术家。我使用绘画程序创作了 2 幅画作,并将它们导出到title.png
每周...
第一本书,第一周
只需编辑并编译:
\documentclass{book}
\usepackage{graphicx}
\usepackage{lipsum}
\begin{document}
% ~~~ this part you design only once ~~~~~~~~~~~~
\begin{titlepage}
\includegraphics[width=\textwidth]{../graphic/title}% fixed location
\vspace{2cm}
\begin{center}
\Huge{
by
\vspace{\stretch{2}}
Super-Author
\vspace{\stretch{1}}
}
\end{center}
\end{titlepage}
% ~~~ here is your next version ~~~~~~~~~~~~~~~~~
\chapter{And so it begins}
\lipsum[1-2]
\end{document}
第二本书,下周
只需编辑并编译:
\documentclass{book}
\usepackage{graphicx}
\usepackage{lipsum}
\begin{document}
% ~~~ this part you design only once ~~~~~~~~~~~~
\begin{titlepage}
\includegraphics[width=\textwidth]{../graphic/title}% fixed location
\vspace{2cm}
\begin{center}
\Huge{
by
\vspace{\stretch{2}}
Super-Author
\vspace{\stretch{1}}
}
\end{center}
\end{titlepage}
% ~~~ here is your next version ~~~~~~~~~~~~~~~~~
\chapter{What happened next}
\lipsum[3,7]
\end{document}
自动化方面
事实上,几乎没有或者根本没有什么可以自动化:问题已经消失了,取决于你如何组织它。
在这个例子中,每周创建一个新的书本文件夹,这仍然有点繁琐,因为至少你需要复制并重命名书本文件夹。(是否值得通过(shell)脚本自动执行此操作?可能不值得……但你可以做到。)
无论如何,标题绘图都会被重新创建并覆盖,因此不需要额外的工作。
因此,为了省去复制工作...只需使用一个书籍文件夹和一个像 git 这样的备份/版本控制工具。例如:
- 按照固定结构工作
- 保存、检索、分支等中间版本以满足您的需求
附言:完整地说,这是所谓创造性解决方案的通用特征。它们提供:
- 自动化(在这种情况下)和非自动化(其对立面)
在这里翻译为:
- 无自动化:它已经消失,因为概念或方法发生了变化
- 自动化:影响提供了先前需要的自动化。
你还需要脚本吗?
不,您可以用什么都不做、git-console(首选)或git-GUI 来替换它...就像网上这个例子一样:
这条道路上有什么新的机遇吗?
如果你以前没有使用过,使用 git 你可以:
- 保存,保存,保存
- 名称(中间)版本
- 找回,回到过去
- 分支,即尝试使用不同的路由来处理您的内容
- 如果效果不好,请返回上一个分支/版本
- ETC。
如果您使用“一个图形一个书夹”的方法并每天覆盖它,那么您就在计算机上获得了一个干净的不断发展的工作空间。
等等。