Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

BibTeX' automatischer Zeilenumbruch nach 80 Zeichen zerstört LaTeX-Kommando

198 views
Skip to first unread message

Thomas Weise

unread,
Jun 18, 2009, 12:47:15 AM6/18/09
to
Hallo.

Ich habe folgendes Problem: Mein BibTeX-bib-File enthält folgenden
Eintrag
(entscheidender Punkt: Länge des url-Teils; url-Teil wird (später)
_nicht_ durch
bst in url-Kommando gepackt)

============= Minimalbeispiel bib =========================
@inproceedings{KABK1996UADFAAOACD,
title = {{U}se of {A}utomatically {D}efined {F}unctions and
{A}rchitecture-{A}ltering {O}perations in {A}utomated {C}ircuit {S}
ynthesis {U}sing {G}enetic {P}rogramming},
author = {John R. {Koza} and David {Andre} and Forrest H.
{Bennett III} and Martin A. {Keane}},
booktitle = {{P}roceedings of the {F}irst {A}nnual {C}onference
{G}enetic {P}rogramming ({GP}-96)},
year = {1996},
pages = {132--149},
url = {\url{http://citeseer.ist.psu.edu/119355.html}, \url
{http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.51.3933}
{\lastandname} \url{https://eprints.kfupm.edu.sa/74269/1/74269.pdf}
\accessed{2009-06-16}},
}
============= Ende Minimalbeispiel bib ====================

Besser gesagt, es hat viele Einträge dieser Art, die alle prima
funktionieren
und mit meinem spezialisierten bst-Style problemlos zusammenarbeiten.
Das Problem hat auch nicht wirklich was mit dem Inhalt des Eintrags an
sich zu tun, als mit seiner Länge: BibTeX produziert nämlich
folgendes .bbl-File:

============= Auszug bbl ====================
....
\newblock {\fullyavailablename}~\url{http://citeseer.ist.psu.edu/
119355.html},
\url{http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.51.3933}
{\lasta%
ndname} \url{https://eprints.kfupm.edu.sa/74269/1/74269.pdf}
\accessed{2009-06-16}.
....
============= Ende Auszug bbl ===============

Wie man sehen kann, fügt BibTeX nach maximal 80 Zeichen
einen Zeilenumbruch ein, den es mit % sichert. Leider landet
dies mitten in dem {\lastandname}-Kommando und führt dann
dazu, dass LaTeX sich weigert, das Dokument zu kompilieren.
(Das LaTeX-Minimalbeispiel schenke ich mir hier mal).

Gibt es eine Möglichkeit, dem BibTeX das mit den
Zeilenumbrüchen auszureden? Mein bib-File wird automatisch
generiert, es bringt also nichts, das von Hand zu bearbeiten.
Alternativ könnte ich einen Post-Prozessor machen, der
die BibTeX-Zeilenumbrüche wieder rausmacht, aber vorher
wollte ich lieber fragen :-)

Danke,
Thomas.

Ulrike Fischer

unread,
Jun 18, 2009, 3:04:59 AM6/18/09
to
Am Wed, 17 Jun 2009 21:47:15 -0700 (PDT) schrieb Thomas Weise:


> Wie man sehen kann, f�gt BibTeX nach maximal 80 Zeichen


> einen Zeilenumbruch ein, den es mit % sichert. Leider landet

> dies mitten in dem {\lastandname}-Kommando und f�hrt dann


> dazu, dass LaTeX sich weigert, das Dokument zu kompilieren.

Eigentlich sollte url oder hyperref das reparieren.

http://www.tex.ac.uk/cgi-bin/texfaq2html?label=citeURL
(Ganz am Ende).

> (Das LaTeX-Minimalbeispiel schenke ich mir hier mal).

Dann schenke ich mir mal das Testen.

--
Ulrike Fischer

Thomas Weise

unread,
Jun 18, 2009, 3:29:18 AM6/18/09
to
> Eigentlich sollte url oder hyperref das reparieren.
Können sie nicht, da der split nicht in einer URL auftritt:
BibTeX macht aus

blablabla{\lastandname}blablabla

im in irgendeinem Feld im bib-File (von mir aus auch in note)

langerTextMitVielBlablabla{\lastan%
dname}blablabla

Da hat kein Package eine Chance gegen. Aber ist nicht
weiter wild, mit einem trivialen Programm kann man diese
newlines wieder wegzaubern. Das ist zwar keine schöne
Lösung, aber sie geht. Deshalb wollte ich fragen, ob BibTeX
vielleicht einen (in --help nicht dokumentierten) Parameter
hat, wo man das mit den 80 Zeichen ausschalten kann,
oder ob man das vielleicht im bst-File festlegen kann
(wobei aber entry.max$ und global.max$ scheinbar
für was anderes gut sind).

Aktuelle Lösung: Postprozessor wie folgt (Kommandozeilen-
Parameter = Pfad des bbl-Files


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;

/**
* The main class of the newline remover: BibTeX has the habit to cut
off
* lines after 80 characters and, if no spaces are close enought,
doing
* this by force by placing a '%' at the line end. This tends to mess
up
* if the new line end happens to occur inside a LaTeX command.
Therefore,
* with this trivial tool, all such line breaks are removed again so a
* subsequent LaTeX run will work.
*/
public class Main {

/**
* The main routine
* @param params
* the parameters of the main program
*/
public static final void main(final String[] params) {
String src;
File f1, f2;
BufferedReader r1;
BufferedWriter r2;
String s;
int i;
boolean lwnl;

if ((params == null) || (params.length < 1))
return;
src = params[0];
if (src == null)
return;
src = src.trim();
if (src.length() < 1)
return;

try {
f1 = new File(src).getCanonicalFile();
f2 = new File(src + ".tmp").getCanonicalFile(); //$NON-NLS-1$

r1 = new BufferedReader(new FileReader(f1));
try {
r2 = new BufferedWriter(new FileWriter(f2));
try {
lwnl = true;

while ((s = r1.readLine()) != null) {
i = s.length();
if ((i > 0) && (s.charAt(i - 1) == '%')) {
r2.write(s.substring(0, i - 1));
lwnl = false;
} else {
r2.write(s);
r2.newLine();
lwnl = true;
}
}

if (!lwnl)
r2.newLine();

} finally {
r2.close();
}
} finally {
r1.close();
}

f1.delete();
f2.renameTo(f1);

} catch (Throwable t) {
t.printStackTrace();
}
}
}

Thomas Weise

unread,
Jun 18, 2009, 3:31:41 AM6/18/09
to
Sorry, kleiner Schreibfehler: Der Anfang des letzten Posts sollte
lauten:

Können sie nicht, da der split nicht in einer URL auftritt:
BibTeX macht aus

langerTextMitVielBlablabla{\lastandname}blablabla

Ulrike Fischer

unread,
Jun 18, 2009, 3:42:25 AM6/18/09
to
Am Thu, 18 Jun 2009 00:29:18 -0700 (PDT) schrieb Thomas Weise:

>> Eigentlich sollte url oder hyperref das reparieren.

> K�nnen sie nicht, da der split nicht in einer URL auftritt:


> BibTeX macht aus
>
> blablabla{\lastandname}blablabla
>
> im in irgendeinem Feld im bib-File (von mir aus auch in note)
>
> langerTextMitVielBlablabla{\lastan%
> dname}blablabla
>
> Da hat kein Package eine Chance gegen.

Das hatte ich nicht genau gelesen. Aber wenn dein bib-automatisch
generiert wird, kann es dann nicht auch automatisch *vor* diesen
Befehlen wie \lastandname Zeilenumbr�che einf�gen?
%
{\lastandname} und weiter ....

--
Ulrike Fischer

Thomas Weise

unread,
Jun 18, 2009, 3:57:12 AM6/18/09
to
> Aber wenn dein bib-automatisch generiert wird, kann es dann nicht
> auch automatisch *vor* diesen Befehlen wie \lastandname
> Zeilenumbrüche einfügen?
Das wäre eine weitere Option, wobei diese auch nur ein wenig
eleganter ist, als das Post-Processing. Das grundlegende Problem
ist meiner Meinung nach, dass BibTeX diese Umbrüche automatisch
reinmacht, ohne zu prüfen, ob sie mitten in einem Kommando oder
einem Parameter eines Kommandos auftreten.

Im Moment bleibe ich erstmal beim Post-Prozessor, weil mein
bib-File-Generator die Zeilen teilweise in Häppchen schreibt.
Dadurch kann ich nicht so einfach die Zeichen zählen und
müsste dann vor jedem Befehl immer einen Zeilenumbruch
machen, wodurch das bib-File dann recht häßlich aussieht,
oder mich sehr arg verrenken um doch zu zählen und irgendwie
zu versuchen, nur Umbrüche zu setzen wo notwendig.

Am besten wäre es, wenn ich dem BibTeX sagen könnte,
es soll keine Umbrüche machen. Ich vermute, dass diese
sowieso nur der Ästethik des bbl-Files dienen (und da
ist mir ein hübsches bib-File wichtiger).

Thomas.

Ulrike Fischer

unread,
Jun 18, 2009, 5:51:17 AM6/18/09
to
Am Thu, 18 Jun 2009 00:57:12 -0700 (PDT) schrieb Thomas Weise:

>> Aber wenn dein bib-automatisch generiert wird, kann es dann nicht
>> auch automatisch *vor* diesen Befehlen wie \lastandname

>> Zeilenumbr�che einf�gen?
> Das w�re eine weitere Option, wobei diese auch nur ein wenig


> eleganter ist, als das Post-Processing. Das grundlegende Problem

> ist meiner Meinung nach, dass BibTeX diese Umbr�che automatisch
> reinmacht, ohne zu pr�fen, ob sie mitten in einem Kommando oder


> einem Parameter eines Kommandos auftreten.


Eine weitere M�glichkeit w�re den Befehl als
\csname lastname\endcsname zu schreiben. Da w�re der Zeilenumbruch
harmlos.


--
Ulrike Fischer

Thomas Weise

unread,
Jun 18, 2009, 6:13:32 AM6/18/09
to
> Eine weitere Möglichkeit wäre den Befehl als
> \csname lastname\endcsname zu schreiben. Da wäre der Zeilenumbruch
> harmlos.
Es sei denn, er tritt dann als
\csna%
me
auf :-(

Trotzdem Danke,
Thomas.

Ulrike Fischer

unread,
Jun 18, 2009, 6:22:01 AM6/18/09
to
Am Thu, 18 Jun 2009 03:13:32 -0700 (PDT) schrieb Thomas Weise:

>> Eine weitere M�glichkeit w�re den Befehl als
>> \csname lastname\endcsname zu schreiben. Da w�re der Zeilenumbruch


>> harmlos.
> Es sei denn, er tritt dann als
> \csna%
> me
> auf :-(

Stimmt. ;-)

--
Ulrike Fischer

0 new messages