管理图书数量

管理图书数量

我想同时编纂一系列书籍。这将:

  • 保证编译的所有内容都一致。
  • 轻松实现书籍之间的交叉引用。
  • 允许将一本书中的计数器方便地带到下一本书中。

使用book文档类别,可以分配部分、章节和节。有没有办法分配卷?例如:

\book{This is the book's title}
    \part{This is the part's title}
        \chapter{This is the chapter's title}
\book{This is the second book's title}

答案1

使用回忆录文档类别你有一个新的“部门单位”\book可以满足您的目的。请参阅文档的第 6 章,特别是部分6.2 部门划分6.3 编号, 和6.4 书籍和章节标题

答案2

无需一次性编译所有书籍:该xr软件包可轻松实现书籍之间的交叉引用,并可方便地将一本书中的计数器转移到下一本书。使用hyperref,不同书籍之间的链接将起作用。

答案3

我使用 pdftk 和下面显示的 perl 脚本来执行此操作。这种方法的一个优点是您可以在每卷中重现某些内容。例如,我对各卷的页面进行了按顺序编号,并在所有卷中重现了一个索引和目录。这样,如果您有第 2 卷,您可以在索引中查找某些内容并发现它在第 1 卷的第 37 页上。

如果您希望将材料(例如快速参考页)放在印刷书籍的最后一页,也有相应的机制。通常,印刷书籍的页数是 8 的倍数,因此您需要添加空白页,以使材料放在最后一页内页上。

它读取你的 .ref 文件(这里假设为 save.ref)来查找用于标记章节开始或结束的标签。这样你就不必手动更新分割点的页码了。

#!/usr/bin/perl

use strict;

my $input_file = $ARGV[0];
my $vol = $ARGV[1];
my $output_file = $ARGV[2];


# reads save.ref and splits.config
#
# format of splits.config:
#    v1,v2,label1,offset1,label2,offset2,mod8
#    (v1,v2)=(1,1) means only include these pages in volume 1
#    (v1,v2)=(2,2) means only include these pages in volume 2
#    (v1,v2)=(1,2) means include these pages in both volumes
#    label1=latex label of beginning of range, or null
#    offset1=offset from label1; if label1 is null string and offset is +, then take offset1 as page number; if label1 is 'end' and offset is '', take last page
#    label2,offset2=similar for end of range
#    mod8=if not null, force it to start on a page of the output pdf that equals this, modulo 8
#      You typically want the output pdf to have a number of pages that is a multiple of 8. So, e.g., if LM has three pages of data, etc., at the end,
#      set mod8 to 5, so that the third page will equal 7 mod 8.

my %refs = ();
open(F,"<save.ref") or die "error opening save.ref for input";
while (my $line = <F>) {
  chomp $line;
  if ($line =~ /([^,]*),([^,]*),([^,]*)/) {
    my ($label,$name,$page) = ($1,$2,$3);
    $refs{$label} = $page;
  }
}
close(F);

open(F,"<splits.config") or die "error opening splits.config for input";
my @pages = ();
my $n = 0;
while (my $line = <F>) {
  chomp $line;
  if ($line =~ /([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*)/) {
    my ($v1,$v2,$l1,$o1,$l2,$o2,$m) = ($1,$2,$3,$4,$5,$6,$7);
    my $p1 = find_page($l1,$o1);
    my $p2 = find_page($l2,$o2);
    #print "pages $p1-$p2\n";
    my $chunk = 0;
    if ($vol>=$v1 && $vol<=$v2) {
      if ($p1%2 != 1) {push @pages,"B1"; ++$chunk}
      if ($m ne '') {
        while (($n+$chunk)%8!=$m) {push @pages,"B1"; ++$chunk}
      }
      push @pages,"$p1-$p2";
      if ($p2 ne 'end') {
        $chunk += (($p2-$p1)+1);
        if ($chunk%2!=0) {push @pages,"B1"; ++$chunk}
      }
      print "input $p1-$p2 -> output ",($n+1),"-",($p2 eq 'end' ? 'end' : $n+$chunk),"\n";
      $n += $chunk;
    }
  }
}
close(F);

my $c = "pdftk $input_file B=../share/misc/blank_page.pdf  cat ".join(' ',@pages)." output $output_file";
print "$c\n";
system $c;

sub find_page {
  my $l = shift;
  my $o = shift;
  if ($l eq '') {return $o}
  if ($l eq 'end') {return 'end'}
  if (!exists $refs{$l}) {die "label $l doesn't exist in save.ref"}
  return $refs{$l}+$o;
}

sub barf {
  my $message = shift;
  print STDERR "splits.pl: $message\n";
  print STDERR "You will need to edit splits.config.\n";
  exit(-1);
}

答案4

保证所有内容编译一致

避免冗余,您将获得一致的文档。如果您两次定义相同的属性或样式(例如颜色、长度、缩写等),请仔细检查您的文件。

将所有相互元素移至专用环境文件并将其包含在您的书中。您可以在ConTeXt wiki - 项目结构ConTeXt 杂志 #1101. 内容文件不包含任何样式信息,并且各个卷之间共享的样式信息导致一致性。

轻松实现书籍之间的交叉引用

默认情况下支持交叉引用。您可以使用 来添加引用filename::,也可以使用更通用的命令 \useexternaldocument。例如:

% file: crossref.tex
\useexternaldocument [introduction] [intro.tex]
\starttext
    Here comes a reference to the intro:
    \in{chapter}[intro::sec:intro] on \at{page}[intro::sec:intro]

    Or, more generic, using useexternaldocument:
    \in{chapter}[introduction::sec:intro] on \at{page}[introduction::sec:intro]
\stoptext

% file: intro.tex
\starttext
    \null\page
    \startchapter [title=Intro, reference=sec:intro]
    \stopchapter
\stoptext

以下是该文件的截图crossref.tex

crossref

请记住使用双冒号进行交叉引用,而不是使用单个冒号进行文档内引用的更常见变体。

允许将一本书中的计数器方便地带到下一本书中

我不认为这是原生支持的。但你可以滥用引用机制,因为它支持计数和跨文档访问。当然,你可以再次自由使用该\useexternaldocument功能。示例:

% file: savecounter.tex
\starttext
    Here I store a number that can be obtained in the
        other file:
    \reference [mycount] {42}
\stoptext

% file: crosscounter.tex
\useexternaldocument [cross] [savecounter.tex]
\starttext
    And here is the number from the savecounter file:
    \getreference [text] [savecounter::mycount]

    Using the useexternaldocument mechanism:
    \getreference [text] [cross::mycount]
\stoptext

以下是该文件的截图crosscounter.tex

交叉计数器

由于引用机制保存了比我们需要的更多信息,我们在包含的括号中提供了一个参数text,它检索之前保存的值作为\reference命令的第二个参数。

再次强调:记住跨文档引用时使用双冒号。

如果您愿意,您可以创建一个接口来定义、更改和检索计数器。低级命令在文档中看起来相当丑陋,甚至在语义上是错误的。

相关内容