如何在 ConTeXt 中的章节标题前添加插图?

如何在 ConTeXt 中的章节标题前添加插图?

我想在文档中添加一些 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。其余部分与第一个代码类似。

相关内容