PGF/TikZ 是 Till Tantau 开发的基于 TeX 的绘图引擎。因其可以直接在 LaTeX 文稿中通过代码绘制向量图,所以是目前流行的 LaTeX 绘图解决方案之一。

tikzpicture 环境或者 \tikz 命令的参数中,可以通过 scale 选项来缩放绘制的图形。然而,这种缩放不会同步应用在 node 中的文字上,导致图形与 node 中的文字注解大小失衡。

我们来解决这个问题。

绘制一个函数图像

现在,比如说我们绘制一个最简单的二次函数的图像。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
\begin{tikzpicture}
\draw[gray, step = 0.5cm] (0, 0) grid (5, 5);
\draw[->] (-.5, 0) -- (5.5, 0);
\draw[->] (0, -.5) -- (0, 5.5);

\node[anchor = north east] at (0, 0) {$ o $};
\node[anchor = north] at (5.5, 0) {$ x $};
\node[anchor = west] at (0, 5.5) {$ y $};
\foreach \x in {1, ..., 5} {
\node[anchor = north] at (\x, 0) {$ \x $};
\node[anchor = east] at (0, \x) {$ \x $};
}

\draw[domain = -0.5:2.2, smooth, variable=\x, blue]
plot ({\x}, {\x * \x})
node[anchor = west] {$ y = x^2 $};
\end{tikzpicture}

放大之

现在,你觉得这张图太小。于是你考虑给 tikzpicture 环境加上 scale = 2 来放大它。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
\begin{tikzpicture}[scale = 2]
\draw[gray, step = 0.5cm] (0, 0) grid (5, 5);
\draw[->] (-.5, 0) -- (5.5, 0);
\draw[->] (0, -.5) -- (0, 5.5);

\node[anchor = north east] at (0, 0) {$ o $};
\node[anchor = north] at (5.5, 0) {$ x $};
\node[anchor = west] at (0, 5.5) {$ y $};
\foreach \x in {1, ..., 5} {
\node[anchor = north] at (\x, 0) {$ \x $};
\node[anchor = east] at (0, \x) {$ \x $};
}

\draw[domain = -0.5:2.2, smooth, variable=\x, blue]
plot ({\x}, {\x * \x})
node[anchor = west] {$ y = x^2 $};
\end{tikzpicture}

于是你发现,整个图像确实放大了。但是其中的说明注解还是老样子,没有放大。这样一来,相比整个图像,注解文字就显得比较小。也许 scale = 2 的状态,看起来还算匀称,但若是 scale = 10,那么文字部分就小弱蚊蝇了。

另一方面,有些图像,其注解文字和图像内容是匹配好的。强行缩放之后,可能破坏好这种预先设置匹配,也不完美。

因此,我们得想办法解决。

全局缩放

问题的原因在于,TikZ 中的 node,其内容、样式都是单独设置的,全局的 scale 设置无法影响 node 的内容。因此,我们有必要定义一个 global scale 的参数,统一地设置两部分的缩放比例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
\tikzset{global scale/.style={
scale=#1,
every node/.append style={scale=#1}
}
}
\begin{tikzpicture}[global scale = 2]
\draw[gray, step = 0.5cm] (0, 0) grid (5, 5);
\draw[->] (-.5, 0) -- (5.5, 0);
\draw[->] (0, -.5) -- (0, 5.5);

\node[anchor = north east] at (0, 0) {$ o $};
\node[anchor = north] at (5.5, 0) {$ x $};
\node[anchor = west] at (0, 5.5) {$ y $};
\foreach \x in {1, ..., 5} {
\node[anchor = north] at (\x, 0) {$ \x $};
\node[anchor = east] at (0, \x) {$ \x $};
}

\draw[domain = -0.5:2.2, smooth, variable=\x, blue]
plot ({\x}, {\x * \x})
node[anchor = west] {$ y = x^2 $};
\end{tikzpicture}

如此一来,node 中的内容,就会同步比例地缩放了。

在 LaTeX 中同步缩放 TikZ 与其中的 node的更多相关文章

  1. Latex中画出函数文件的调用关系拓扑图

    流程图,思维导图,拓扑图通常能把我们遇到的一些复杂的关系结构用图形的方式展现出来.在Latex中要想画这样的拓扑图,有一个很好用的绘图工具包 pgf/tikz . 1.pgf/tikz的安装:pgf/ ...

  2. 在 LaTeX 中实现缩印效果

    https://liam.page/ 近日大概重拾了一点对 LaTeX 的兴趣,遇见这样一个问题:如何在 LaTeX 中实现缩印效果(即,将两页或更多页排版在一页纸上),并且实现水印效果的页码? 缩印 ...

  3. C#开发微信门户及应用(10)--在管理系统中同步微信用户分组信息

    在前面几篇文章中,逐步从原有微信的API封装的基础上过渡到微信应用平台管理系统里面,逐步介绍管理系统中的微信数据的界面设计,以及相关的处理操作过程的逻辑和代码,希望从更高一个层次,向大家介绍微信的应用 ...

  4. 如何在latex 中插入EPS格式图片

    如何在latex 中插入EPS格式图片 第一步:生成.eps格式的图片 1.利用visio画图,另存为pdf格式的图片 利用Adobe Acrobat裁边,使图片大小合适 另存为.eps格式,如下图所 ...

  5. Latex中插入C语言代码

    Latex是一个文本排版的语言,能排版出各种我们想要的效果.而且用代码排版的优点是易于修改板式,因此在文本内容的排版时,Latex应用十分广泛. 当我们需要在Latex中插入代码时,就需要用到 \us ...

  6. 尝试解决在构造函数中同步调用Dns.GetHostAddressesAsync()引起的线程死锁

    (最终采用的是方法4) 问题详情见:.NET Core中遇到奇怪的线程死锁问题:内存与线程数不停地增长 看看在 Linux 与 Windows 上发生线程死锁的后果. Linux: Microsoft ...

  7. ASP.NET sync over async(异步中同步,什么鬼?)

    async/await 是我们在 ASP.NET 应用程序中,写异步代码最常用的两个关键字,使用它俩,我们不需要考虑太多背后的东西,比如异步的原理等等,如果你的 ASP.NET 应用程序是异步到底的, ...

  8. IO中同步、异步与阻塞、非阻塞的区别

    一.同步与异步同步/异步, 它们是消息的通知机制 1. 概念解释A. 同步所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 按照这个定义,其实绝大多数函数都是同步调用(例如si ...

  9. paper 48: Latex中如何制作参考文献

    文章写到现在,最后一步就要大功告成了!reference,let's go! 一.用Google来做Latex的bib文件 1. 打开scholar.google.com 2. 定制   Schola ...

随机推荐

  1. 安装ssh

    1.win10 安装ssh sudo apt-get remove --purge openssh-server ## 先删ssh sudo apt-get install openssh-serve ...

  2. JavaSE部分1.Java基础

    1.为什么重写equals()还要重写hashcode()?  (equals()和hashCode()是java Object中两个基本方法) 首先equals与hashcode间的关系是这样的: ...

  3. Matlab——表达式 阵列与矩阵的创建

    表达式 指令过长: 如果一个指令过长可以在结尾加上... 下一行继续写指令即可 若不想每次都显示运算结果,只需在运算式最後加上分号(:)即可 注释 基本的算术运算有: 加 (+).减 (-).乘 (* ...

  4. ball小游戏

    2019第三次课程设计实验报告 一.实验项目 -- ball 二.实验功能描述: 玩家通过wsad移动下面的挡板,接住下落的弹球,弹击上头的球获得积分,弹球没接住则比赛结束,计算积分 三.项目模板结构 ...

  5. 大二 Java上学期总结

    一学期的Java学习结束了,这学期对程序语言的理解更深了,首先感谢李津老师的教导,这学期收获挺多的,不像上学期,这学期没有任何缺课表现,希望之后的语言程序学习会更加努力. 突然感觉Java的学习如此之 ...

  6. 路由器桥接时,为什么要关闭 DHCP 服务器?

    问:看网上的一些教程,路由器设置无线桥接的时候,副路由器中的 DHCP 服务器需要关闭,请问这是为什么? 答:两个路由器无线桥接时,之所以要关闭副路由器的 DHCP 服务器,是为了避免 IP 地址错误 ...

  7. SVN服务器和客户端使用教程总结

    一.SVN简介 Subversion是什么? 它是一个自由/开源的版本控制系统,一组文件存放在中心版本库,记录每一次文件和目录的修改,Subversion允许把数据恢复到早期版本,或是检查数据修改的历 ...

  8. [Web 前端] 027 jQuery 相关尺寸与事件绑定

    1. 相关尺寸 1.1 获取元素相对于文档的偏移量 var pos = $('#small').offset(); console.log(pos.left, pos.top); 1.2 获取当前元素 ...

  9. (二)inlineCallbacks,同步方式写异步代码

    一. 上篇提到了用defered对象注册回调的方式,来处理异步操作,这样大家都知道,实际情况代码很难搞的.因为当业务逻辑复杂后,这边一个异步操作,我们注册一个回调,代码跳到A地方,A里面也有异步操作, ...

  10. Dubbo 序列化协议 5 连问,你接得住不?

    1)dubbo 支持哪些通信协议? 2)支持哪些序列化协议? 3)说一下 Hessian 的数据结构? 4)PB 知道吗? 5)为什么 PB 的效率是最高的? 面试官心理分析 上一个问题,说说 dub ...