[l2h] mnemonic anchors
Julius Smith
jos at w3k.org
Sun Sep 28 19:08:30 CEST 2003
At 02:45 PM 9/23/2003 +0200, Jens Lehmann wrote:
>The next problem is that subsections (and below) have anchors which are
>not safe for updates, for instance <A
>NAME="SECTION000420000000000000000">. I would like to have the headings of
>the subsections and subsubsections as anchor names. I'm aware that this
>causes trouble if a heading appears more than once within one html file,
>but this is not a problem in our case. It's important that the mnemonic
>anchors are the ones which are actually used in the document (for example
>in the table of contents). How can this be achieved?
The make_section_heading() override below (which can go in
~/.latex2html-init or equivalent) makes symbolic section names using the
$LONG_TITLES code (for the filenames). However, these names are not used
in the autogenerated contents, and it was not obvious to me where else
things need to be modified. Of course I could just keep reading the code,
but in the interest of time efficiency, can someone (e.g., Ross?) give us
an outline?
Thanks,
Julius
[Place the following in ~/.latex2html-init or replace
make_section_heading() in latex2html (version latex2html-2002-2-1)]:
# The following is overridden in order to provide symbolic section names.
# $LONG_TITLES must be set to something greater than 0 (like 3 or 4).
# Created from the version in by jos
sub make_section_heading {
local($text, $level, $anchors) = @_;
local($elevel) = $level; $elevel =~ s/^(\w+)\s.*$/$1/;
local($section_tag) = join('', @curr_sec_id);
local($align,$pre_anchors);
local($sectiontag) = "SECTION$section_tag";
# separate any invisible anchors or alignment, if this has not already
been done
if (!($anchors)){ ($anchors,$text) = &extract_anchors($text) }
else {
$anchors =~ s/(ALIGN=\"\w*\")/$align = " $1";''/e;
$align = '' if ($HTML_VERSION < 2.2);
$anchors = &translate_commands($anchors) if ($anchors =~ /\\/);
}
# strip off remains of bracketings
$text =~ s/$OP\d+$CP//g;
if (!($text)) {
# anchor to a single `.' only
$text = "<A NAME=\"$sectiontag\">.</A>$anchors\n";
} else {
if ($LONG_TITLES) {
$sectiontag = &make_long_title($text);
}
if ($anchors) {
# # put anchors immediately after, except if title is too long
# if ((length($text)<60 )&&(!($align)||($align =~/left/))) {
# $text = "<A NAME=\"$sectiontag\">$text</A>\n" . $anchors;
# ...put anchors preceding the title, on a separate when
left-aligned
# } else {
$text = "<A
NAME=\"$sectiontag\">$anchor_invisible_mark</A>$anchors"
. (!($align)||($align =~ /left/i ) ? "<BR>" : "") . "\n".
$text;
# }
} elsif (!($text =~ /<A[^\w]/io)) {
# no embedded anchors, so anchor it all
$text = "<A NAME=\"$sectiontag\">\n" . $text . "</A>";
} else {
# there are embedded anchors; these cannot be nested
local ($tmp) = $text;
$tmp =~ s/<//o ; # find 1st <
if ($`) { # anchor text before the first <
# $text = "<A NAME=\"$sectiontag\">\n" . $` . "</A>\n<" . $';
$text = "<A NAME=\"$sectiontag\">\n" . $` . "</A>";
$pre_anchors = "<" . $';
if ($pre_anchors =~ /^(<A
NAME=\"[^\"]+>${anchor_invisible_mark}<\/A>\s*)+$/) {
$pre_anchors .= "\n"
} else { $text .= $pre_anchors; $pre_anchors = '' }
} else {
# $text starts with a tag
local($after,$tmp) = ($','');
if ( $after =~ /^A[^\w]/i ) {
# it is an anchor already, so need a separate line
$text = "<A
NAME=\"$sectiontag\">$anchor_invisible_mark</A><BR>\n$text";
} else {
# Is it a tag enclosing the anchor ?
$after =~ s/^(\w)*[\s|>]/$tmp = $1;''/eo;
if ($after =~ /<A.*<\/$tmp>/) {
# it encloses an anchor, so use anchor_mark + break
$text = "<A
NAME=\"$sectiontag\">$anchor_invisible_mark</A><BR>\n$text";
} else {
# take up to the anchor
$text =~ s/^(.*)<A([^\w])/"<A
NAME=\"$sectiontag\">$1<A$2"/oe;
}
}
}
}
}
"$pre_anchors\n<$level$align>$text\n<\/$elevel>";
}
More information about the latex2html
mailing list