用 LaTeX 制作「自由组合定律 emoji」图

前言

在网上看到别人发的用「滑稽」拼成的自由组合定律图,我就想用 emoji 宏包做同样的事,有几个问题:

  • 如何得到图片的一半、得到镜像的图片
  • 如何定位
  • 如何输出 emoji

好在前辈们制作的宏包满足我们的需求:

  • graphicx 宏包输出一半的 emoji、得到镜像的图片
  • calc 宏包得到 emoji 的尺寸
  • tikz 宏包定位
  • lualatex 编译方式、emoji 宏包输出 emoji

正文

思路

  • 单独输出一个 pdf,一页为正常的 emoji,另一页为镜像的 emoji
    % \def\baba{\scalebox{3}{\emoji{\mingzi}}}
    % \def\mama{\scalebox{-3}[3]{\emoji{\mingzi}}}
    \baba\newpage\mama
  • calc 宏包得到 emoji 的尺寸
    % \usepackage{calc}
    \def\baba{\includegraphics[page=1]{figure.pdf}}
    \def\mama{\includegraphics[page=2]{figure.pdf}}
    \newlength{\emojiwidth}
    \setlength{\emojiwidth}{0pt}
    \newlength{\emojiheight}
    \setlength{\emojiheight}{0pt}
    \setlength{\emojiwidth}{\widthof{\baba}}
    \setlength{\emojiheight}{\heightof{\baba}}
  • graphicx 宏包提供的 viewportclip 参数输出一半的 emoji

完整代码

\documentclass{article}
\begin{filecontents*}{figure.tex}
\documentclass[fontset=fandol]{ctexart}
\usepackage{emoji}
\usepackage{graphicx}
\setemojifont{Twemoji Mozilla}
\def\mingzi{face-savoring-food}
\def\baba{\scalebox{3}{\emoji{\mingzi}}}
\def\mama{\scalebox{-3}[3]{\emoji{\mingzi}}}
\pagestyle{empty}
\begin{document}
\baba\newpage\mama
\end{document}
\end{filecontents*}

\begin{filecontents*}{main.tex}
\documentclass[fontset=fandol]{ctexart}
\usepackage{graphicx,tikz}
\usepackage{calc}
\setCJKmonofont{FandolHei}
\usepackage[default]{sourcecodepro}
\usetikzlibrary{positioning}
\def\baba{\includegraphics[page=1]{figure.pdf}}
\def\mama{\includegraphics[page=2]{figure.pdf}}
\newlength{\emojiwidth}
\setlength{\emojiwidth}{0pt}
\newlength{\emojiheight}
\setlength{\emojiheight}{0pt}
\setlength{\emojiwidth}{\widthof{\baba}}
\setlength{\emojiheight}{\heightof{\baba}}
\def\banba{\includegraphics[page=1,viewport= 0 0 0.5\emojiwidth{} \emojiheight,clip]{figure.pdf}}
\def\banma{\includegraphics[page=2,viewport= 0.5\emojiwidth{} 0 \emojiwidth{} \emojiheight{},clip]{figure.pdf}}
\def\bbanba{\includegraphics[page=1,viewport= 0.5\emojiwidth{} 0 \emojiwidth{} \emojiheight{},clip]{figure.pdf}}
\def\bbanma{\includegraphics[page=2,viewport= 0 0 0.5\emojiwidth{} \emojiheight{},clip]{figure.pdf}}
\pagestyle{empty}
\begin{document}
\begin{tikzpicture}
\node (a) at (0,0) {亲本 P};
\node[right=2 of a] (b) {\parbox[t]{3\ccwd}{\centering\baba\\YYRR}};
\node[right=1 of b] (c) {$\times$};
\node[right=1 of c] (d) {\parbox[t]{3\ccwd}{\centering\mama\\yyrr}};
\node[below=1.5 of a] (e) {子一代 F1};
\node[below=1.3 of c] (f) {\parbox[t]{3\ccwd}{\centering\baba\\YyRr}};
\draw[-latex] (c) -- (f);
\node[below=2 of e] (g) {子二代 F2};
\node[below=1.5 of f] (h) {};
\draw[-latex] (f) -- (h);
\node[left=0.5 of h] (j) {\parbox[t]{3\ccwd}{\centering\banba\banma\\Y*rr}};
\node[left=0.5 of j] (i) {\parbox[t]{3\ccwd}{\centering\baba\\Y*R*}};
\node[right=0.5 of h] (k) {\parbox[t]{3\ccwd}{\centering\bbanma\bbanba\\yyR*}};
\node[right=0.5 of k] (l) {\parbox[t]{3\ccwd}{\centering\mama\\yyrr}};
\end{tikzpicture}
\end{document}
\end{filecontents*}
\begin{document}
\end{document}

编译环境、方式

编译环境:TeX\TeX Live 2020

先用 pdflatex 编译完整代码,得到 figure.texmain.tex,为了方便编译,写了一个 bat 脚本(命名为 make.bat

lualatex figure.tex
pdfcrop figure.pdf figure.pdf
lualatex main.tex
pdfcrop main.pdf main.pdf

然后用「以管理员身份运行」(也可能是不必要的)的命令行下运行 make.bat 即可

更换其它的图片

只需要修改 figure.tex 中的 \def\mingzi{face-savoring-food} 即可(找 emoji 去 texdoc emoji

效果图

face-savoring-food 为例,效果为

文章作者: sikouhjw
文章链接: https://sikouhjw.github.io/2020/08/29/2020-08-29-emoji/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 sikouhjw.github.io
支付宝捐赠
微信捐赠