欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

一篇短文让你明白LaTeX的引用

程序员文章站 2022-03-09 13:26:49
...

今天写篇关于LaTeX\LaTeX的小短文——到底该如何进行内容“引用”。虽然本文重点介绍图片的引用,但是看完本文后,你不仅会使用本文思想对任意LaTeX\LaTeX对象进行引用(\ref)操作,还会了解LaTeX\LaTeX的解析原理。


如下代码,我准备引用一张图片:

% 导入宏包
\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