我想将我的缩放tikzpicture
到完全(或一定比例)\textwidth
当然,我可以不断尝试这个[scale=0.5]
选项,直到找到正确的值,但我认为一定有更简单的方法。
tikzpicture
如何获得具有精确宽度的正确比例(字体仍然必须正确) 。
答案1
这个问题是在压缩文本.tex并得到了 Ulrike Fischer 的一个很好的回答。它的工作原理是排版一次{tikzpicture}
,测量其宽度,然后通过自动计算所需的比例将其重新排版为正确的宽度。
这是此解决方案的更用户友好的界面,使用环境包。它的工作原理是使用{scaletikzpicturetowidth}
具有所需宽度的环境作为第一个参数,并结合指定[scale=\tikzscale]
tikzpicture 的选项。例如,要将 a 缩放tikzpicture
到\textwidth
,您可以使用:
\begin{center}
\begin{scaletikzpicturetowidth}{\textwidth}
\begin{tikzpicture}[scale=\tikzscale]
\draw (0,0) rectangle (1,1) node[below left] {$A$};
\draw (2,1) circle (1cm) node [below] {$B$};
\end{tikzpicture}
\end{scaletikzpicturetowidth}
\end{center}
这是一个完整的可编译代码,显示未缩放tikzpicture
和缩放的代码:
\documentclass{article}
\usepackage{tikz}
\usepackage{environ}
\makeatletter
\newsavebox{\measure@tikzpicture}
\NewEnviron{scaletikzpicturetowidth}[1]{%
\def\tikz@width{#1}%
\def\tikzscale{1}\begin{lrbox}{\measure@tikzpicture}%
\BODY
\end{lrbox}%
\pgfmathparse{#1/\wd\measure@tikzpicture}%
\edef\tikzscale{\pgfmathresult}%
\BODY
}
\makeatother
\begin{document}
Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla.
\begin{center}
\begin{tikzpicture}
\draw (0,0) rectangle (1,1) node[below left] {$A$};
\draw (2,1) circle (1cm) node [below] {$B$};
\end{tikzpicture}
\end{center}
Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla.
\begin{center}
\begin{scaletikzpicturetowidth}{\textwidth}
\begin{tikzpicture}[scale=\tikzscale]
\draw (0,0) rectangle (1,1) node[below left] {$A$};
\draw (2,1) circle (1cm) node [below] {$B$};
\end{tikzpicture}
\end{scaletikzpicturetowidth}
\end{center}
Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla.
\end{document}
如果您需要使用 tikzlibrary external
,这里有一个解决方法:
\documentclass{article}
\usepackage{tikz}
\usepackage{environ}
\usetikzlibrary{external}\tikzexternalize%\tikzset{external/force remake}
\makeatletter
\newcounter{tikz@scale@num}
\newsavebox{\measure@tikzpicture}
\NewEnviron{scaletikzpicturetowidth}[2][]{%
% optional argument #1 is passed to \tikzsetnextfilename if not empty
\stepcounter{tikz@scale@num}%
\def\tikz@width{#2}%
\def\tikzscale{1}\begin{lrbox}{\measure@tikzpicture}%
\BODY
\end{lrbox}%
\pgfmathparse{#2/\wd\measure@tikzpicture}%
\ifcsname tikzscale\number\value{tikz@scale@num}\endcsname\else
\expandafter\xdef\csname tikzscale\number\value{tikz@scale@num}\endcsname{\pgfmathresult}%
\fi
\tikzset{external/system call={pdflatex \tikzexternalcheckshellescape -halt-on-error -interaction=batchmode -jobname "\image" "\string\expandafter\string\edef\string\csname\space tikzscale\number\value{tikz@scale@num}\string\endcsname{\csname tikzscale\number\value{tikz@scale@num}\endcsname}\texsource"}}%
\edef\tikzscale{\csname tikzscale\number\value{tikz@scale@num}\endcsname}%
\ifcat$#1$\else\tikzsetnextfilename{#1}\fi
\BODY
}
\makeatother
\begin{document}
Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla.
\begin{center}
\begin{tikzpicture}
\draw (0,0) rectangle (1,1) node[below left] {$A$};
\draw (2,1) circle (1cm) node [below] {$B$};
\end{tikzpicture}
\end{center}
Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla.
\begin{center}
\begin{scaletikzpicturetowidth}{\textwidth}
\begin{tikzpicture}[scale=\tikzscale]
\draw (0,0) rectangle (1,1) node[below left] {$A$};
\draw (2,1) circle (1cm) node [below] {$B$};
\end{tikzpicture}
\end{scaletikzpicturetowidth}
\end{center}
Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla.
\end{document}
如果需要使用\tikzsetnextfilename{name}
自动缩放的图片,请使用语法\begin{scaletikzpicturetowidth}[name]{\textwidth}
。
答案2
1)
对于较小的tikzpicture
s,您可以简单地使用(或)包\resizebox
中的宏:graphics
graphicx
\resizebox{\textwidth}{!}{%
\begin{tikzpicture}
\draw (0,0) .... ;
\end{tikzpicture}
}%
但是,这使得图片成为宏参数的一部分,例如不允许节点内有逐字文本。TikZ 本身会努力将节点内容处理为盒子不像宏参数允许其中存在任何形式的代码,包括逐字代码。
environ
还应避免使用该包在一般情况下因为它也使环境体成为一个宏观参数。
2)
可以简单地使用lrbox
Philippe 的答案来定义自己的环境,但是普通的环境以及\resizebox
:
\newsavebox\mybox
\newenvironment{resizedtikzpicture}[1]{%
\def\mywidth{#1}%
\begin{lrbox}{\mybox}%
\begin{tikzpicture}
}{%
\end{tikzpicture}%
\end{lrbox}%
\resizebox{\mywidth}{!}{\usebox\mybox}%
}
%
% Usage example:
\begin{resizedtikzpicture}{\textwidth}[<tikz options>]
\draw .... ;
\end{resizedtikzpicture}
3)
我最近创建了这个包,adjustbox
以便为用户提供文本或其他内容的选择权\includegraphics
。这可以很好地在这里使用:
% Preamble
\usepackage{adjustbox}
% Document
\begin{adjustbox}{width=\textwidth}% there is also 'max width' to only scale it down if it is larger
\begin{tikzpicture}[<options>]
\draw .... ;
\end{tikzpicture}
\end{adjustbox}
它支持逐字和其他特殊内容,并且适用于普通文本和其他图片环境。
答案3
也许使用相对坐标的最简单方法是使用scale=\textwidth/1cm
,然后只使用 0 到 1 之间的值作为坐标(假设基本比例尺寸为 1 厘米)。您还可以估算图形的大小并使用相同的技巧。我遇到了这个问题,因为图形已经完成,我想在之后对其进行缩放。
\begin{tikzpicture}[scale=\textwidth/15.2cm,samples=200]
%x axis
\draw[->] (-0.1,0) -- (15.1,0) node[below] {$x$};
%y axis
\draw[->] (0,-0.1) -- (0,6.1) node[left] {$y$};
%exponential function
\draw[color=red, thick, domain=0.0:9.5] plot[id=efunc] function{1.5**(x-5) - 1.5**(-5) + 0.1} node[color=red, anchor=west] {$y = e^x$};
%logistic function
\draw[color=blue, thick, domain=0.0:15.0] plot[id=logfunc] function{5/(1 + 2**(-x+7.5)) - 5/(1 + 2**(7.5)) + 0.1} node[color=blue, anchor=north east] {$y = \cfrac{1}{1 + e^{-x}}$};
\end{tikzpicture}