如何在不使用包的情况下将图片(例如 eps)包含在纯 TeX 中?所有其他问题(例如这个) 实际上并没有回答如何在纯 TeX 中包含图像的问题。相反,它们会告诉您\input
一个巨大的宏包,它会神秘地为您完成此操作。我想了解这些包实际上做了什么。
答案1
将图形插入 TeX 文档包括两个部分:
- 确保从 TeX 的角度来看,空间被正确允许
- 告诉驱动程序(通过适当
\special
或相关的引擎相关原语)将图像实际放置在输出中
该过程的某些部分与驱动程序无关,但最低级别的东西当然依赖于驱动程序。
要“留出空间”,您首先需要确定图像的大小,可以是自然大小,也可以是任何用户设置。后者当然很容易,因为它不需要访问图像文件,但前者更常见。所需的路线取决于驱动程序/图形类型。例如,对于文件,.eps
可以安排在 TeX 中逐行解析文件并选取行BoundingBox
。对于诸如 之类的二进制格式.png
,需要引擎支持。例如,可以使用适当的原语将它们包含在一个框中,然后测量该框来测量此类图像。
一旦知道了图像的尺寸(可能包括缩放,ETC。(同样以驱动程序相关的方式处理)可以使用适当的原语插入图像。然后必须调整 TeX 视点的“当前”位置,使其与图像的外观相匹配。请记住,图像可以延伸到图像边界框之外,因此它仍然可以与文本重叠(如果没有被剪裁)。
请注意,最方便的做法通常是将图像插入任意大小的框中,然后调整其周围的“TeX 视图”以根据需要留出空间,而不是包含驱动程序为其提供的任何大小的图像。(这对于某些驱动程序比其他驱动程序更重要,但在通常的设置中,graphics
目的是共享代码路径,以便所有驱动程序都以相同的方式处理。)
.eps
以使用驱动程序包含文件的具体示例为例dvips
,其中的\special
行dvips.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/ graphics
LaTeX 包进行图像插入通常比编写自己的代码更容易。当然,可以阅读该代码以获取所需算法的详细信息。