一篇短文让你明白LaTeX的引用
程序员文章站
2022-03-09 13:26:49
...
今天写篇关于的小短文——到底该如何进行内容“引用”。虽然本文重点介绍图片的引用,但是看完本文后,你不仅会使用本文思想对任意对象进行引用(\ref
)操作,还会了解的解析原理。
如下代码,我准备引用一张图片:
% 导入宏包
\usepackage{graphicx}
% 省略\begindocument等内容……
% 引用宏
\includegraphics[scale=0.5]{triangle/S-a-h.png}
\includegraphics
便是我们的图片引用宏。接下来,为了使图片居中,我们将其嵌入\centerline
宏:
% 省略一堆内容……
% 嵌入\centerline
\centerline{\includegraphics[scale=0.5]{triangle/S-a-h.png}}
当然,这样写代码或多或少有些累赘。我们将图片写入\begin{figure}...\end{figure}
中:
\begin{figure}
\centering % 由于写到了begin...end中,就不能用centerline了
\includegraphics[scale=0.5]{figure.png}
\caption{插图}
\label{fig:mypicture} % 设置引用标签
\end{figure}
之后,空几行,我们用\ref
尝试引用我们的标签:\ref{fig:mypicture}
,完成。⌘+T,然后你就会发现pdf完蛋了:该变成序号的地方变成了两个问号:
这是为什么呢?在网上冲了会浪,终于找到了答案。
引用失败的原因
我们先来分析一下,换位思考,要是编译器看到这段代码会怎么想。
\begin{figure} % 1
\centering % 2
\includegraphics[scale=0.5]{figure.png} % 3
\caption{插图} % 4
\label{fig:mypicture} % 5
\end{figure} % 6
第一行:编译器知道,figure
模块要开始了,等待end
;
第二行:编译器知道,我要对下一个对象在文档中居中;
第三行:编译器知道,我要插入图片;
此时编译器不仅插入了图片,还将图片居中了;
第四行:创建了一个caption文本;
第六行:编译器:label?给谁创建label呢?编译器难住了,于是抛出了一个warning。
编译器难住的原因是,\centering
对\includegraphics
实施居中操作后,在编译层面会直接闭合这个代码scope,因为\centering
只会对它紧接着的下面一个对象实施操作,并不会再往下看到\label
对\includegraphics
的修饰。
解决方法:
\centering \begin{figure}
\includegraphics[scale=0.5]{figure.png}
\caption{图片}
\label{fig:mypicture}
\end{figure}
将\centering
移到外面即可。
总之,记下一句名言:
永远不要在\begin{}
和\end{}
里面使用\centering
。
下一篇: 用程序处理报表参数