缩放独立 tikzpicture 但保留文本字体大小

缩放独立 tikzpicture 但保留文本字体大小

我有一个独立standalone_tikzpicture.tex文件,

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,shapes,arrows,positioning,calc}
\begin{document}
\begin{tikzpicture}[
sum/.style= {draw, circle},
input/.style = {coordinate},
output/.style= {coordinate},
>=Stealth,
]
\node [input, name=input1] (input1) {};
\node [sum, right of=input1, name=sum1] (sum1) {$ + $};
\node [output, right of=sum1, name=output1] (output1) {};
\draw [->] node [left] {$\textbf{A}$} (input1) -- (sum1);
\draw [->] (sum1) -- (output1) node [right] {B};
\end{tikzpicture}
\end{document}

我想在另一个文件中main.tex以不同的比例显示它。我的main.tex文件是:

\documentclass{article}
\usepackage{tikz}
\usepackage{standalone}
\usetikzlibrary{arrows.meta,shapes,arrows,positioning,calc}
\begin{document}
\foreach \i in {0.5,1,...,4}{
\begin{figure}\label{fig:\i}
    \tikzset{every picture/.style={scale=\i,every picture/.style={}}}
    \centering
    \includestandalone{standalone_tikzpicture}
    \caption{Figure size \i.}
\end{figure}
}
\end{document}

问题是,输出的独立图片没有缩放main.tex。获得相同大小的图形。我唯一能缩放的方法是替换行

\includestandalone{standalone_tikzpicture}

\includestandalone[scale = \i]{standalone_tikzpicture}

但这也会导致文本缩放,这绝对不是我们想要的。我读过包含独立 tikz 文件并在不缩放节点的情况下缩放它的最佳方式,其中的解决方案对我来说不起作用。有没有办法保持字体大小不变,只缩放图片?

编辑1(错过添加要求):

\foreach这里仅用于模拟同一张图片的多个实例。要求是在不同的地方使用同一张图片。因此standalone_file是必需的。

答案1

下面缩放inner sep以使圆圈变大,并直接指定间隔距离。我不确定间隔距离left of用什么,但它不是inner sepouter sep

我没有尝试使用standalone。那是另一个问题。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{arrows.meta}
\begin{document}
\foreach \i in {0.5,1,...,4}{%
\begin{figure}
    \centering
    \begin{tikzpicture}[
      every node/.style={inner sep={\i*.333em}},
      sum/.style= {draw, circle},
      >=Stealth,
      ]
      \node [sum] (sum1) {$ + $};
      \node [right={\i*1em}] (output1) at (sum1.east) {B};
      \node [left={\i*1em}] (input1) at (sum1.west) {$\textbf{A}$};
      \draw [->] (input1) -- (sum1);
      \draw [->] (sum1) -- (output1);
    \end{tikzpicture}
    \caption{Inner sep scale = \i, separation distance = \i em.}
\end{figure}
}
\end{document}

答案2

我找到了三种方法来解决这个问题。这些解决方案都保留了单独独立文件的要求。

如何使用每个解决方案的文件:

  • 主文件:阅读所有注释以main.tex打开和关闭每个解决方案的相应行。此文件是所有解决方案的必需文件。

  • 对于解决方案 1 和解决方案 2:阅读所有注释以standalone_tikzpicture12.tex打开和关闭解决方案 1 和解决方案 2 的适当行。

  • 对于解决方案 3:请使用standalone_tikzpicture3.tex

每个解决方案的详细信息:

  1. 解决方案 1:\tikzset{every picture/.style={scale=\i, every picture/.style={}}}可用于main.tex仅根据参数缩放形状\i,而不将变量明确发送到独立文件standalone_tikzpicture12.tex

  2. 解决方案 2:从main.tex将参数\i明确发送到独立文件standalone_tikzpicture12.tex并使用\draw[scale=\i]选项缩放每个形状。在 中standalone_tikzpicture12.tex,所有形状都以绝对比例绘制。创建节点只是为了添加文本,而周围没有任何形状。这在解决方案 1 和 2 中很常见。这对于更复杂的图形来说具有挑战性。这两种方法都是在我从 @JohnKormylo 那里了解到节点的大小适合内部内容后发展起来的。

  3. 在解决方案 3 中,创建的独立文件standalone_tikzpicture3.tex与问题中发布的文件没有太大区别,但有一些变化。参数\i被明确发送到独立文件,并且使用tikzpicture在文件中对整体进行缩放。在文件中,所有节点都根据所需大小创建具有参数的形状,例如节点距离、最小尺寸、圆等,内部不包含任何文本。对于每个文本,都会使用参数创建节点,这就是区别所在。这会使中的缩放效果无效。按 缩放所有内容,然后再次按 缩放仅文本以取消缩放。这里也可以明确使用任何其他变量来调整仅文本的比例。main.tex\includestandalone[scale=\i]{standalone_picture3}standalone_tikzpicture3.tex[scale=1/\i][scale=\i]main.tex\i1/\i

代码(默认启用解决方案 3):

main.tex(所有解决方案都需要):

    \documentclass{article}
    \usepackage{tikz}
    \usepackage{standalone}
    \usepackage{tikzscale}
    \usetikzlibrary{arrows.meta,shapes,arrows,positioning,calc}
    \begin{document}
    \foreach \i in {1,2,...,4}{
    \begin{figure}\label{fig:\i}
        \centering
%        \def\i{<MyScaleValue>} % assign a value to \i in General cases when not using \foreach to set \i

%        Enable below 1 line for method 1, Disable for method 2 and 3        
%        \tikzset{every picture/.style={scale=\i, every picture/.style={}}} % Method 1
%        Enable below 1 line for method 1 and 2, Disable for method 3
%        \includestandalone{standalone_picture12} % This is for method 1 and 2

%        Enable below line for method 3, Disable for method 1 and 2
        \includestandalone[scale=\i]{standalone_picture3} % This is for method 3

        \caption{Figure size \i.}
    \end{figure}
    }
    \end{document}

standalone_picture12.tex(解决方案 1 和 2 的独立文件):

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,}
\usetikzlibrary{positioning}
\begin{document}
    \begin{tikzpicture}[
    >=Stealth,
    ]
%    Enable below 1 line for method 1, Disable for method 2
    \def\i{1} % Method 1
    \def\ii{0.25*\i}
    \def\ij{3}
    \draw [domain=0:360, scale = \ii] plot ({cos(\x)}, {sin(\x)});
    \draw [->] (-\ii*\ij,0) -- (-\ii,0);
    \draw [->] (\ii,0) -- (\ii*\ij,0);
    \draw [line width = \ii] (-\ii*.75,0) -- (\ii*.75,0);
    \draw [line width = \ii] (0,-\ii*.75) -- (0,\ii*.75);
    \node [anchor=east] at (-\ii*\ij,0) {$ \textbf{A} $};
    \node [anchor=west] at (\ii*\ij,0) {$ \textbf{B} $};
    \end{tikzpicture}
\end{document}

standalone_picture3.tex(解决方案 3 的独立文件):

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,}
\usetikzlibrary{positioning}
\begin{document}
    \begin{tikzpicture}[
    node distance = 10mm and 10mm,
    sum/.style= {draw, circle, minimum size=6mm, inner sep=0pt, outer sep=0pt,},
    input/.style = {coordinate},
    output/.style= {coordinate},
    >=Stealth,
    ]
%    \def\i{1} % to test standalone
    \def\j{1} % to test standalone
    \node [input,] (input1) {};
    \node [sum, right=of input1,scale=\j] (sum1) {$ + $};
    \node [output, right=of sum1,scale=\j] (output1) {};
    \draw [->,scale=\j] (input1) -- (sum1);
    \node [anchor=east,scale=1/\i] at (input1) (A) {$\textbf{A}$};
    \draw [->,scale=\j] (sum1) -- (output1);
    \node [anchor = west,scale=1/\i] at (output1)  (B) {$ \textbf{B} $};
    \end{tikzpicture}
\end{document}

相关内容