Когда я использую tikz для создания PDF-файла, я использую следующую команду для его преобразования в файл PNG размером 1920x1080.
convert -density 300 exam.pdf -resize 1920x1080 out.png
Но если исходный PDF-файл имеет соотношение сторон не 16:9, то выходной файл будет не совсем таким, как ожидалось (например, 1080x1080).
Как мне настроить tikz на вывод PDF-файла с фиксированным соотношением сторон (например, 16:9)?
Кстати, этот метод будет использовать изменение размера, потеряет ли это преобразование качество изображения? Как сохранить наилучшее качество при конвертации PDF в PNG?
например:
\documentclass[border=2mm]{standalone}
\usepackage{tikz}
\begin{document}
\tiny\begin{tikzpicture}[]
\draw (0,0) circle (5cm);
\end{tikzpicture}
\end{document}
Этот круг создаст PDF-файл размером 10x10 см, поэтому соотношение сторон по умолчанию — 1:1. Мне нужен круг, который по-прежнему останется кругом, но соотношение сторон будет 16:9.
решение1
Это код, который расширяет ограничивающий блок симметрично, чтобы соответствовать целевому соотношению ширины и высоты. Он делает это таким образом, что учитывает дополнительные поля, которые могут исходить от автономного класса, но также работает для неавтономных документов.
\documentclass[tikz,border=2mm]{standalone}
\makeatletter
\tikzset{fixed ratio/.code={\def\tikz@pft##1:##2;{\edef\pgfutil@tempx{##1}\edef\pgfutil@tempy{##2}}%
\expandafter\tikz@pft#1;%
\tikzset{execute at end picture={%
\ifcsname sa@border@right\endcsname
\pgfmathsetmacro\pgfutil@tempa{((\pgf@picmaxx+\sa@border@right-\pgf@picminx+\sa@border@left)/%
(\pgf@picmaxy+\sa@border@top-\pgf@picminy+\sa@border@bottom)}%
\else
\pgfmathsetmacro\pgfutil@tempa{((\pgf@picmaxx-\pgf@picminx)/(\pgf@picmaxy-\pgf@picminy)}%
\fi
\pgfmathsetmacro\pgfutil@tempb{(\pgfutil@tempx/\pgfutil@tempy)}%
\ifdim\pgfutil@tempa pt=\pgfutil@tempb pt\relax
\else
\ifdim\pgfutil@tempb pt>\pgfutil@tempa pt\relax
% target ratio greater than actual
\pgfmathsetmacro\pgfutil@tempc{-(\pgf@picmaxx-\pgf@picminx)%
+\pgfutil@tempb*(\pgf@picmaxy-\pgf@picminy)}%
\path ([xshift=-0.5*\pgfutil@tempc]current bounding box.west)
([xshift=0.5*\pgfutil@tempc]current bounding box.east);
\else
% target ratio smaller than actual
\pgfmathsetmacro\pgfutil@tempc{-(\pgf@picmaxy-\pgf@picminy)%
+(\pgf@picmaxx-\pgf@picminx)/\pgfutil@tempb}%
\path ([yshift=-0.5*\pgfutil@tempc]current bounding box.south)
([yshift=0.5*\pgfutil@tempc]current bounding box.north);
\fi
\fi
}%
}}
}
\makeatother
\begin{document}
\begin{tikzpicture}[fixed ratio=16:9]
\draw (0,0) circle [radius=5cm];
\end{tikzpicture}
\begin{tikzpicture}[fixed ratio=9:16]
\draw (0,0) circle [radius=5cm];
\end{tikzpicture}
\end{document}
решение2
Если размеры конечного результата известны, можно использовать tcolorbox
дополнения, TikZ
которые могут изменить размер фигуры TiKZ, чтобы настроить ее по желаемому пути. Этот путь может зафиксировать конечные размеры. Некоторые примеры:
\documentclass[tikz, border=2mm]{standalone}
\usepackage[skins]{tcolorbox}
\begin{document}
\begin{standalone}
\begin{tikzpicture}
\path[fill zoom picture={%
\draw (0,0) circle (5cm);}] (0,0) rectangle ++(16,9);
\end{tikzpicture}
\begin{tikzpicture}
\path[fill zoom picture={%
\draw (0,0) circle (5cm);}] (0,0) rectangle ++(10,10);
\end{tikzpicture}
\begin{tikzpicture}
\path[fill zoom picture={%
\draw (0,0) circle (5cm);}] (0,0) rectangle ++(20,25);
\end{tikzpicture}
\end{standalone}
\end{document}
решение3
Другое решение, посчитаем:
\documentclass[border=0mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\tiny\begin{tikzpicture}[]
\draw (0,0) circle (5cm);
% keep ratio
\def\ratio{16/9}
\path let \p1=(current bounding box.center),
\p2=(current bounding box.east),
\p3=(current bounding box.north),
\p4=(current bounding box.west),
\p5=(current bounding box.south),
\n1={\y3-\y1},
\n2={\n1*\ratio},
\n3={\y5 - \y1},
\n4={\n3*\ratio}
in
[use as bounding box] (\n4,\y5) rectangle (\n2,\y3);
\end{tikzpicture}
\end{document}
Кстати, не добавляйте границу, так как это повлияет на соотношение сторон.