如何让 LaTeX 的输出看起来像是使用 9 针点阵打印机的草稿模式打印的,例如经典的爱普生 FX-80? 下图上半部分取自书中计算机结构与逻辑,让我对我说的话有了一些了解:
基本上这意味着:
- 每个字符都应排版为点阵。
- 这些点应该明显分开,但由于墨水渗出,可能有些重叠。
- 点的边界应该有点模糊而不是完全清晰。
- 即使在它们的中心,这些点也不应完全是黑色的。
- 点的位置和深度应该有一些轻微的、不规则的变化。(与打字机不同,这种变化不应该是每种字母类型独有的。)
我并不特别关心图形、数学模式或非 ASCII 字符,但如果支持以下文本模式样式就更好了:
- 假斜体(即倾斜的文字)
- 伪上标和下标(即挤压、垂直偏移的字符)
- 强调
- 假粗体(即稍微偏移的双击文本)
我知道有这样的字体FX 矩阵,模拟点阵输出。但是,这些不会产生您在真实点阵打印机输出中观察到的颜色、点大小、点位置等的变化。
(这个问题是受之前一个问题的启发模拟旧打字文本。
答案1
因为 OP 指出了对点状打击的特殊纹理特征(例如褪色)的可取性,所以唯一的选择就是从头开始构建它。
下面我将展示如何实现这一点。
首先,您需要设计您的点通过\dmdot
。我使用了接受的答案在 TikZ 中自定义淡入淡出设计一个点状图案,其不透明度向外边缘逐渐减弱。显然,设计可以根据需要进行更改。
然后,一旦你对点满意了,你就必须将每个字母的布局设计成一个点矩阵。我仅以两个字母为例定义:“R”和“y”,它们在\dotR
和中定义\doty
。由于空格对于这些定义是活动的,因此任何给定点行中的前导空格必须{}
以能够正确消化数据为前提。
任何给定字母的矩阵都使用宏设置\dotletter{<letter>}
。但是,为了简化输入要求,我设置了一个标记循环环境\dotmatrix...\enddotmatrix
,该环境获取环境中的每个字母并应用于\dotletter
它。因此,此示例的用户输入是\dotmatrix RyR\enddotmatrix
。
例如,控制点尺寸、垂直点间距、水平点间距、垂直下基线和字母边距的参数定义为
\newcommand\dmdotsize{.025}
\newcommand\dmdotgap{1pt}
\newcommand\dmdotkern{.7pt}
\newcommand\dmdotbase{-2pt}
\newcommand\dmsidebearing{1.5pt}
这些参数可以调整,如第二种情况的 MWE 所示。MWE 显示的是点的大版本,以便人们可以看到所应用的淡入淡出效果\dmdot
。
\documentclass{article}
\usepackage{stackengine,tikz,tokcycle}
\usetikzlibrary{fadings}
\pgfdeclareradialshading{tikzfadeSid}{\pgfpointorigin}{%
color(0pt)=(pgftransparent!0); color(12.5bp)=(pgftransparent!0);
color(25bp)=(pgftransparent!50);
color(37.5bp)=(pgftransparent!95);
color(50bp)=(pgftransparent!100)}%
\pgfdeclarefading{custom fade out}{\pgfuseshading{tikzfadeSid}}%
\newcommand\dmdot[1][\dmdotsize]{%
\begin{tikzpicture}
\fill[black,opacity=0.9,path fading=custom fade out, draw=none] (0,0)
circle[radius=#1];
\end{tikzpicture}
}
\newcommand\dmdotsize{.025}
\newcommand\dmdotgap{1pt}
\newcommand\dmdotkern{.7pt}
\newcommand\dmdotbase{-2pt}
\newcommand\dmsidebearing{1.5pt}
\setstackEOL{\\}
\setstackgap{L}{\dmdotgap}
\renewcommand\stackalignment{l}
\bgroup
\catcode`.=\active
\gdef.{\makebox[\dmdotkern]{\dmdot}}
\catcode32=\active%
\gdef {\kern\dmdotkern}%
\gdef\dotR{. . .\\. .\\. .\\. . .\\. .\\. .\\. .\\\\}%
\gdef\doty{. .\\. .\\. .\\{} . . .\\{} .\\{} . ..}%
\egroup
\newcommand\dotletter[1]{\kern\dmsidebearing
\raisebox{\dmdotbase}{\expandafter\Longstack\expandafter{%
\csname dot#1\endcsname}}}
\xtokcycleenvironment\dotmatrix
{\addcytoks{\dotletter{##1}}}
{\processtoks{##1}}
{\addcytoks{##1}}
{\addcytoks{##1}}
{\kern 2\dimexpr\dmdotsize cm}
{\addcytoks{\kern-\dmdotsize cm}}
\begin{document}
\dmdot[.5]
R\dotmatrix RyR\enddotmatrix X
\renewcommand\dmdotsize{.023}
\renewcommand\dmdotgap{.9pt}
\renewcommand\dmdotkern{.5pt}
\renewcommand\dmdotbase{-1.8pt}
\renewcommand\dmsidebearing{1.4pt}
R\dotmatrix RyR\enddotmatrix X
\end{document}