tikz - 輸出具有特定比例的pdf

tikz - 輸出具有特定比例的pdf

當使用 tikz 產生 pdf 檔案時,我使用下面的命令將其轉換為 1920x1080 png 檔案。

convert -density 300 exam.pdf -resize 1920x1080  out.png

但如果原始 pdf 的比例不是 16:9,則輸出檔案將不完全符合預期(例如 1080x1080)。

我如何指示 tikz 輸出具有固定比例(例如 16:9)的 pdf。

順便說一句,這個方法會使用resize,這個轉換會損失影像品質嗎?如何保持將 pdf 轉換為 png 的最佳品質?

例如:

\documentclass[border=2mm]{standalone}
\usepackage{tikz}
\begin{document}    
    \tiny\begin{tikzpicture}[]
    \draw (0,0) circle (5cm);
    \end{tikzpicture}
\end{document}

此圓圈將產生 10c​​mx10cm 的 pdf,因此預設比例為 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}

順便說一句,不要添加邊框,因為它會影響比率。

在此輸入影像描述

相關內容