![将现有文本转换为盲文或乱码保留格式(线框图)](https://linux22.com/image/318712/%E5%B0%86%E7%8E%B0%E6%9C%89%E6%96%87%E6%9C%AC%E8%BD%AC%E6%8D%A2%E4%B8%BA%E7%9B%B2%E6%96%87%E6%88%96%E4%B9%B1%E7%A0%81%E4%BF%9D%E7%95%99%E6%A0%BC%E5%BC%8F%EF%BC%88%E7%BA%BF%E6%A1%86%E5%9B%BE%EF%BC%89.png)
假设我有一份花了一段时间设计和编写的文档。现在我想向某人展示总体格式和文档的长度,但我不想让此人阅读或甚至被实际内容分散注意力。我该如何更改文本以删除内容但保持大致相同的格式?
一个选项是浏览整个文档,并用经过仔细测量的lipsum
文本替换单个文本块。但这需要大量工作。
另一种选择是简单地用一些(随机的?)规则逐个字母替换内容(当然不是命令)以获得相同的逐字结构。(假设解密的可能性不是一个紧迫的问题)。
我可以在整个文档中实现这种转换吗?例如,文档开头的一个包或几个命令。
最小示例:
\documentclass{article}
\begin{document}
This has a lot of content
\end{document}
如何制作文件仿佛消息来源是:
\documentclass{article}
\begin{document}
Blah bla a bli ba blihbla
\end{document}
答案1
感谢@ChristianHupfer(使用其他字体,例如西里尔文)和@JohnKormylo(建议使用“Redacted”字体)和@jfbu(举例),我想出了这个近乎完美的解决方案。我还了解到,这在图形设计中称为“线框图”。
它处理了 95% 的问题,剩下的部分是重新定义includegraphics
,并可能使文本不可复制(如果可能的话是否可以生成包含不可复制文本的 PDF?)。
操作说明:
1)安装 Redacted 字体https://github.com/christiannaths/Redacted-Font
2)使用 Lualatex 并将其添加到您的文档中
\usepackage{fontspec}
\setmainfont[
ExternalLocation={./},
BoldFont={redacted-script-bold.ttf},
ItalicFont={redacted-script-light.ttf},
BoldItalicFont={redacted-script-bold.ttf} % or use pretty names if it works for you
]{redacted-script-regular.ttf} % Redacted Script
\setsansfont[ExternalLocation={./}]{redacted-script-regular.ttf} % Redacted
\usepackage{unicode-math}
\setmathfont[range=\mathup/{num}]{redacted-script-regular.ttf}
\setmathfont[range=\mathrm]{redacted-script-regular.ttf}
\setmathfont[range=\mathit]{redacted-script-light.ttf}
\setmathfont[range=\mathbf]{redacted-script-bold.ttf}
注意:不幸的是,我从来没有设法使用名称中带有空格的系统字体setmainfont
(它永远找不到它),所以我不得不将文件放在同一个目录中并通过文件名调用它们(如果您知道如何做,请告诉我正确的方法)。
结果非常好:
版本 2(使斜体与直立字母区分开)
编辑后的字体太倾斜,并且没有“斜体”变体,所以我给常规变体赋予负倾斜,给斜体赋予正倾斜。(AutoFakeBold
在这里也不起作用)。
\usepackage{fontspec}
\setmainfont[
ExternalLocation={./}, FakeSlant=-0.5, AutoFakeSlant=0.5,
BoldFont={redacted-script-bold.ttf},
% ItalicFont={redacted-script-light.ttf},
BoldItalicFont={redacted-script-bold.ttf} % or use pretty names if it works for you
]{redacted-script-regular.ttf} % Redacted Script
\setsansfont[ExternalLocation={./}, FakeSlant=-0.5]{redacted-script-regular.ttf} % Redacted
\usepackage{unicode-math}
\setmathfont[range=\mathup/{num}]{redacted-script-regular.ttf}
\setmathfont[range=\mathrm]{redacted-script-regular.ttf}
\setmathfont[range=\mathit]{redacted-script-light.ttf}
\setmathfont[range=\mathbf]{redacted-script-bold.ttf}
\setmathfont[range={"2032}]{redacted-script-regular.ttf} %solve unicode-math "prime" bug: https://tex.stackexchange.com/questions/208988/prime-gives-undefined-control-sequence-in-xelatex-with-unicode-math
%
答案2
答案3
根据 Christian Hupfer 在评论中提出的更改字体的想法。当然,逆向工程很容易实现。数学没有得到处理(可以添加包 mathastext 的使用,这甚至可以用于希腊字母;也可以对大符号采取额外的步骤)。
我使用blindtext
包只是为了获取某种文档。
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{blindtext}
% copy this to real situation
\renewcommand\encodingdefault{U}
\renewcommand\rmdefault{pzd}
\renewcommand\sfdefault{pzd}
\renewcommand\ttdefault{pzd}
\begin{document}
\blinddocument
\end{document}
答案4
Python 3 解决方案(大部分延迟都是因为我遇到了两个问题):
文档=r“”” \documentclass{文章} \usepackage{lipsum} \开始{文档} \section[短标题][无效]{较长的章节标题}{无效} \textbf{这里有一些粗体可变文本。} 此处的一些文字需要替换。 \lipsum[1] \开始{图} \includegraphics[width=\textwidth]{某物.pdf} \caption{\label{fig} 标题} \结束{图} \结束{文档} “”” 导入重新,编解码器 def rot13(s): 返回 codecs.encode(s,"rot-13") # 列出我们想要保留的宏列表(默认) immutable_macro = re.compile(r"\\[^\s]*") # 列出我们想要混淆的宏 可变宏字符串列表 = [ r"\\节", r"\\textbf", ] # 定义模式来查找宏参数 可选参数 = re.compile(r"\[([^\]]+)\]") 强制参数 = re.编译(r“{([^}]+)}”) 可变宏列表 = [] 对于 mutable_macro_string_list 中的 s: p = 重新编译 mutable_macro_list.append(p) # 遍历文档行 对于 document.split('\n')[1:-1] 中的行: 匹配 = 假 # 寻找可变的宏行,混淆参数 如果匹配==False: 对于可变宏列表中的 p: m = p.搜索(行) 如果 m!=无: #打印宏名称 打印(“%s”%(line[0:m.end()]),end ='') # 打印混淆的可选参数(如果有) m =optional_arg.findall(行) 如果 len(m)>0: 对于 g 在 m 中: 打印(“[%s]”%(rot13(g)),结束='') # 打印模糊化的强制参数(如果有) m = 强制参数.findall(行) 如果 len(m)>0: 对于 g 在 m 中: 打印(“{%s}”%(rot13(g)),结束='') 匹配 = True 休息 # 查找不可变的宏或常规文本 如果匹配==False: m=immutable_macro.search(行) 如果 m!=无: # 打印宏 打印(“%s”%(行),结束='') 别的: # 打印混淆后的文本 打印(“%s”%(rot13(line)),结束='') 打印()
结果是:
\documentclass{article}
\usepackage{lipsum}
\begin{document}
\section[Fubeg gvgyr][Vainyvq]{Zhpu ybatre frpgvba gvgyr}{Vainyvq}
\textbf{Urer'f fbzr obyq zhgnoyr grkg.}
Fbzr grkg urer arrqf gb or ercynprq.
\lipsum[1]
\begin{figure}
\includegraphics[width=\textwidth]{something.pdf}
\caption{\label{fig} Caption}
\end{figure}
\end{document}