/*
* TODO in future work:
*
- * - the index should not refer to the contents, if an indexable
- * term crops up in a section title!
- *
- * - include the version IDs.
- *
* - linearised PDF, perhaps?
*
- * - compression of output files. For the actual text display,
- * both output formats currently average about 50-60 characters
- * per 5-6 character word of text, and almost all of it's the
- * same.
- * * In PS, we can define custom text operators to make things
- * more efficient.
- * * In PDF, there already are!
+ * - we should use PDFDocEncoding or Unicode for outline strings,
+ * now that I actually know how to do them. Probably easiest if
+ * I do this _after_ bringing in libcharset, since I can simply
+ * supply PDFDocEncoding in there.
*
* - I'm uncertain of whether I need to include a ToUnicode CMap
* in each of my font definitions in PDF. Currently things (by
* * a hyphen in a word by itself might prefer to be an en-dash
* * (Americans might even want a convenient way to use an
* em-dash)
+ * * DON'T DO ANY OF THE ABOVE WITHIN \c OR \cw!
* * substituting `minus' for `hyphen' in the standard encoding
* is probably preferable in Courier, though certainly not in
* the main text font
for (page = pages; page; page = page->next) {
sprintf(buf, "%d", ++pagenum);
- page->number = ufroma_dup(buf);
+ page->number = ufroma_dup(buf, CS_ASCII);
}
if (has_index) {
/* And don't forget the as-yet-uncreated index. */
sprintf(buf, "%d", ++pagenum);
- first_index_page->number = ufroma_dup(buf);
+ first_index_page->number = ufroma_dup(buf, CS_ASCII);
}
}
paper_idx *pi = (paper_idx *)entry->backend_data;
para_data *text, *pages;
+ if (!pi->words)
+ continue;
+
text = make_para_data(para_Normal, 0, 0,
conf->base_width - conf->index_colwidth,
NULL, NULL, entry->text, conf);
for (page = ipages->next; page; page = page->next) {
char buf[40];
sprintf(buf, "%d", ++pagenum);
- page->number = ufroma_dup(buf);
+ page->number = ufroma_dup(buf, CS_ASCII);
}
/*
}
static void add_string_to_page(page_data *page, int x, int y,
- font_encoding *fe, int size, char *text)
+ font_encoding *fe, int size, char *text,
+ int width)
{
text_fragment *frag;
frag->fe = fe;
frag->fontsize = size;
frag->text = dupstr(text);
+ frag->width = width;
}
/*
while (*str) {
glyph = font->bmp[*str];
- if (glyph == 0xFFFF)
+ if (glyph == 0xFFFF) {
+ str++;
continue; /* nothing more we can do here */
+ }
/*
* Find which subfont this character is going in.
if (!subfont || sf != subfont) {
if (subfont) {
text[textpos] = '\0';
- add_string_to_page(page, x, y, subfont, fontsize, text);
+ add_string_to_page(page, x, y, subfont, fontsize, text,
+ textwid);
x += textwid;
} else {
assert(textpos == 0);
if (textpos > 0) {
text[textpos] = '\0';
- add_string_to_page(page, x, y, subfont, fontsize, text);
+ add_string_to_page(page, x, y, subfont, fontsize, text, textwid);
x += textwid;
}
if (text->type == word_HyperLink) {
dest.type = URL;
- dest.url = utoa_dup(text->text);
+ dest.url = utoa_dup(text->text, CS_ASCII);
dest.page = NULL;
} else if (text->type == word_PageXref) {
dest.type = PAGE;
* referenced by an index entry.
*/
case word_IndexRef:
- {
+ /*
+ * We don't create index references in contents entries.
+ */
+ if (!pdata->contents_entry) {
indextag *tag;
int i;
wid = paper_width_simple(pdata, w);
sfree(w);
- render_string(pdata->last->page,
- pdata->fonts[FONT_NORMAL],
- pdata->sizes[FONT_NORMAL],
- conf->paper_width - conf->right_margin - wid,
- (conf->paper_height - conf->top_margin -
- pdata->last->ypos), num);
-
for (x = 0; x < conf->base_width; x += conf->leader_separation)
if (x - conf->leader_separation > last_x - conf->left_margin &&
x + conf->leader_separation < conf->base_width - wid)
conf->left_margin + x,
(conf->paper_height - conf->top_margin -
pdata->last->ypos), L".");
+
+ render_string(pdata->last->page,
+ pdata->fonts[FONT_NORMAL],
+ pdata->sizes[FONT_NORMAL],
+ conf->paper_width - conf->right_margin - wid,
+ (conf->paper_height - conf->top_margin -
+ pdata->last->ypos), num);
}
/*