
Идея состоит в том, чтобы воспроизвести изображение как можно точнее. Две проблемы: параметр s не учитывается; размер меток все еще слишком мал.
\documentclass[border=5mm]{standalone}
\usepackage{luatex85}
\usepackage{luamplib}
\usepackage{unicode-math}
\setmainfont{TeX Gyre Pagella}
\setmathfont{TeX Gyre Pagella Math}
\begin{document}
\mplibtextextlabel{enable}
\begin{mplibcode}
vardef card(expr a, c, s) = image(
save rectangle;
path rectangle;
rectangle = unitsquare xscaled 2 cm yscaled 4cm;
draw rectangle rotatedaround((1cm,2cm),a) withcolor c;
label(btex \Huge s etex ,center rectangle) rotatedaround((1cm,2cm),a) withcolor c;
)
enddef;
beginfig(1)
pickup pencircle scaled 4;
color pink;
pink = (3/4, 1/3, 1/3);
draw card(-10, 1/4[red, white], A);
draw card(10 , 1/4[green, white], L) shifted 80 right;
draw card(-10, 1/4[blue, white], E) shifted 160 right;
draw card(10, pink, A) shifted 240 right;
endfig;
\end{mplibcode}
\end{document}
решение1
Возможно, есть и лучшие способы, но вот то, что работает. К лучшему или к худшему, я изменил пару вещей в вашем изначальном подходе (для ответа, более близкого к тому, что у вас было изначально, см. первый ответ в истории правок).
- Я не знаю, можно ли сделать метки без передачи строки в макросе, и как это сделать, поэтому я передал ваши метки как строки, например, «A».
- Я взял руководство
plain.mp
и сделал ваши метки таким образом. Это дополнительно позволяет вам довольно легко указать масштаб (pic1
ниже). - Вместо того чтобы вращать прямоугольник и метку по отдельности, я нарисовал их вместе и повернул результат.
Редактировать: изменено, чтобы не требовались дополнительные пакеты, см. историю правок для оригинала сgraphicx
\documentclass[border=5mm]{standalone}
\usepackage{luatex85}
\usepackage{luamplib}
\mplibtextextlabel{enable}
\usepackage{unicode-math}
\setmainfont{TeX Gyre Pagella}
\setmathfont{TeX Gyre Pagella Math}
\begin{document}
\begin{mplibcode}
vardef card(expr a, c, s) = image(
save pic,rectangle;
picture pic[];
path rectangle;
rectangle = unitsquare xscaled 2 cm yscaled 4cm;
pic1= s infont defaultfont scaled 4;% change your scale here
pic2=image(
draw rectangle;
draw pic1 shifted (center rectangle-center pic1);
);
draw pic2 rotatedaround((1cm,2cm),a) withcolor c;
)
enddef;
beginfig(1)
pickup pencircle scaled 4;
color pink;
pink = (3/4, 1/3, 1/3);
draw card(-10, 1/4[red, white], "A");
draw card(10 , 1/4[green, white], "L") shifted 80 right;
draw card(-10, 1/4[blue, white], "E") shifted 160 right;
draw card(10, pink, "A") shifted 240 right;
endfig;
\end{mplibcode}
\end{document}
решение2
Вот еще одна попытка...
\documentclass[border=5mm]{standalone}
\usepackage{luamplib}
\usepackage{fontspec}
\setmainfont{Arial Rounded MT Bold}
\begin{document}
\mplibtextextlabel{enable}
\begin{mplibcode}
vardef card(expr rotation, shade, letter) = image(
path rectangle; rectangle = unitsquare shifted (-1/2, -1/2) xscaled 56 yscaled 91 ;
unfill rectangle;
draw rectangle withpen pencircle scaled 4.2;
undraw rectangle withpen pencircle scaled 3 withcolor 1/2[shade, background];
label(textext(letter) scaled 6, origin) withcolor shade;
currentpicture := currentpicture rotated rotation;
) enddef;
beginfig(1);
draw card(normaldeviate + 10, 1/2 red, "A");
draw card(normaldeviate - 10, 1/2 green, "L") shifted 80 right;
draw card(normaldeviate + 10, 1/4[blue, white], "E") shifted 160 right;
draw card(normaldeviate - 10, 1/2[red, blue], "A") shifted 240 right;
endfig;
\end{mplibcode}
\end{document}
Примечания
вращение будет проще, если сместить его
unitsquare
так, чтобы он был центрирован относительно начала координатdraw
+undraw
с более тонкой ручкой есть полезный трюк, чтобы получить закругленные углыВы можете масштабировать
picture
возвращаемый результатtextext
Небольшое дополнительное случайное вращение может улучшить этот вид отображения.