PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fehler im Zusammenspiel von babel, csquotes und cleveref?



lockstep
26-10-2009, 19:30
Im folgenden Minimalbeispiel führt das Setzen fremdsprachiger Zitate mit Hilfe von csquotes dazu, dass die Querverweise des Paketes cleveref teilweise in der falschen Sprache gesetzt werden:


\documentclass[openany]{scrbook}

\usepackage[latin9]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[english,ngerman]{babel}

\usepackage[babel,german=guillemets]{csquotes}

\usepackage[english,ngerman]{varioref}
\usepackage[english,ngerman]{cleveref}

\begin{document}

\chapter{Das erste Kapitel}
\label{chap:erstes}

Dieser Satz ist nur ein Platzhalter.

\chapter{Das zweite Kapitel}

Zunächst ein korrekt auf deutsch gesetzter Querverweis: Siehe \vref{chap:erstes}.

Ein Zitat mit englischer Silbentrennung und deutschen Anführungszeichen: \hyphenquote{english}{This is just filler text.}

Auch der nächste Querverweis wird korrekt auf deutsch gesetzt: Siehe \vref{chap:erstes}.

Ein Zitat mit englischer Silbentrennung und englischen Anführungszeichen: \foreignquote{english}{This is just filler text.}

Der nächste Querverweis wird teils auf englisch, teils auf deutsch gesetzt: Siehe \vref{chap:erstes}.
\end{document}

Fragen an die ExpertInnen: Liegt der Fehler bei mir, da ich irgendetwas Offensichtliches übersehen habe? Wenn nein, wo sollte eine Fehlersuche ansetzen? Welches Paket wäre zu modifizieren, um korrekte Querverweise zu erzeugen?

mechanicus
26-10-2009, 20:19
Hi,

es hat den Anschein, dass mit der Anweisung foreinquote nicht auf die Originalsprache zurückgestellt wird.

Entweder du missbrauchst den Code oder nimmst die Alternative setlanguage. Beides ist implentiert :p


\documentclass[openany]{scrbook}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[english,ngerman]{babel}

\usepackage[babel,german=guillemets]{csquotes}

\usepackage[english,ngerman]{varioref}
\usepackage[english,ngerman]{cleveref}
\makeatletter
% \newcommand{\mainlanguage}{%
\renewcommand*{\foreignquote}{%
\csq@ifmmode
{\csq@err@mmode\foreignquote}
{\@ifstar\csq@@@@fquote@ii\csq@@@@fquote@i}}


\def\csq@@@@fquote@i#1{\csq@@@@quote@i{\csq@lang{# 1}}}
\def\csq@@@@fquote@ii#1{\csq@@@@quote@ii{\csq@lang {#1}}}


\long\def\csq@@@@quote@i#1#2{%
\csq@bqgroup #1\csq@oqopen@i #2\csq@qclose\selectlanguage{ngerman}}
\long\def\csq@@@@quote@ii#1#2{%
\csq@bqgroup #1\csq@iqopen@i #2\csq@qclose\selectlanguage{ngerman}}

\makeatother

\begin{document}

\chapter{Das erste Kapitel}
\label{chap:erstes}

Dieser Satz ist nur ein Platzhalter.

\chapter{Das zweite Kapitel}

Zunächst ein korrekt auf deutsch gesetzter Querverweis: Siehe \vref{chap:erstes}.

Ein Zitat mit englischer Silbentrennung und deutschen Anführungszeichen: \hyphenquote{english}{This is just filler text.}

Auch der nächste Querverweis wird korrekt auf deutsch gesetzt: Siehe \vref{chap:erstes}.

Ein Zitat mit englischer Silbentrennung und englischen Anführungszeichen: \foreignquote{english}{This is just filler text.}%\selectlanguage{ngerman}

Der nächste Querverweis wird teils auf englisch, teils auf deutsch gesetzt: Siehe \vref{chap:erstes}.
\end{document}

Gruß
Marco

lockstep
26-10-2009, 20:43
Vielen Dank für den Hack, mechanicus! Allerdings hab ich gleich ein paar Folgefragen :):

1. Das Ergänzen interner Befehle um \selectlanguage{ngerman} hilft in meinem Fall (mit ngerman als Dokument-Hauptsprache), ist aber keine allgemeine Lösung, oder?
2. In meinem ursprünglichen Beispiel wurde der letzte Querverweis gemischtsprachig gesetzt, nicht ausschließlich in Englisch. Deutet das nicht auf einen tieferliegenden Fehler hin?

lockstep

mechanicus
26-10-2009, 20:47
Hi,

im Paket selbst wird das Makro \csq@mainlang definiert. Leider habe ich es noch nicht hinbekommen, dass einzubauen. Hierfür müsste ich noch herausfinden, wie ich die Hauptsprache befehlstechnisch ermittle. Ich denke auch, dass es ein Bug ist, denn wie ich oben schrieb, wird scheinbar nicht auf die Hauptsprache zurückgeschaltet.

Gruß
Marco

lockstep
26-10-2009, 21:02
Nochmal Danke für die Mühe - ich möchte extra betonen, dass dies kein dringendes Problem ist. Wenn du die eigentliche Ursache nicht findest, würde ich einen Bug-Report an Philipp Lehman (und ev. an den Autor von cleveref) übermitteln. Mit csquotes kompatibel dürfte das Paket refstyle sein, das eine ähnliche (wenn auch nicht ganz so umfangreiche) Funktionalität wie cleveref besitzt.

lockstep

mechanicus
26-10-2009, 21:09
Hi,

das sollte allgemein Funktionieren:

\documentclass[openany]{scrbook}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[english,ngerman]{babel}

\usepackage[babel,german=guillemets]{csquotes}

\usepackage[english,ngerman]{varioref}
\usepackage[english,ngerman]{cleveref}
\makeatletter

\renewcommand*{\foreignquote}{%
\csq@ifmmode
{\csq@err@mmode\foreignquote}
{\@ifstar\csq@@@@fquote@ii\csq@@@@fquote@i}}

\def\csq@@@@fquote@i#1{\csq@@@@quote@i{\csq@lang{# 1}}}
\def\csq@@@@fquote@ii#1{\csq@@@@quote@ii{\csq@lang {#1}}}

\def\MainLanguage{ngerman}
\long\def\csq@@@@quote@i#1#2{%
\csq@bqgroup #1\csq@oqopen@i #2\csq@qclose\expandafter\selectlanguage\expandaft er{\languagename}}
\long\def\csq@@@@quote@ii#1#2{%
\csq@bqgroup #1\csq@iqopen@i #2\csq@qclose\expandafter\selectlanguage\expandaft er{\languagename}}

\makeatother

\begin{document}

\chapter{Das erste Kapitel}
\label{chap:erstes}

Dieser Satz ist nur ein Platzhalter.

\chapter{Das zweite Kapitel}

Zunächst ein korrekt auf deutsch gesetzter Querverweis: Siehe \vref{chap:erstes}.

Ein Zitat mit englischer Silbentrennung und deutschen Anführungszeichen: \hyphenquote{english}{This is just filler text.}

Auch der nächste Querverweis wird korrekt auf deutsch gesetzt: Siehe \vref{chap:erstes}.

Ein Zitat mit englischer Silbentrennung und englischen Anführungszeichen: \foreignquote{english}{This is just filler text.}%\selectlanguage{ngerman}

Der nächste Querverweis wird teils auf englisch, teils auf deutsch gesetzt: Siehe \vref{chap:erstes}.
\end{document}

Jetzt sollte die Hauptsprache gewählt werden.


Gruß
Marco

mechanicus
26-10-2009, 21:23
Hi,

Nachtrag: Bei Verwendung von KOMO oder scrbase klappt scheinbar auch:

\documentclass[openany]{scrbook}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[english,ngerman]{babel}

\usepackage[babel,german=guillemets]{csquotes}

\usepackage[english,ngerman]{varioref}
\usepackage[english,ngerman]{cleveref}
\makeatletter
\renewcommand*{\foreignquote}{%
\l@addto@macro\csq@qclose{\expandafter\selectlangu age\expandafter{\languagename}}
\csq@ifmmode
{\csq@err@mmode\foreignquote}
{\@ifstar\csq@fquote@ii\csq@fquote@i}}
\makeatother

\begin{document}

\chapter{Das erste Kapitel}
\label{chap:erstes}

Dieser Satz ist nur ein Platzhalter.

\chapter{Das zweite Kapitel}

Zunächst ein korrekt auf deutsch gesetzter Querverweis: Siehe \vref{chap:erstes}.

Ein Zitat mit englischer Silbentrennung und deutschen Anführungszeichen: \hyphenquote{english}{This is just filler text.}

Auch der nächste Querverweis wird korrekt auf deutsch gesetzt: Siehe \vref{chap:erstes}.

Ein Zitat mit englischer Silbentrennung und englischen Anführungszeichen: \foreignquote{english}{This is just filler text.}%\selectlanguage{ngerman}

Der nächste Querverweis wird teils auf englisch, teils auf deutsch gesetzt: Siehe \vref{chap:erstes}.
\end{document}

Gruß
Marco

lockstep
26-10-2009, 22:01
Danke für die beiden letzten Codeschnipsel - habe ihr Funktionieren kurz getestet, möchte sie mir jedoch morgen abend näher ansehen (auch im Vergleich mit csquotes.sty). Sieht aus wie eine Gelegenheit, sich in LaTeX-Programmierung etwas schlauer zu machen.

lockstep

lockstep
27-10-2009, 18:33
UPDATE: Der Fehler liegt nicht bei csquotes.

Wie bin ich darauf gekommen? Nachdem mir bereits in meinem ursprünglichen Minimalbeispiel die gemischtsprachige Ausgabe des letzten Querverweises seltsam vorkam, habe ich zunächst ein Wort, das im Deutschen und im Englischen unterschiedlich abgeteilt wird, an diversen Stellen meines Beispiels mittels \showhyphens überprüft. Ergebnis: Auch am Ende (beim gemischtsprachigen Querverweis) gilt die deutsche Silbentrennung. Laut babel-Dokumentation ist aber die Silbentrennung das erste, was mit den diversen in babel verfügbaren Umgebungen um- und wieder zurückgeschaltet wird.

Ein Blick in csquotes.sty zeigte mir (oder ließ mich jedenfalls vermuten), dass der \hyphenquote-Befehl letztlich mit der hyphenrules-Umgebung, der \foreignquote-Befehl mit der otherlanguage*-Umgebung arbeitet. Somit war der nächste Schritt klar: Ein paar Sätze in diese Umgebungen packen (und der Vollständigkeit halber auch in otherlanguage), csquotes aus dem Minimalbeispiel hinauswerfen und schauen, was passiert.



\documentclass[openany]{scrbook}

\usepackage[latin9]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[english,ngerman]{babel}

\usepackage[english,ngerman]{varioref}
\usepackage[english,ngerman]{cleveref}

\begin{document}

\chapter{Das erste Kapitel}
\label{chap:erstes}

Dieser Satz ist nur ein Platzhalter.

\chapter{Das zweite Kapitel}

Zunächst ein korrekt auf deutsch gesetzter Querverweis: Siehe \vref{chap:erstes}.

Ein Satz in einer \{hyphenrules\}\{english\}-Umgebung: \begin{hyphenrules}{english}This is just filler text.\end{hyphenrules}

Auch der nächste Querverweis wird korrekt auf deutsch gesetzt: Siehe \vref{chap:erstes}.

Ein Satz in einer \{otherlanguage\}\{english\}-Umgebung: \begin{otherlanguage}{english}This is just filler text.\end{otherlanguage}

Und auch der nun folgende Querverweis wird korrekt auf deutsch gesetzt: Siehe \vref{chap:erstes}.

Ein Satz in einer \{otherlanguage*\}\{english\}-Umgebung: \begin{otherlanguage*}{english}This is just filler text.\end{otherlanguage*}

Der nächste Querverweis wird teils auf englisch, teils auf deutsch gesetzt: Siehe \vref{chap:erstes}.
\end{document}


Ergebnis: Der Fehler tritt auch ohne csquotes auf. Nach der otherlanguage*-Umgebung setzt cleveref Querverweise gemischtsprachig. Somit ist entweder irgendetwas in dieser Umgebung (d.h. in babel) nicht korrekt implementiert, oder aber cleveref testet nicht sauber, welche Sprache nach dieser Umgebung gilt. Letzteres würde auch erklären, warum der von varioref stammende Teil des Querverweises sehr wohl in deutsch gesetzt wird.

An dieser Stelle ersuche ich wieder die ExpertInnen (mechanicus!), zu übernehmen.

lockstep

mechanicus
28-10-2009, 08:50
Hi,

probiere mal folgendes aus:

\documentclass[openany,parskip=half]{scrbook}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[english,ngerman]{babel}

\usepackage[english,ngerman]{varioref}
\usepackage[english,ngerman]{cleveref}


\makeatletter
\expandafter\def\csname otherlanguage*\endcsname#1{%
\begingroup\foreign@language{#1}%
}
\expandafter\def\csname endotherlanguage*\endcsname{%
\csname noextras\languagename\endcsname
\endgroup\expandafter\selectlanguage\expandafter{\ languagename}
}
\makeatother

\begin{document}

\chapter{Das erste Kapitel}
\label{chap:erstes}

Dieser Satz ist nur ein Platzhalter.

\chapter{Das zweite Kapitel}
Zunächst ein korrekt auf deutsch gesetzter Querverweis: Siehe \vref{chap:erstes}.

Ein Satz in einer \{hyphenrules\}\{english\}-Umgebung: \begin{hyphenrules}{english}This is just filler text.\end{hyphenrules}

Auch der nächste Querverweis wird korrekt auf deutsch gesetzt: Siehe \vref{chap:erstes}.

Ein Satz in einer \{otherlanguage\}\{english\}-Umgebung: \begin{otherlanguage}{english}This is just filler text.\end{otherlanguage}

Und auch der nun folgende Querverweis wird korrekt auf deutsch gesetzt: Siehe \vref{chap:erstes}.

Ein Satz in einer \{otherlanguage*\}\{english\}-Umgebung: \begin{otherlanguage*}{english}This is just filler text.\end{otherlanguage*}


Der nächste Querverweis wird teils auf englisch, teils auf deutsch gesetzt: Siehe \vref{chap:erstes}.
\end{document}

vielleicht hilft das schon.

Gruß
Marco

lockstep
30-10-2009, 15:38
Vielen Dank für den neuen Hack, mechanicus - funktioniert für mich. Damit das ganze nicht nur für die otherlanguage*-Umgebung, sondern auch für \foreignlanguage passt, habe ich noch folgendes ergänzt:



\makeatletter
\def\foreignlanguage{\protect\csname foreignlanguage \endcsname}
\expandafter\def\csname foreignlanguage \endcsname#1#2{%
\begingroup
\originalTeX
\foreign@language{#1}%
#2%
\csname noextras#1\endcsname
\endgroup\expandafter\selectlanguage\expandafter{\ languagename}% GEÄNDERT
}
\makeatother


Was ich immer noch nicht verstehe ist, warum es hilft, explizit wieder auf die Hauptsprache zu schalten, wenn die babel-Umgebungen und -Befehle ohnehin nur innerhalb einer Gruppe auf andere Sprachen umschalten. Allerdings sieht mir nach einem Blick in die cleveref-Dokumentation (S. 80 f) das Zusammenspiel zwischen cleveref und babel ... sagen wir mal, durchaus fehleranfällig aus. Wie gesagt: Eine Gelegenheit, sich in LaTeX-Programmierung schlauer zu machen.

lockstep

EDIT: Peinlichen Grammatikfehler beseitigt.

lockstep
14-06-2010, 21:51
Mit knapp achtmonatiger Verspätung habe ich mich doch dazu aufgerafft, den Bug samt Workaround von mechanicus in ein Minimalbeispiel zusammenzufassen (siehe unten) und einen Bugreport an Toby Cubitt, den Autor von cleveref zu senden.



\documentclass[german,english]{report}

\usepackage{babel,varioref,cleveref}

\parindent 0pt
\parskip 10pt

\begin{document}

\chapter{The first chapter}
\label{chap:first}

Some text.

\chapter{The second chapter}

A cross-reference correctly typeset in English: See \vref{chap:first}.

Text within a \verb={hyphenrules}{german}=-environment: %
\begin{hyphenrules}{german}Ein bisschen Text.\end{hyphenrules}

A cross-reference correctly typeset in English: See \vref{chap:first}.

Text within an \verb={otherlanguage}{german}=-environment: %
\begin{otherlanguage}{german}Ein bisschen Text.\end{otherlanguage}

A cross-reference correctly typeset in English: See \vref{chap:first}.

Text within an \verb={otherlanguage*}{german}=-environment: %
\begin{otherlanguage*}{german}Ein bisschen Text.\end{otherlanguage*}

A cross-reference typeset partly in German, partly in English: %
See \vref{chap:first}.

Text with \verb=\foreignlanguage{german}=: %
\foreignlanguage{german}{Ein bisschen Text.}

A cross-reference typeset partly in German, partly in English: %
See \vref{chap:first}.

\end{document}

% Move these modified babel commands to the preamble
% to correct the switching of languages
\makeatletter
\expandafter\def\csname otherlanguage*\endcsname#1{%
\begingroup% NEW
\foreign@language{#1}%
}
\expandafter\def\csname endotherlanguage*\endcsname{%
\csname noextras\languagename\endcsname
\endgroup% NEW
\expandafter\selectlanguage\expandafter{\languagen ame}% NEW
}
\def\foreignlanguage{\protect\csname foreignlanguage \endcsname}
\expandafter\def\csname foreignlanguage \endcsname#1#2{%
\begingroup
\originalTeX
\foreign@language{#1}%
#2%
\csname noextras#1\endcsname
\endgroup
\expandafter\selectlanguage\expandafter{\languagen ame}% NEW
}
\makeatother


lockstep

u_fischer
15-06-2010, 11:05
Das ist kein Babelbug. Das Problem ist, dass cleverref seine "Namen" global ändert:


\documentclass[german,english]{report}

\usepackage{babel}
\usepackage{cleveref}

\begin{document}
\makeatletter
\chaptername, \cref@chapter@name

{\extrasgerman \chaptername, \cref@chapter@name}

\chaptername, \cref@chapter@name

\end{document}


Btw.: Das hat zwar mit diesem Problem hier nichts zu tun, aber cleverref schreibt an einigen Stellen \forreign@language statt \foreign@language

lockstep
15-06-2010, 13:20
Das ist kein Babelbug. Das Problem ist, dass cleverref seine "Namen" global ändert:

Gut, dass ich den Bugreport nicht an Johannes Braams geschickt habe. ;) Vielen Dank jedenfalls, dass du die Fehlerursache so rasch ausfindig gemacht hast - da sollte dem cleveref-Autor die Korrektur nicht schwerfallen.


Btw.: Das hat zwar mit diesem Problem hier nichts zu tun, aber cleverref schreibt an einigen Stellen \forreign@language statt \foreign@language

Ich werde einen entsprechenden Bugreport übermitteln.

lockstep

lockstep
15-06-2010, 18:03
Das ist kein Babelbug. Das Problem ist, dass cleverref seine "Namen" global ändert:

Habe heute ein e-mail erhalten, in dem Toby Cubitt Ulrikes Meinung teilt und gleich eine korrigierte Version von cleveref mitschickt. Der Bug ist beseitigt. :D Ich habe noch die von Ulrike entdeckten Tippfehler (forreign statt foreign) gemeldet - diese betreffen die poorman-Option und fallen daher im cleveref-"Normalbetrieb" nicht auf. Version 0.17.1 sollte in Kürze auf CTAN bereitstehen.

lockstep