我想同时编纂一系列书籍。这将:
- 保证编译的所有内容都一致。
- 轻松实现书籍之间的交叉引用。
- 允许将一本书中的计数器方便地带到下一本书中。
使用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
:
请记住使用双冒号进行交叉引用,而不是使用单个冒号进行文档内引用的更常见变体。
允许将一本书中的计数器方便地带到下一本书中
我不认为这是原生支持的。但你可以滥用引用机制,因为它支持计数和跨文档访问。当然,你可以再次自由使用该\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
命令的第二个参数。
再次强调:记住跨文档引用时使用双冒号。
如果您愿意,您可以创建一个接口来定义、更改和检索计数器。低级命令在文档中看起来相当丑陋,甚至在语义上是错误的。