如何在 TeX 中包含图形?

如何在 TeX 中包含图形?

如何在不使用包的情况下将图片(例如 eps)包含在纯 TeX 中?所有其他问题(例如这个) 实际上并没有回答如何在纯 TeX 中包含图像的问题。相反,它们会告诉您\input一个巨大的宏包,它会神秘地为您完成此操作。我想了解这些包实际上做了什么。

答案1

将图形插入 TeX 文档包括两个部分:

  • 确保从 TeX 的角度来看,空间被正确允许
  • 告诉驱动程序(通过适当\special或相关的引擎相关原语)将图像实际放置在输出中

该过程的某些部分与驱动程序无关,但最低级别的东西当然依赖于驱动程序。

要“留出空间”,您首先需要确定图像的大小,可以是自然大小,也可以是任何用户设置。后者当然很容易,因为它不需要访问图像文件,但前者更常见。所需的路线取决于驱动程序/图形类型。例如,对于文件,.eps可以安排在 TeX 中逐行解析文件并选取行BoundingBox。对于诸如 之类的二进制格式.png,需要引擎支持。例如,可以使用适当的原语将它们包含在一个框中,然后测量该框来测量此类图像。

一旦知道了图像的尺寸(可能包括缩放,ETC。(同样以驱动程序相关的方式处理)可以使用适当的原语插入图像。然后必须调整 TeX 视点的“当前”位置,使其与图像的外观相匹配。请记住,图像可以延伸到图像边界框之外,因此它仍然可以与文本重叠(如果没有被剪裁)。

请注意,最方便的做法通常是将图像插入任意大小的框中,然后调整其周围的“TeX 视图”以根据需要留出空间,而不是包含驱动程序为其提供的任何大小的图像。(这对于某些驱动程序比其他驱动程序更重要,但在通常的设置中,graphics目的是共享代码路径,以便所有驱动程序都以相同的方式处理。)


.eps以使用驱动程序包含文件的具体示例为例dvips,其中的\specialdvips.def读取

\special{PSfile="#1"\space
      llx=\Gin@llx\space
      lly=\Gin@lly\space
      urx=\Gin@urx\space
      ury=\Gin@ury\space
      \ifx\Gin@scalex\@tempa\else rwi=\number\dimen@\space\fi
      \ifx\Gin@scaley\@tempa\else rhi=\number\@tempdima\space\fi
      \ifGin@clip clip\fi}%

您在这里可以看到(由 覆盖texdoc dvips)实际包含图形的命令是PSfile="<name>"。其他设置包括要使用的下/上/左/右坐标(通常会完全包围图像,但如果使用视口则可能不会),比例因子X(如果比例为 1,则不包含该值),并且clip如果合适,还可以包含关键字。

每个驱动程序都需要在此处检查其语法:例如,dvipdfmx可以在此处使用相同的语法(尽管它有用于 PDF 包含的替代语法),而直接 PDF 输出需要\pdfimage使用 pdfTeX(当然不能使用.eps通过转换为 PDF 来处理的文件)。


从 TeX 的角度来看,包含代码的核心部分(再次引用自graphics)是

\def\Gin@setfile#1#2#3{%
  \ifx\\#2\\\Gread@false\fi
  \ifGin@bbox\else
    \ifGread@
      \csname Gread@%
         \expandafter\ifx\csname Gread@#1\endcsname\relax
           eps%
         \else
           #1%
         \fi
      \endcsname{\Gin@base#2}%
    \else
      \Gin@nosize{#3}%
    \fi
  \fi
  \Gin@viewport@code
  \Gin@nat@height\Gin@ury bp%
  \advance\Gin@nat@height-\Gin@lly bp%
  \Gin@nat@width\Gin@urx bp%
  \advance\Gin@nat@width-\Gin@llx bp%
  \Gin@req@sizes
  \expandafter\ifx\csname Ginclude@#1\endcsname\relax
    \Gin@drafttrue
    \expandafter\ifx\csname Gread@#1\endcsname\relax
      \@latex@error{Can not include graphics of type: #1}\@ehc
      \global\expandafter\let\csname Gread@#1\endcsname\@empty
    \fi
  \fi
  \leavevmode
  \ifGin@draft
      \hb@xt@\Gin@req@width{%
        \vrule\hss
        \vbox to \Gin@req@height{%
           \hrule \@width \Gin@req@width
           \vss
           \edef\@tempa{#3}%
           \rlap{ \ttfamily\expandafter\strip@prefix\meaning\@tempa}%
           \vss
           \hrule}%
        \hss\vrule}%
  \else
    \@addtofilelist{#3}%
    \ProvidesFile{#3}[Graphic file (type #1)]%
    \setbox\z@\hbox{\csname Ginclude@#1\endcsname{#3}}%
    \dp\z@\z@
    \ht\z@\Gin@req@height
    \wd\z@\Gin@req@width
  \box\z@
  \fi}

您将看到基本流程是“查找大小”、“设置一些尺寸”(一些用于在草稿模式下跳过包含的代码)、设置一个包含图像的框,包括所需大小的框。早期的代码会选择文件类型,以便使用正确的读取/包含方法。


当然,所有这些都可以“手写”出来,但测量有点繁琐。同时,跟踪驱动程序类型通常并不方便。因此,使用graphics.tex纯 TeX/ graphicsLaTeX 包进行图像插入通常比编写自己的代码更容易。当然,可以阅读该代码以获取所需算法的详细信息。

相关内容