我想在文档中添加一些 TIFF 格式的插图。但它们有三个功能,我不知道如何实现:
- 它们填满整个页面,忽略边距。
- 它们出现在章节标题之前的页面上。如果这很难实现,我可以手动放置它们。
- 如果插图的高宽比与页面(A4)的高宽比不匹配,则应裁剪最长的尺寸。
例如:
. . ._._._._._. . .
. | | .
. | | .
. x | | x .
. | | .
. | | .
. . |_._._._._| . .
- 点代表图形。
- 线条代表页面尺寸。
- “x” 是图形被裁剪的地方,因为它比页面宽。
页面布局如下:
_________ _________
|#########| |
|#########| === |
|#########| ======= |
|#########| ======= |
|#########| ======= |
|#########|____2____|
我如何以这种方式向我的文档中添加图形?
答案1
这是一个几乎可以满足您要求的解决方案。警告:前面的代码很丑陋。
% pretty dummy graphics
\useMPlibrary
[dum]
% fake text
\usemodule
[visual]
\setuppagenumbering
[alternative=doublesided]
\setupbackgrounds
[page]
[background=chapterimages]
\definelayer
[chapterimages]
\setuphead
[chapter]
[before=\setups{s:chapter}]
\newcount\ImageCounter
\definemakeup [chapterimages] [page=left]
\startsetups s:chapter
\startmakeup [chapterimages]
\global\advance\ImageCounter1
% compute the aspect ratio of the paper and the graphic
\start
\ifcase\ImageCounter
\or
\setbox\scratchbox\vbox{\externalfigure[cow]}
\or
\setbox\scratchbox\vbox{\externalfigure[mill]}
\else
\setbox\scratchbox\vbox{\externalfigure[dummy]}
\fi
\newdimen\imgWidth
\newdimen\imgHeight
\imgWidth=\wd\scratchbox
\imgHeight=\ht\scratchbox
\newdimen\aspectPaper
\newdimen\aspectImg
\aspectPaper=\paperwidth
\aspectImg=\imgWidth
\divide\aspectPaper\paperheight
\divide\aspectImg\imgHeight
\stop
\ifdim\aspectImg>\aspectPaper
\defineexternalfigure [chapter] [width=\paperwidth]
\else
\defineexternalfigure [chapter] [height=\paperheight]
\fi
% include the right image corresponding to the chapter
\ifcase\ImageCounter
\or
\setlayer [chapterimages] {\externalfigure[cow][chapter]}
\or
\setlayer [chapterimages] {\externalfigure[mill][chapter]}
\else
\setlayer [chapterimages] {\externalfigure[dummy][chapter]}
\fi
\stopmakeup
\stopsetups
这是用于测试的简短示例文档。
\starttext
\startchapter [title=First Chapter]
\startsection [title=Some section]
\fakewords{500}{1000}
\stopsection
\stopchapter
\startchapter [title=Second Chapter]
\startsection [title=Some other section]
\fakewords{500}{1000}
\stopsection
\stopchapter
\startchapter [title=Third Chapter]
\startsection [title=Some new section]
\fakewords{500}{1000}
\stopsection
\stopchapter
\stoptext
怎么运行的
首先,我定义一个包含章节图像的图层。然后我挂接到章节命令。该设置s:chapter
放在每个章节之前。它确保页面是左页。接下来,页眉和页脚被抑制。
接下来是一些丑陋的代码,确保整个页面都充满图形,边框被切断。我希望看到一个更干净的解决方案(Aditya 和 Phillipp,你们在听吗?)。
最后将图像包含在内。您需要为每个章节图像创建两个新条目。一个用于计算纵横比,另一个用于最终包含。不要忘记添加\or
。当您包含的图像少于章节时,其余章节将使用虚拟图形。
需要改进的地方
包含图像的代码需要在两个地方,只定义一次会更干净,也更不容易出错。
正如我之前提到的,计算整页图像的代码不是很符合 ConTeXtish,肯定可以改进。它不会像您的草图那样将图形居中。图像始终左对齐,并在右侧或底部被截断。
编辑:这是 phg 的第二个版本(见下面的评论),它具有更 ConTeXtish 的界面,并且图形只需定义一次。它使用 Lua 来比较图形尺寸,因为这在 TeX 中往往非常棘手。警告:更低级一些,但代码相当漂亮。
% macros=mkvi
% pretty dummy graphics
\useMPlibrary
[dum]
% fake text
\usemodule
[visual]
\setuppagenumbering
[alternative=doublesided]
\setupbackgrounds
[page]
[background=chapterimages]
\definelayer
[chapterimages]
\setuphead
[chapter]
[before=\setups{s:chapter}]
\definemakeup
[chapterimage]
% zero page borders for the makeup
\definelayout
[chapterimage]
[page]
\setupmakeup
[chapterimage]
[page=left]
\unprotect
\newcount\image_counter
\newdimen\image_ht
\newdimen\image_wd
\def\defineimagelist{\dodoubleempty\do_define_image_list}
\def\do_define_image_list[#structurename][#lst]{%
\edef\current_structure{#structurename}%
\scratchcounter\zerocount
\ifsecondargument
\processcommalist[#lst]\define_structure_image
\fi%
}
\def\define_structure_image#img{%
\advance\scratchcounter\plusone
\expandafter\def
\csname\current_structure _image_\the\scratchcounter\endcsname{%
\externalfigure[#img]%
}%
}
\unexpanded\def\pickimage{\dosingleempty\do_pick_image}
\def\do_pick_image[#structurename]{%
\global\advance\image_counter\plusone
\ifcsname#{structurename}_image_\the\image_counter\endcsname
\expandafter\let\expandafter%
\current_structure_image\csname#{structurename}_image_\the\image_counter\endcsname
\else
\let\current_structure_image\structure_image_dummy
\fi%
\setbox\scratchbox\vbox{\current_structure_image}%
\image_ht\ht\scratchbox
\image_wd\wd\scratchbox
\ctxcommand{test_image_dimensions()}
{\current_structure_image[width=\paperwidth]}
{\current_structure_image[height=\paperheight]}%
}
\def\structure_image_dummy{\externalfigure[dummy]}%
%% Since \externalfigure[foo][factor=max] doesn't work anymore, we'll
%% have to bypass TEX's inadequate integer arithmetic through Lua.
\startluacode
local td = tex.dimen
commands.test_image_dimensions = function ()
local pht, pwd = td.paperheight, td.paperwidth
local iht, iwd = td.image_ht, td.image_wd
local result = iht / iwd > pht / pwd
commands.doifelse(result)
end
\stopluacode
\protect
\startsetups s:chapter
\startmakeup [chapterimage]
\pickimage [chapter]
\stopmakeup
\stopsetups
这里再次显示了示例文档,它与上面的示例相同,只是它包含一个用户界面来设置用于章节页面的图形。
\starttext
\defineimagelist
[chapter]
[cow, mill, dummy]
\startchapter [title=First Chapter]
\startsection [title=Some section]
\fakewords{500}{1000}
\stopsection
\stopchapter
\startchapter [title=Second Chapter]
\startsection [title=Some other section]
\fakewords{500}{1000}
\stopsection
\stopchapter
\startchapter [title=Third Chapter]
\startsection [title=Some new section]
\fakewords{500}{1000}
\stopsection
\stopchapter
\stoptext
结果与上面的屏幕截图相同。代码的所有功劳都归于 phg,所有错误都是我的 :)
由于mkvi
语法的原因,代码应该是不言自明的。它基本上所做的就是创建一个以章节级别(此处为“章节”)命名的宏列表,以及一个随每个图像递增的数字。这些宏使用 排版图像\externalfigure
。其余部分与第一个代码类似。