我想知道是否有一个转换器,一个程序,可以让你上传或创建图像,然后给你 tikz 代码以在 LaTeX 中创建它?我发现了一个类似的问题这里,但没有一个答案提到转换器。我找到了一些方程式转换器。然而,这不是我想要转换的。
我想获取一张图片(例如我的签名),然后创建一个命令\signature
,以与文本相同的大小和颜色打印我的签名。我想在 .sty 文件(包)中创建该命令,以便可以在我编写的所有文档中使用该命令,因此我不想只针对一个文档使用解决方案。
我不仅想要这种格式的签名,还想要徽标。因此,我想要一个通用的解决方案:一个将 PNG/JPEG 或其他图像文件类型转换为 tikz 代码的转换器。
在签名示例中,代码看起来像这样:
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{mypackage}
\RequirePackage{tikz}
\newcommand{\signature}{%
... tikz code ... %
}
\endinput
和:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{mypackage}
\begin{document}
My name is \signature. Now I can easy
sign documents. This document was created by \signature.
\end{document}
答案1
您可以直接使用 png/jpg 图像并调整大小和颜色为当前字体。
当前字体大小存储在宏中\f@size
,可以用作height
的属性\includegraphics
。
decodearray
通过将属性指定为 ,可以修改所包含图像的颜色\includegraphics
。此数组包含颜色的每个成分的两个乘法因子,一个因子用于成分为 0 时,另一个因子用于成分为 1 时,并在两者之间进行插值。因此,可以使用因子将白底黑色的 RGB 图像转换为绿色0 1 1 1 0 1
(0% 红色(黑色的一部分)保持 0% 红色,0% 绿色变为 100% 绿色,0% 蓝色保持 0% 蓝色,100% 红色(白色的一部分)保持 100% 红色,100% 绿色保持 100% 绿色,100% 蓝色保持 100% 蓝色)。
\extractcolorspecs
可以从包中检索颜色的值xcolor
,其中参数.
用于当前颜色(例如,https://tex.stackexchange.com/a/451937/)。例如,RGB 橙色为1,0.5,0
。删除逗号并在每个组件后添加 1 会得到相应的 DecodeArray,这里是1 1 0.5 1 0 1
。该xstring
包可用于字符串操作,在这种情况下\StrSubstitute
,它可以将逗号更改为空格和(并在1
最后添加)。1
\def
包中的基本颜色xcolor
(红色、橙色、紫色等)被定义为 RGB,因此上述过程适用于此。
但是,ForestGreen、DarkOrchid、Emerald 等命名颜色被定义为 CMYK。这是有问题的,因为 CMYK DecodeArrays 不适用于\includegraphics
,而是必须直接插入 PDF 流中,请参阅更改包含的 cmyk jpg 的颜色。另外,CMYK 是加法的(0,0,0,0
是白色并且1,1,1,1
或多或少是黑色),所以不是添加 ,而是必须添加 以保持图像的白色背景。进一步的问题是,您需要一个 CMYK 编码的图像文件才能使用 CMYK DecodeArray,而 PNG 不支持 CMYK,因此您需要一个 JPEG。最后一个问题是自动色彩空间转换(例如 ImageMagick 1
)会将黑色转换为而不是(两种表示形式或多或少都是黑色),将白色转换为。这意味着 DecodeArray 无法判断 CMY 分量在该像素处图像是黑色还是白色。要解决这个问题,您可以使用以下命令行手动进行转换:0
convert
0,0,0,1
1,1,1,1
0,0,0,0
convert signature.png -colorspace cmyk -fuzz 10% -fill 'cmyk(255,255,255,255)' -opaque 'rgb(0,0,0)' sigcmyk.jpg
现在剩下的就是检查文档中当前颜色使用哪种颜色模型,并将其用于\includegraphics
RGB 和 PDF 对象插入,以使用 CMYK。此检查可以通过\ifdefstring
包来完成etoolbox
(需要此包的较新版本)。也可以直接为 pdf 对象设置高度。
梅威瑟:
\documentclass{article}
\usepackage[margin=1cm]{geometry}
\usepackage[usenames,dvipsnames]{xcolor}
\usepackage{graphicx}
\usepackage{xstring}
\usepackage{etoolbox}
\def\dfltColorModel{}
\def\dfltColor{}
\makeatletter
\def\signature{%
% get color model and values for current color
\extractcolorspecs{.}{\dfltColorModel}{\dfltColor}%
\ifdefstring{\dfltColorModel}{rgb}{%
% rgb: add 1 after each value to keep white background
\StrSubstitute[0]{\dfltColor}{,}{ 1 }[\colorarray]%
\def\cla{\colorarray\space 1}%
% include signature in current font size and transformed color
\includegraphics[height=\f@size pt, decodearray={\cla}]{signature}%
}{%
% cmyk: add 0 after each value to keep white background
\StrSubstitute[0]{\dfltColor}{,}{ 0 }[\colorarray]%
\def\cla{\colorarray\space 0}%
% output pdf image object directly
\immediate\pdfobj { /DeviceCMYK }%
\edef\deviceobjnum{\pdflastobj}%
\leavevmode%
\pdfximage height \f@size pt attr{/Decode [\cla]}%
colorspace \deviceobjnum%
{sigcmyk.jpg}%
\pdfrefximage \pdflastximage%
}%
}
\makeatother
\begin{document}
\color{orange}
\large
This text is orange and large \signature
\color{ForestGreen}
\Huge
This text is ForestGreen and Huge \signature
\end{document}
signature.png
:
结果: