Anzeige:
Ergebnis 1 bis 15 von 15

Thema: Fehler im Zusammenspiel von babel, csquotes und cleveref?

  1. #1
    Registrierter Benutzer Avatar von lockstep
    Registriert seit
    31.08.2008
    Beiträge
    1.487

    Fehler im Zusammenspiel von babel, csquotes und cleveref?

    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:
    Code:
    \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?

  2. #2
    Registrierter Benutzer Avatar von mechanicus
    Registriert seit
    10.07.2008
    Ort
    Hamburg
    Beiträge
    3.944
    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

    Code:
    \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

  3. #3
    Registrierter Benutzer Avatar von lockstep
    Registriert seit
    31.08.2008
    Beiträge
    1.487
    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

  4. #4
    Registrierter Benutzer Avatar von mechanicus
    Registriert seit
    10.07.2008
    Ort
    Hamburg
    Beiträge
    3.944
    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

  5. #5
    Registrierter Benutzer Avatar von lockstep
    Registriert seit
    31.08.2008
    Beiträge
    1.487
    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

  6. #6
    Registrierter Benutzer Avatar von mechanicus
    Registriert seit
    10.07.2008
    Ort
    Hamburg
    Beiträge
    3.944
    Hi,

    das sollte allgemein Funktionieren:
    Code:
    \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\expandafter{\languagename}}
    \long\def\csq@@@@quote@ii#1#2{%
      \csq@bqgroup #1\csq@iqopen@i #2\csq@qclose\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 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

  7. #7
    Registrierter Benutzer Avatar von mechanicus
    Registriert seit
    10.07.2008
    Ort
    Hamburg
    Beiträge
    3.944
    Hi,

    Nachtrag: Bei Verwendung von KOMO oder scrbase klappt scheinbar auch:
    Code:
    \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\selectlanguage\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

  8. #8
    Registrierter Benutzer Avatar von lockstep
    Registriert seit
    31.08.2008
    Beiträge
    1.487
    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

  9. #9
    Registrierter Benutzer Avatar von lockstep
    Registriert seit
    31.08.2008
    Beiträge
    1.487
    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.

    Code:
    \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

  10. #10
    Registrierter Benutzer Avatar von mechanicus
    Registriert seit
    10.07.2008
    Ort
    Hamburg
    Beiträge
    3.944
    Hi,

    probiere mal folgendes aus:
    Code:
    \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

  11. #11
    Registrierter Benutzer Avatar von lockstep
    Registriert seit
    31.08.2008
    Beiträge
    1.487
    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:

    Code:
    \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.
    Geändert von lockstep (30-10-2009 um 17:38 Uhr)

  12. #12
    Registrierter Benutzer Avatar von lockstep
    Registriert seit
    31.08.2008
    Beiträge
    1.487
    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.

    Code:
    \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{\languagename}% 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{\languagename}% NEW
    }
    \makeatother
    lockstep
    idxlayout - Konfigurierbares Index-Layout, kompatibel mit KOMA-Script und memoir

  13. #13
    Registrierter Benutzer
    Registriert seit
    19.05.2009
    Beiträge
    4.045
    Das ist kein Babelbug. Das Problem ist, dass cleverref seine "Namen" global ändert:

    Code:
    \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

  14. #14
    Registrierter Benutzer Avatar von lockstep
    Registriert seit
    31.08.2008
    Beiträge
    1.487
    Zitat Zitat von u_fischer Beitrag anzeigen
    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.

    Zitat Zitat von u_fischer Beitrag anzeigen
    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
    idxlayout - Konfigurierbares Index-Layout, kompatibel mit KOMA-Script und memoir

  15. #15
    Registrierter Benutzer Avatar von lockstep
    Registriert seit
    31.08.2008
    Beiträge
    1.487
    Zitat Zitat von u_fischer Beitrag anzeigen
    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. 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
    idxlayout - Konfigurierbares Index-Layout, kompatibel mit KOMA-Script und memoir

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •